diff --git a/.talismanrc b/.talismanrc index ffec31b23..adeab6fc8 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,46 +1,4 @@ fileignoreconfig: - - filename: packages/contentstack-query-export/.env-example - checksum: 922c7aa9c788ab60b987de2b0a2aee6d90843c463a8bbc29201e4efe31081187 - - filename: packages/contentstack-query-export/.eslintrc - checksum: b34756122b251dc2feedc7c7b98a7772d4d763bc468c8291be483ae2ac3471be - - filename: packages/contentstack-query-export/README.md - checksum: 9be27e9a5f027f2bbbbcc6d4c706b19071cf40f596ce3e778f33ea7579a52626 - - filename: packages/contentstack-query-export/test/unit/common-helper.test.ts - checksum: c1d023d8c23e0400805448eb1466da5cb1fe891b6e838100fb12cbc7e1514a59 - - filename: packages/contentstack-query-export/test/config.json - checksum: 792e177efa078e31aa05a5136807fd1fed4b6ea7a4cd44d69353edd8b96ff33f - - filename: packages/contentstack-query-export/src/utils/logger.ts - checksum: de6dd816bc534aaddf9adbe4e1db935f152d32eedaad5b76445f4affa836fcc9 - - filename: packages/contentstack-query-export/src/utils/common-helper.ts - checksum: 924a9fbc57dd774a7957870d63366ffc16cd4242dbe684321b9b52a888cfa455 - - filename: packages/contentstack-query-export/test/unit/content-type-helper.test.ts - checksum: 1b4b9724a1281032605b61f007f7a7da080731bd9e0e4b2c4bc00b212ff30242 - - filename: packages/contentstack-query-export/src/commands/cm/stacks/export-query.ts - checksum: 874c30c717df26b8caae8f807b25b529f9704de9b93ef53d457a3a9575742cf4 - - filename: packages/contentstack-query-export/skills/framework/SKILL.md - checksum: b45c4bc28025292c168053e95a3c570b9d67500e0ee5241553089bca6914bb3f - - filename: packages/contentstack-query-export/skills/code-review/SKILL.md - checksum: 1c1cb0b1ce20114b9e855278a63c098d87f9302f093b08eb7f05f667840b6166 - - filename: packages/contentstack-query-export/src/types/index.ts - checksum: 686c5ed7fadb6620201dc3f1ed19c5ba94afd73ad165c33379b8b33dec81e519 - - filename: packages/contentstack-query-export/src/utils/config-handler.ts - checksum: 2a17dfe46ff5e77bb585013719065db0b513b21d700eb54e6615e78a6811f885 - - filename: packages/contentstack-query-export/src/utils/dependency-resolver.ts - checksum: 0c85da2a6fa43c8923c3659c45b02d8cf4cf43f6aae5e21e5b47955232dd5d78 - - filename: packages/contentstack-query-export/test/unit/module-exporter.test.ts - checksum: e27fab52e65a8d5430d268f3562a823828e9e3dd9eb9569342f1cdb83eef9ea3 - - filename: packages/contentstack-query-export/test/unit/query-parser-simple.test.ts - checksum: d187ad885a914b70406e343a92ad3ee1ca3c30207b0d8b040f36c6f287da3a6c - - filename: packages/contentstack-query-export/test/unit/dependency-resolver.test.ts - checksum: da6b003331ece39c106b61f0c660da678c7b2ca2f55cfbdd2a8f8a72c183573f - - filename: packages/contentstack-query-export/test/unit/config-handler.test.ts - checksum: a1077cb686431fea29de839762dbc16c951b6d61171f525e311e4a34182b0d08 - - filename: packages/contentstack-query-export/test/unit/referenced-asset-handler.test.ts - checksum: 3d19ad04a0306be741f9acd3a2d164d19e2b3803efc0a50342b156e8686c8b0c - - filename: packages/contentstack-query-export/src/core/query-executor.ts - checksum: 266751e299cda2a15d5e4e551eca72bcd6f0d600a0416f95410560257fc8210f - - filename: packages/contentstack-query-export/test/unit/query-executor.test.ts - checksum: 86713d035ff35d13089e14e8ad84db4191ad8b4f85bb759282b75e3dc96966cb - filename: pnpm-lock.yaml - checksum: 66cc4bd169899eb1641197c1a95f50910c34601b0a695c23f0c2e6d26f836651 + checksum: 97c02af1c210f0a8d5486ec114746856c96209132b973199cfed33de8461965c version: '1.0' diff --git a/packages/contentstack-bootstrap/package.json b/packages/contentstack-bootstrap/package.json index 9921f5db7..4720bcf0d 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": "1.19.2", + "version": "1.19.3", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "scripts": { @@ -16,7 +16,7 @@ "test:report": "nyc --reporter=lcov mocha \"test/**/*.test.js\"" }, "dependencies": { - "@contentstack/cli-cm-seed": "~1.15.2", + "@contentstack/cli-cm-seed": "~1.15.3", "@contentstack/cli-command": "~1.8.2", "@contentstack/cli-config": "~1.20.3", "@contentstack/cli-utilities": "~1.18.3", @@ -69,4 +69,4 @@ } }, "repository": "contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-clone/package.json b/packages/contentstack-clone/package.json index becf4bcd7..1483e2942 100644 --- a/packages/contentstack-clone/package.json +++ b/packages/contentstack-clone/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-clone", "description": "Contentstack stack clone plugin", - "version": "1.21.3", + "version": "1.21.4", "author": "Contentstack", "bugs": "https://github.com/rohitmishra209/cli-cm-clone/issues", "dependencies": { "@colors/colors": "^1.6.0", - "@contentstack/cli-cm-export": "~1.24.3", - "@contentstack/cli-cm-import": "~1.32.3", + "@contentstack/cli-cm-export": "~1.25.0", + "@contentstack/cli-cm-import": "~1.33.0", "@contentstack/cli-command": "~1.8.2", "@contentstack/cli-utilities": "~1.18.3", "@oclif/core": "^4.10.5", @@ -81,4 +81,4 @@ "cm:stack-clone": "O-CLN" } } -} +} \ No newline at end of file diff --git a/packages/contentstack-export/package.json b/packages/contentstack-export/package.json index 2b60c97a3..2cf376cc5 100644 --- a/packages/contentstack-export/package.json +++ b/packages/contentstack-export/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-export", "description": "Contentstack CLI plugin to export content from stack", - "version": "1.24.3", + "version": "1.25.0", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { "@contentstack/cli-command": "~1.8.2", "@oclif/core": "^4.10.5", - "@contentstack/cli-variants": "~1.4.3", + "@contentstack/cli-variants": "~1.5.0", "@contentstack/cli-utilities": "~1.18.3", "async": "^3.2.6", "big-json": "^3.2.0", @@ -97,4 +97,4 @@ } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-export/src/config/index.ts b/packages/contentstack-export/src/config/index.ts index 85aa028fa..e3c4d12a2 100644 --- a/packages/contentstack-export/src/config/index.ts +++ b/packages/contentstack-export/src/config/index.ts @@ -36,6 +36,7 @@ const config: DefaultConfig = { 'content-types', 'custom-roles', 'workflows', + 'publishing-rules', 'personalize', 'entries', 'labels', @@ -86,6 +87,11 @@ const config: DefaultConfig = { fileName: 'workflows.json', invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], + }, globalfields: { dirName: 'global_fields', fileName: 'globalfields.json', diff --git a/packages/contentstack-export/src/export/modules/publishing-rules.ts b/packages/contentstack-export/src/export/modules/publishing-rules.ts new file mode 100644 index 000000000..483189994 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/publishing-rules.ts @@ -0,0 +1,86 @@ +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; +import { handleAndLogError, log } from '@contentstack/cli-utilities'; + +import BaseClass from './base-class'; +import { fsUtil } from '../../utils'; +import { PublishingRulesConfig, ModuleClassParams } from '../../types'; + +export default class ExportPublishingRules extends BaseClass { + private readonly publishingRules: Record> = {}; + private readonly publishingRulesConfig: PublishingRulesConfig; + private publishingRulesFolderPath: string; + private readonly qs: { include_count: boolean; skip?: number }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.publishingRulesConfig = exportConfig.modules['publishing-rules']; + this.qs = { include_count: true }; + this.exportConfig.context.module = 'publishing-rules'; + } + + async start(): Promise { + this.publishingRulesFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.publishingRulesConfig.dirName, + ); + log.debug(`Publishing rules folder path: ${this.publishingRulesFolderPath}`, this.exportConfig.context); + + await fsUtil.makeDirectory(this.publishingRulesFolderPath); + log.debug('Created publishing rules directory', this.exportConfig.context); + + await this.fetchAllPublishingRules(); + + if (isEmpty(this.publishingRules)) { + log.info('No Publishing Rules found', this.exportConfig.context); + return; + } + + const outPath = pResolve(this.publishingRulesFolderPath, this.publishingRulesConfig.fileName); + fsUtil.writeFile(outPath, this.publishingRules); + log.success( + `Publishing rules exported successfully! Total count: ${Object.keys(this.publishingRules).length}`, + this.exportConfig.context, + ); + } + + private async fetchAllPublishingRules(skip = 0): Promise { + try { + if (skip > 0) { + this.qs.skip = skip; + } + + const data: { items?: Record[]; count?: number } = await this.stack + .workflow() + .publishRule() + .fetchAll(this.qs); + + const items = data.items ?? []; + const total = data.count ?? items.length; + + if (!items.length) { + log.debug('No publishing rules returned for this page', this.exportConfig.context); + return; + } + + for (const rule of items) { + const uid = rule.uid as string | undefined; + if (uid) { + this.publishingRules[uid] = omit(rule, this.publishingRulesConfig.invalidKeys) as Record< + string, + unknown + >; + } + } + + const nextSkip = skip + items.length; + if (nextSkip < total) { + await this.fetchAllPublishingRules(nextSkip); + } + } catch (error: unknown) { + handleAndLogError(error as Error, { ...this.exportConfig.context }); + } + } +} diff --git a/packages/contentstack-export/src/types/default-config.ts b/packages/contentstack-export/src/types/default-config.ts index 12090760c..01cb84c89 100644 --- a/packages/contentstack-export/src/types/default-config.ts +++ b/packages/contentstack-export/src/types/default-config.ts @@ -67,6 +67,13 @@ export default interface DefaultConfig { invalidKeys: string[]; dependencies?: Modules[]; }; + 'publishing-rules': { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + limit?: number; + }; globalfields: { dirName: string; fileName: string; diff --git a/packages/contentstack-export/src/types/index.ts b/packages/contentstack-export/src/types/index.ts index ec2118510..fd13364a5 100644 --- a/packages/contentstack-export/src/types/index.ts +++ b/packages/contentstack-export/src/types/index.ts @@ -46,6 +46,7 @@ export type Modules = | 'content-types' | 'custom-roles' | 'workflows' + | 'publishing-rules' | 'labels' | 'marketplace-apps' | 'taxonomies' @@ -117,6 +118,14 @@ export interface WorkflowConfig { limit?: number; } +export interface PublishingRulesConfig { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + limit?: number; +} + export interface CustomRoleConfig { dirName: string; fileName: string; diff --git a/packages/contentstack-export/test/unit/export/modules/assets.test.ts b/packages/contentstack-export/test/unit/export/modules/assets.test.ts index 56ef04ef7..5509682a4 100644 --- a/packages/contentstack-export/test/unit/export/modules/assets.test.ts +++ b/packages/contentstack-export/test/unit/export/modules/assets.test.ts @@ -15,10 +15,10 @@ describe('ExportAssets', () => { asset: sinon.stub().returns({ query: sinon.stub().returns({ find: sinon.stub().resolves({ items: mockData.findData.items }), - count: sinon.stub().resolves(mockData.countData) + count: sinon.stub().resolves(mockData.countData), }), - download: sinon.stub().resolves({ data: 'stream-data' }) - }) + download: sinon.stub().resolves({ data: 'stream-data' }), + }), }; mockExportConfig = { @@ -37,7 +37,7 @@ describe('ExportAssets', () => { sessionId: 'session-123', apiKey: 'test-api-key', orgId: 'org-123', - authenticationMethod: 'Basic Auth' + authenticationMethod: 'Basic Auth', }, cliLogsPath: '/test/logs', forceStopMarketplaceAppsPrompt: false, @@ -46,7 +46,7 @@ describe('ExportAssets', () => { name: 'us', cma: 'https://api.contentstack.io', cda: 'https://cdn.contentstack.io', - uiHost: 'https://app.contentstack.com' + uiHost: 'https://app.contentstack.com', }, skipStackSettings: false, skipDependencies: false, @@ -63,7 +63,7 @@ describe('ExportAssets', () => { users: '', extension: '', webhooks: '', - stacks: '' + stacks: '', }, preserveStackVersion: false, personalizationEnabled: false, @@ -77,51 +77,56 @@ describe('ExportAssets', () => { locales: { dirName: 'locales', fileName: 'locales.json', - requiredKeys: ['code'] + requiredKeys: ['code'], }, customRoles: { dirName: 'custom_roles', fileName: 'custom_roles.json', - customRolesLocalesFileName: '' + customRolesLocalesFileName: '', }, 'custom-roles': { dirName: 'custom_roles', fileName: 'custom_roles.json', - customRolesLocalesFileName: '' + customRolesLocalesFileName: '', }, environments: { dirName: 'environments', - fileName: 'environments.json' + fileName: 'environments.json', }, labels: { dirName: 'labels', fileName: 'labels.json', - invalidKeys: [] + invalidKeys: [], }, webhooks: { dirName: 'webhooks', - fileName: 'webhooks.json' + fileName: 'webhooks.json', }, releases: { dirName: 'releases', fileName: 'releases.json', releasesList: 'releases_list.json', - invalidKeys: [] + invalidKeys: [], }, workflows: { dirName: 'workflows', fileName: 'workflows.json', - invalidKeys: [] + invalidKeys: [], + }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: [], }, globalfields: { dirName: 'global_fields', fileName: 'globalfields.json', - validKeys: ['title', 'uid'] + validKeys: ['title', 'uid'], }, 'global-fields': { dirName: 'global_fields', fileName: 'globalfields.json', - validKeys: ['title', 'uid'] + validKeys: ['title', 'uid'], }, assets: { dirName: 'assets', @@ -136,19 +141,19 @@ describe('ExportAssets', () => { securedAssets: false, displayExecutionTime: false, enableDownloadStatus: false, - includeVersionedAssets: false + includeVersionedAssets: false, }, content_types: { dirName: 'content_types', fileName: 'content_types.json', validKeys: ['title', 'uid'], - limit: 100 + limit: 100, }, 'content-types': { dirName: 'content_types', fileName: 'content_types.json', validKeys: ['title', 'uid'], - limit: 100 + limit: 100, }, entries: { dirName: 'entries', @@ -157,76 +162,76 @@ describe('ExportAssets', () => { batchLimit: 100, downloadLimit: 5, limit: 100, - exportVersions: false + exportVersions: false, }, personalize: { dirName: 'personalize', - baseURL: {} + baseURL: {}, }, variantEntry: { dirName: 'variant_entries', fileName: 'variant_entries.json', chunkFileSize: 5, - query: { skip: 0, limit: 100, include_variant: true, include_count: false, include_publish_details: true } + query: { skip: 0, limit: 100, include_variant: true, include_count: false, include_publish_details: true }, }, extensions: { dirName: 'extensions', - fileName: 'extensions.json' + fileName: 'extensions.json', }, stack: { dirName: 'stack', - fileName: 'stack.json' + fileName: 'stack.json', }, dependency: { - entries: [] + entries: [], }, marketplace_apps: { dirName: 'marketplace_apps', - fileName: 'marketplace_apps.json' + fileName: 'marketplace_apps.json', }, 'marketplace-apps': { dirName: 'marketplace_apps', - fileName: 'marketplace_apps.json' + fileName: 'marketplace_apps.json', }, masterLocale: { dirName: 'master_locale', fileName: 'master_locale.json', - requiredKeys: ['code'] + requiredKeys: ['code'], }, taxonomies: { dirName: 'taxonomies', fileName: 'taxonomies.json', invalidKeys: [], - limit: 100 + limit: 100, }, events: { dirName: 'events', fileName: 'events.json', - invalidKeys: [] + invalidKeys: [], }, audiences: { dirName: 'audiences', fileName: 'audiences.json', - invalidKeys: [] + invalidKeys: [], }, attributes: { dirName: 'attributes', fileName: 'attributes.json', - invalidKeys: [] + invalidKeys: [], }, 'composable-studio': { dirName: 'composable_studio', fileName: 'composable_studio.json', apiBaseUrl: 'https://api.contentstack.io', - apiVersion: 'v3' - } - } + apiVersion: 'v3', + }, + }, } as ExportConfig; exportAssets = new ExportAssets({ exportConfig: mockExportConfig, stackAPIClient: mockStackClient, - moduleName: 'assets' + moduleName: 'assets', }); }); @@ -281,11 +286,7 @@ describe('ExportAssets', () => { downloadAssetsStub = sinon.stub(exportAssets, 'downloadAssets'); getVersionedAssetsStub = sinon.stub(exportAssets, 'getVersionedAssets'); - getAssetsCountStub - .withArgs(false) - .resolves(10) - .withArgs(true) - .resolves(5); + getAssetsCountStub.withArgs(false).resolves(10).withArgs(true).resolves(5); }); afterEach(() => { @@ -310,7 +311,7 @@ describe('ExportAssets', () => { it('should export versioned assets when enabled', async () => { mockExportConfig.modules.assets.includeVersionedAssets = true; exportAssets.versionedAssets = [{ 'asset-1': 2 }]; - + // Just verify the flow completes await exportAssets.start(); @@ -345,8 +346,8 @@ describe('ExportAssets', () => { it('should handle errors gracefully', async () => { mockStackClient.asset = sinon.stub().returns({ query: sinon.stub().returns({ - count: sinon.stub().rejects(new Error('API Error')) - }) + count: sinon.stub().rejects(new Error('API Error')), + }), }); const count = await exportAssets.getAssetsCount(false); @@ -487,7 +488,7 @@ describe('ExportAssets', () => { it('should handle onReject callback for versioned assets errors', async () => { exportAssets.versionedAssets = [{ 'asset-1': 2 }]; - + makeConcurrentCallStub.callsFake(async (options: any) => { const onReject = options.apiParams.reject; const error = new Error('Versioned asset query failed'); @@ -498,7 +499,6 @@ describe('ExportAssets', () => { await exportAssets.getVersionedAssets(); expect(makeConcurrentCallStub.called).to.be.true; }); - }); describe('downloadAssets() method', () => { @@ -538,7 +538,7 @@ describe('ExportAssets', () => { it('should include versioned assets when enabled', async () => { mockExportConfig.modules.assets.includeVersionedAssets = true; - + await exportAssets.downloadAssets(); // Should complete without error @@ -547,7 +547,7 @@ describe('ExportAssets', () => { it('should handle download with secured assets', async () => { mockExportConfig.modules.assets.securedAssets = true; - + await exportAssets.downloadAssets(); expect(makeConcurrentCallStub.called).to.be.true; @@ -555,7 +555,7 @@ describe('ExportAssets', () => { it('should handle download with enabled status', async () => { mockExportConfig.modules.assets.enableDownloadStatus = true; - + makeConcurrentCallStub.callsFake(async (options: any, handler: any) => { expect(options.totalCount).to.be.greaterThan(0); }); @@ -588,7 +588,7 @@ describe('ExportAssets', () => { it('should handle versioned assets with version 1 only', async () => { exportAssets.versionedAssets = []; - + const result = await exportAssets.getVersionedAssets(); // Should complete without errors expect(result).to.be.undefined; @@ -619,14 +619,14 @@ describe('ExportAssets', () => { const assetsWithDuplicates = { 'file-1': [ { uid: '1', url: 'same-url', filename: 'test.jpg' }, - { uid: '2', url: 'same-url', filename: 'test.jpg' } - ] + { uid: '2', url: 'same-url', filename: 'test.jpg' }, + ], }; sinon.stub(FsUtility.prototype, 'getPlainMeta').returns(assetsWithDuplicates); const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); await exportAssets.downloadAssets(); - + // Should only download unique assets sinon.restore(); }); @@ -634,26 +634,26 @@ describe('ExportAssets', () => { it('should handle download assets with versioned metadata', async () => { mockExportConfig.modules.assets.includeVersionedAssets = true; (exportAssets as any).assetsRootPath = '/test/data/assets'; - + const mainAssets = { 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }] }; const versionedAssets = { 'file-2': [{ uid: '2', url: 'url2', filename: 'version.jpg' }] }; - + const getPlainMetaStub = sinon.stub(FsUtility.prototype, 'getPlainMeta'); getPlainMetaStub.onFirstCall().returns(mainAssets); getPlainMetaStub.onSecondCall().returns(versionedAssets); - + // Mock getDirectories to return empty array to avoid fs operations sinon.stub(exportAssets as any, 'assetsRootPath').get(() => '/test/data/assets'); const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + // Create a simple mock for getDirectories behavior const fsInstance: any = { getPlainMeta: getPlainMetaStub, - createFolderIfNotExist: () => {} + createFolderIfNotExist: () => {}, }; - + await exportAssets.downloadAssets(); - + expect(makeConcurrentCallStub.called).to.be.true; sinon.restore(); }); @@ -675,11 +675,11 @@ describe('ExportAssets', () => { it('should handle assets with no items response', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; - + // Stub FsUtility methods sinon.stub(FsUtility.prototype, 'writeIntoFile').resolves(); sinon.stub(FsUtility.prototype, 'completeFile').resolves(); - + makeConcurrentCallStub.callsFake(async (options: any) => { const onSuccess = options.apiParams.resolve; onSuccess({ response: { items: [] } }); @@ -692,22 +692,22 @@ describe('ExportAssets', () => { it('should handle assets with versioned assets enabled', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; mockExportConfig.modules.assets.includeVersionedAssets = true; - + // Stub FsUtility methods to prevent fs operations sinon.stub(FsUtility.prototype, 'writeIntoFile').resolves(); sinon.stub(FsUtility.prototype, 'completeFile').resolves(); sinon.stub(FsUtility.prototype, 'createFolderIfNotExist').resolves(); - + makeConcurrentCallStub.callsFake(async (options: any) => { const onSuccess = options.apiParams.resolve; // Mock versioned assets - onSuccess({ - response: { + onSuccess({ + response: { items: [ { uid: '1', _version: 2, url: 'url1', filename: 'test.jpg' }, - { uid: '2', _version: 1, url: 'url2', filename: 'test2.jpg' } - ] - } + { uid: '2', _version: 1, url: 'url2', filename: 'test2.jpg' }, + ], + }, }); }); @@ -718,12 +718,12 @@ describe('ExportAssets', () => { it('should apply query filters when configured', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; mockExportConfig.modules.assets.invalidKeys = ['SYS_ACL']; - + // Stub FsUtility methods to prevent fs operations sinon.stub(FsUtility.prototype, 'writeIntoFile').resolves(); sinon.stub(FsUtility.prototype, 'completeFile').resolves(); sinon.stub(FsUtility.prototype, 'createFolderIfNotExist').resolves(); - + makeConcurrentCallStub.callsFake(async (options: any) => { const onSuccess = options.apiParams.resolve; onSuccess({ response: { items: [{ uid: '1', url: 'url1', filename: 'test.jpg' }] } }); @@ -738,7 +738,7 @@ describe('ExportAssets', () => { it('should handle folders with empty items response', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + makeConcurrentCallStub.callsFake(async (options: any) => { const onSuccess = options.apiParams.resolve; onSuccess({ response: { items: [] } }); @@ -746,19 +746,19 @@ describe('ExportAssets', () => { await exportAssets.getAssetsFolders(10); expect(makeConcurrentCallStub.called).to.be.true; - + makeConcurrentCallStub.restore(); }); it('should add folders to assetsFolder array', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; - + const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + // Stub FsUtility methods to prevent file system operations sinon.stub(FsUtility.prototype, 'writeFile').resolves(); sinon.stub(FsUtility.prototype, 'createFolderIfNotExist').resolves(); - + makeConcurrentCallStub.callsFake(async (options: any) => { const onSuccess = options.apiParams.resolve; // Simulate adding folders to the array @@ -767,11 +767,11 @@ describe('ExportAssets', () => { }); await exportAssets.getAssetsFolders(10); - + expect(makeConcurrentCallStub.called).to.be.true; // Verify folders were added expect((exportAssets as any).assetsFolder.length).to.be.greaterThan(0); - + makeConcurrentCallStub.restore(); }); }); @@ -780,14 +780,14 @@ describe('ExportAssets', () => { it('should handle download with secured assets', async () => { mockExportConfig.modules.assets.securedAssets = true; (exportAssets as any).assetsRootPath = '/test/data/assets'; - + const getPlainMetaStub = sinon.stub(FsUtility.prototype, 'getPlainMeta').returns({ - 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }] + 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }], }); const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + await exportAssets.downloadAssets(); - + expect(makeConcurrentCallStub.called).to.be.true; getPlainMetaStub.restore(); makeConcurrentCallStub.restore(); @@ -796,14 +796,14 @@ describe('ExportAssets', () => { it('should handle download with enableDownloadStatus', async () => { mockExportConfig.modules.assets.enableDownloadStatus = true; (exportAssets as any).assetsRootPath = '/test/data/assets'; - + const getPlainMetaStub = sinon.stub(FsUtility.prototype, 'getPlainMeta').returns({ - 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }] + 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }], }); const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + await exportAssets.downloadAssets(); - + expect(makeConcurrentCallStub.called).to.be.true; getPlainMetaStub.restore(); makeConcurrentCallStub.restore(); @@ -811,18 +811,17 @@ describe('ExportAssets', () => { it('should handle download with concurrent call structure', async () => { (exportAssets as any).assetsRootPath = '/test/data/assets'; - + const getPlainMetaStub = sinon.stub(FsUtility.prototype, 'getPlainMeta').returns({ - 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }] + 'file-1': [{ uid: '1', url: 'url1', filename: 'test.jpg' }], }); const makeConcurrentCallStub = sinon.stub(exportAssets as any, 'makeConcurrentCall').resolves(); - + await exportAssets.downloadAssets(); - + expect(makeConcurrentCallStub.called).to.be.true; getPlainMetaStub.restore(); makeConcurrentCallStub.restore(); }); }); }); - diff --git a/packages/contentstack-export/test/unit/export/modules/base-class.test.ts b/packages/contentstack-export/test/unit/export/modules/base-class.test.ts index 0ffe4187f..7fbdc6f74 100644 --- a/packages/contentstack-export/test/unit/export/modules/base-class.test.ts +++ b/packages/contentstack-export/test/unit/export/modules/base-class.test.ts @@ -23,20 +23,20 @@ describe('BaseClass', () => { fetch: sinon.stub().resolves({ uid: 'asset-123', title: 'Test Asset' }), query: sinon.stub().returns({ find: sinon.stub().resolves({ - items: [{ uid: 'asset-1' }, { uid: 'asset-2' }] - }) + items: [{ uid: 'asset-1' }, { uid: 'asset-2' }], + }), }), - download: sinon.stub().resolves({ data: 'stream-data' }) + download: sinon.stub().resolves({ data: 'stream-data' }), }), contentType: sinon.stub().returns({ - fetch: sinon.stub().resolves({ uid: 'ct-123' }) + fetch: sinon.stub().resolves({ uid: 'ct-123' }), }), entry: sinon.stub().returns({ - fetch: sinon.stub().resolves({ uid: 'entry-123' }) + fetch: sinon.stub().resolves({ uid: 'entry-123' }), }), taxonomy: sinon.stub().returns({ - export: sinon.stub().resolves({ data: 'taxonomy-export' }) - }) + export: sinon.stub().resolves({ data: 'taxonomy-export' }), + }), }; mockExportConfig = { @@ -55,7 +55,7 @@ describe('BaseClass', () => { sessionId: 'session-123', apiKey: 'test-api-key', orgId: 'org-123', - authenticationMethod: 'Basic Auth' + authenticationMethod: 'Basic Auth', }, cliLogsPath: '/test/logs', forceStopMarketplaceAppsPrompt: false, @@ -64,7 +64,7 @@ describe('BaseClass', () => { name: 'us', cma: 'https://api.contentstack.io', cda: 'https://cdn.contentstack.io', - uiHost: 'https://app.contentstack.com' + uiHost: 'https://app.contentstack.com', }, skipStackSettings: false, skipDependencies: false, @@ -81,7 +81,7 @@ describe('BaseClass', () => { users: '', extension: '', webhooks: '', - stacks: '' + stacks: '', }, preserveStackVersion: false, personalizationEnabled: false, @@ -95,51 +95,56 @@ describe('BaseClass', () => { locales: { dirName: 'locales', fileName: 'locales.json', - requiredKeys: ['code'] + requiredKeys: ['code'], }, customRoles: { dirName: 'custom_roles', fileName: 'custom_roles.json', - customRolesLocalesFileName: '' + customRolesLocalesFileName: '', }, 'custom-roles': { dirName: 'custom_roles', fileName: 'custom_roles.json', - customRolesLocalesFileName: '' + customRolesLocalesFileName: '', }, environments: { dirName: 'environments', - fileName: 'environments.json' + fileName: 'environments.json', }, labels: { dirName: 'labels', fileName: 'labels.json', - invalidKeys: [] + invalidKeys: [], }, webhooks: { dirName: 'webhooks', - fileName: 'webhooks.json' + fileName: 'webhooks.json', }, releases: { dirName: 'releases', fileName: 'releases.json', releasesList: 'releases_list.json', - invalidKeys: [] + invalidKeys: [], }, workflows: { dirName: 'workflows', fileName: 'workflows.json', - invalidKeys: [] + invalidKeys: [], + }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: [], }, globalfields: { dirName: 'global_fields', fileName: 'globalfields.json', - validKeys: ['title', 'uid'] + validKeys: ['title', 'uid'], }, 'global-fields': { dirName: 'global_fields', fileName: 'globalfields.json', - validKeys: ['title', 'uid'] + validKeys: ['title', 'uid'], }, assets: { dirName: 'assets', @@ -154,19 +159,19 @@ describe('BaseClass', () => { securedAssets: false, displayExecutionTime: false, enableDownloadStatus: false, - includeVersionedAssets: false + includeVersionedAssets: false, }, content_types: { dirName: 'content_types', fileName: 'content_types.json', validKeys: ['title', 'uid'], - limit: 100 + limit: 100, }, 'content-types': { dirName: 'content_types', fileName: 'content_types.json', validKeys: ['title', 'uid'], - limit: 100 + limit: 100, }, entries: { dirName: 'entries', @@ -175,75 +180,75 @@ describe('BaseClass', () => { batchLimit: 100, downloadLimit: 5, limit: 100, - exportVersions: false + exportVersions: false, }, personalize: { dirName: 'personalize', - baseURL: {} + baseURL: {}, }, variantEntry: { dirName: 'variant_entries', fileName: 'variant_entries.json', chunkFileSize: 5, - query: { skip: 0, limit: 100, include_variant: true, include_count: false, include_publish_details: true } + query: { skip: 0, limit: 100, include_variant: true, include_count: false, include_publish_details: true }, }, extensions: { dirName: 'extensions', - fileName: 'extensions.json' + fileName: 'extensions.json', }, stack: { dirName: 'stack', - fileName: 'stack.json' + fileName: 'stack.json', }, dependency: { - entries: [] + entries: [], }, marketplace_apps: { dirName: 'marketplace_apps', - fileName: 'marketplace_apps.json' + fileName: 'marketplace_apps.json', }, 'marketplace-apps': { dirName: 'marketplace_apps', - fileName: 'marketplace_apps.json' + fileName: 'marketplace_apps.json', }, masterLocale: { dirName: 'master_locale', fileName: 'master_locale.json', - requiredKeys: ['code'] + requiredKeys: ['code'], }, taxonomies: { dirName: 'taxonomies', fileName: 'taxonomies.json', invalidKeys: [], - limit: 100 + limit: 100, }, events: { dirName: 'events', fileName: 'events.json', - invalidKeys: [] + invalidKeys: [], }, audiences: { dirName: 'audiences', fileName: 'audiences.json', - invalidKeys: [] + invalidKeys: [], }, attributes: { dirName: 'attributes', fileName: 'attributes.json', - invalidKeys: [] + invalidKeys: [], }, 'composable-studio': { dirName: 'composable_studio', fileName: 'composable_studio.json', apiBaseUrl: 'https://api.contentstack.io', - apiVersion: 'v3' - } - } + apiVersion: 'v3', + }, + }, } as ExportConfig; testClass = new TestBaseClass({ exportConfig: mockExportConfig, - stackAPIClient: mockStackClient + stackAPIClient: mockStackClient, }); }); @@ -323,8 +328,8 @@ describe('BaseClass', () => { apiParams: { module: 'assets', resolve: sinon.stub(), - reject: sinon.stub() - } + reject: sinon.stub(), + }, }; await testClass.makeConcurrentCall(env); @@ -339,8 +344,8 @@ describe('BaseClass', () => { apiParams: { module: 'asset', resolve: sinon.stub(), - reject: sinon.stub() - } + reject: sinon.stub(), + }, }; const result = await testClass.makeConcurrentCall(env); @@ -356,7 +361,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 150, - concurrencyLimit: 5 + concurrencyLimit: 5, }; await testClass.makeConcurrentCall(env, customHandler); @@ -372,7 +377,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 300, - concurrencyLimit: 2 + concurrencyLimit: 2, }; await testClass.makeConcurrentCall(env, customHandler); @@ -384,7 +389,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 100, - concurrencyLimit: 10 + concurrencyLimit: 10, }; const result = await testClass.makeConcurrentCall(env); @@ -401,8 +406,8 @@ describe('BaseClass', () => { uid: 'asset-123', resolve: sinon.stub(), reject: sinon.stub(), - queryParam: {} - } + queryParam: {}, + }, }; await testClass.makeConcurrentCall(env); @@ -418,8 +423,8 @@ describe('BaseClass', () => { module: 'assets', resolve: sinon.stub(), reject: sinon.stub(), - queryParam: { skip: 0 } - } + queryParam: { skip: 0 }, + }, }; await testClass.makeConcurrentCall(env); @@ -436,8 +441,8 @@ describe('BaseClass', () => { url: 'https://example.com/asset.jpg', resolve: sinon.stub(), reject: sinon.stub(), - queryParam: {} - } + queryParam: {}, + }, }; await testClass.makeConcurrentCall(env); @@ -454,8 +459,8 @@ describe('BaseClass', () => { uid: 'taxonomy-123', resolve: sinon.stub(), reject: sinon.stub(), - queryParam: {} - } + queryParam: {}, + }, }; await testClass.makeConcurrentCall(env); @@ -466,7 +471,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 100, - concurrencyLimit: 5 + concurrencyLimit: 5, }; let isLastRequestValues: boolean[] = []; @@ -483,7 +488,7 @@ describe('BaseClass', () => { it('should handle API errors gracefully', async () => { const error = new Error('API Error'); mockStackClient.asset = sinon.stub().returns({ - fetch: sinon.stub().rejects(error) + fetch: sinon.stub().rejects(error), }); const env: EnvType = { @@ -497,8 +502,8 @@ describe('BaseClass', () => { reject: (error) => { expect(error.error).to.equal(error); }, - queryParam: {} - } + queryParam: {}, + }, }; await testClass.makeConcurrentCall(env); @@ -507,22 +512,22 @@ describe('BaseClass', () => { it('should provide correct batch and index information', async () => { const batchInfo: Array<{ batchIndex: number; index: number }> = []; - + const customHandler: CustomPromiseHandler = async (input) => { batchInfo.push({ batchIndex: input.batchIndex, - index: input.index + index: input.index, }); }; const env: EnvType = { module: 'test', totalCount: 250, - concurrencyLimit: 5 + concurrencyLimit: 5, }; await testClass.makeConcurrentCall(env, customHandler); - + // Verify batch and index information expect(batchInfo.length).to.be.greaterThan(0); expect(batchInfo[0]?.batchIndex).to.be.a('number'); @@ -541,37 +546,37 @@ describe('BaseClass', () => { it('should log batch completion', async () => { const start = Date.now(); - + await (testClass as any).logMsgAndWaitIfRequired('test-module', start, 1); - + // Just verify it completes without error - the log is tested implicitly }); - it('should wait when execution time is less than 1000ms', async function() { + it('should wait when execution time is less than 1000ms', async function () { clock = sinon.useFakeTimers(); const start = Date.now(); - + const waitPromise = (testClass as any).logMsgAndWaitIfRequired('test-module', start, 1); clock.tick(1000); await waitPromise; - + // Just verify it completes clock.restore(); }); it('should not wait when execution time is more than 1000ms', async () => { const start = Date.now() - 1500; - + await (testClass as any).logMsgAndWaitIfRequired('test-module', start, 1); - + // Just verify it completes }); it('should display execution time when configured', async () => { mockExportConfig.modules.assets.displayExecutionTime = true; - + await (testClass as any).logMsgAndWaitIfRequired('test-module', Date.now() - 100, 1); - + // Verify it completes - display logic is tested implicitly }); }); @@ -586,7 +591,7 @@ describe('BaseClass', () => { uid: 'asset-123', queryParam: {}, resolve: resolveStub, - reject: rejectStub + reject: rejectStub, }); expect(mockStackClient.asset.calledWith('asset-123')).to.be.true; @@ -600,7 +605,7 @@ describe('BaseClass', () => { module: 'assets', queryParam: { skip: 0 }, resolve: resolveStub, - reject: rejectStub + reject: rejectStub, }); expect(mockStackClient.asset.called).to.be.true; @@ -609,7 +614,7 @@ describe('BaseClass', () => { it('should handle API errors', async () => { const error = new Error('Network error'); mockStackClient.asset = sinon.stub().returns({ - fetch: sinon.stub().rejects(error) + fetch: sinon.stub().rejects(error), }); const rejectStub = sinon.stub(); @@ -619,7 +624,7 @@ describe('BaseClass', () => { uid: 'asset-123', queryParam: {}, resolve: sinon.stub(), - reject: rejectStub + reject: rejectStub, }); // Error should be handled by reject @@ -629,7 +634,7 @@ describe('BaseClass', () => { const result = await (testClass as any).makeAPICall({ module: 'unknown' as any, resolve: sinon.stub(), - reject: sinon.stub() + reject: sinon.stub(), }); expect(result).to.be.undefined; @@ -641,7 +646,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 100, - concurrencyLimit: 5 + concurrencyLimit: 5, }; const result = await testClass.makeConcurrentCall(env); @@ -652,7 +657,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 101, - concurrencyLimit: 5 + concurrencyLimit: 5, }; const result = await testClass.makeConcurrentCall(env); @@ -663,7 +668,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 50, - concurrencyLimit: 1 + concurrencyLimit: 1, }; const result = await testClass.makeConcurrentCall(env); @@ -674,7 +679,7 @@ describe('BaseClass', () => { const env: EnvType = { module: 'test', totalCount: 50, - concurrencyLimit: 100 + concurrencyLimit: 100, }; const result = await testClass.makeConcurrentCall(env); @@ -682,4 +687,3 @@ describe('BaseClass', () => { }); }); }); - diff --git a/packages/contentstack-import/package.json b/packages/contentstack-import/package.json index 3c89d5115..9c8529c06 100644 --- a/packages/contentstack-import/package.json +++ b/packages/contentstack-import/package.json @@ -1,14 +1,14 @@ { "name": "@contentstack/cli-cm-import", "description": "Contentstack CLI plugin to import content into stack", - "version": "1.32.3", + "version": "1.33.0", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { "@contentstack/cli-audit": "~1.19.3", "@contentstack/cli-command": "~1.8.2", "@contentstack/cli-utilities": "~1.18.3", - "@contentstack/cli-variants": "~1.4.3", + "@contentstack/cli-variants": "~1.5.0", "@oclif/core": "^4.10.5", "big-json": "^3.2.0", "bluebird": "^3.7.2", @@ -89,4 +89,4 @@ } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-import/src/config/index.ts b/packages/contentstack-import/src/config/index.ts index 76b70e112..e8c9e2179 100644 --- a/packages/contentstack-import/src/config/index.ts +++ b/packages/contentstack-import/src/config/index.ts @@ -41,6 +41,7 @@ const config: DefaultConfig = { 'personalize', 'custom-roles', 'workflows', + 'publishing-rules', 'entries', 'variant-entries', 'labels', @@ -88,6 +89,11 @@ const config: DefaultConfig = { fileName: 'workflows.json', invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], + }, assets: { dirName: 'assets', assetBatchLimit: 1, @@ -455,5 +461,7 @@ const config: DefaultConfig = { globalModules: ['webhooks'], entriesPublish: true, }; +export const PUBLISHING_RULES_APPROVERS_SKIP_MSG = + 'Skipping import of publish rule approver(s) (roles/users); reconfigure approvers on the target stack.'; export default config; diff --git a/packages/contentstack-import/src/import/modules/base-class.ts b/packages/contentstack-import/src/import/modules/base-class.ts index a0eb77075..1981f1887 100644 --- a/packages/contentstack-import/src/import/modules/base-class.ts +++ b/packages/contentstack-import/src/import/modules/base-class.ts @@ -51,7 +51,8 @@ export type ApiModuleType = | 'delete-entries' | 'create-taxonomies' | 'create-terms' - | 'import-taxonomy'; + | 'import-taxonomy' + | 'create-publishing-rule'; export type ApiOptions = { uid?: string; @@ -374,6 +375,13 @@ export default abstract class BaseClass { .create({ workflow: apiData as WorkflowData }) .then(onSuccess) .catch(onReject); + case 'create-publishing-rule': + return this.stack + .workflow() + .publishRule() + .create({ publishing_rule: omit(apiData, ['uid']) as any }) + .then(onSuccess) + .catch(onReject); case 'create-custom-role': return this.stack .role() diff --git a/packages/contentstack-import/src/import/modules/publishing-rules.ts b/packages/contentstack-import/src/import/modules/publishing-rules.ts new file mode 100644 index 000000000..ca7734585 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/publishing-rules.ts @@ -0,0 +1,275 @@ +import chalk from 'chalk'; +import values from 'lodash/values'; +import isEmpty from 'lodash/isEmpty'; +import { join } from 'node:path'; + +import BaseClass, { ApiOptions } from './base-class'; +import { PUBLISHING_RULES_APPROVERS_SKIP_MSG } from '../../config'; +import { fsUtil, fileHelper, parseErrorPayload, isDuplicatePublishingRuleError } from '../../utils'; +import { log, handleAndLogError } from '@contentstack/cli-utilities'; +import { ModuleClassParams, PublishingRulesConfig } from '../../types'; + +export default class ImportPublishingRules extends BaseClass { + private readonly mapperDirPath: string; + private readonly publishingRulesFolderPath: string; + private readonly publishingRulesUidMapperPath: string; + private readonly createdPublishingRulesPath: string; + private readonly failedPublishingRulesPath: string; + private readonly publishingRulesConfig: PublishingRulesConfig; + private publishingRules: Record; + private publishingRulesUidMapper: Record; + private readonly createdPublishingRules: Record[]; + private readonly failedPublishingRules: Record[]; + private envUidMapper: Record; + private workflowUidMapper: Record; + private readonly stageUidMapper: Record = {}; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.importConfig.context.module = 'publishing-rules'; + this.publishingRulesConfig = importConfig.modules['publishing-rules']; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'publishing-rules'); + this.publishingRulesFolderPath = join(this.importConfig.backupDir, this.publishingRulesConfig.dirName); + this.publishingRulesUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.createdPublishingRulesPath = join(this.mapperDirPath, 'success.json'); + this.failedPublishingRulesPath = join(this.mapperDirPath, 'fails.json'); + this.publishingRules = {}; + this.publishingRulesUidMapper = {}; + this.createdPublishingRules = []; + this.failedPublishingRules = []; + this.envUidMapper = {}; + this.workflowUidMapper = {}; + } + + private static collectOldStageUidToName( + exportedWorkflows: Record, + ): Record { + const map: Record = {}; + for (const workflow of Object.values(exportedWorkflows)) { + for (const stage of workflow.workflow_stages ?? []) { + if (stage.uid && stage.name) { + map[stage.uid] = stage.name; + } + } + } + return map; + } + + /** + * Returns `{ noSuccessMsg: true }` if any rule failed, so the import command skips the generic stack success line. + */ + async start(): Promise<{ noSuccessMsg: true } | void> { + const rulesFilePath = join(this.publishingRulesFolderPath, this.publishingRulesConfig.fileName); + + if (!fileHelper.fileExistsSync(rulesFilePath)) { + log.info(`No Publishing Rules found - '${rulesFilePath}'`, this.importConfig.context); + return; + } + + this.publishingRules = (fsUtil.readFile(rulesFilePath, true) as Record) ?? {}; + if (isEmpty(this.publishingRules)) { + log.info('No Publishing Rules found', this.importConfig.context); + return; + } + + await fsUtil.makeDirectory(this.mapperDirPath); + + this.publishingRulesUidMapper = this.readUidMappingFile(this.publishingRulesUidMapperPath); + this.envUidMapper = this.readMapper('environments'); + this.workflowUidMapper = this.readMapper('workflows'); + + await this.buildStageUidMapper(); + await this.importPublishingRules(); + + if (this.createdPublishingRules?.length) { + fsUtil.writeFile(this.createdPublishingRulesPath, this.createdPublishingRules); + } + if (this.failedPublishingRules?.length) { + fsUtil.writeFile(this.failedPublishingRulesPath, this.failedPublishingRules); + } + + const successCount = this.createdPublishingRules.length; + const failCount = this.failedPublishingRules.length; + + if (failCount > 0 && successCount === 0) { + log.error( + `Publishing rules import failed! ${failCount} rule(s) could not be imported. Check '${this.failedPublishingRulesPath}' for details.`, + this.importConfig.context, + ); + } else if (failCount > 0) { + log.warn( + `Publishing rules import completed with errors. Imported: ${successCount}, Failed: ${failCount}. Check '${this.failedPublishingRulesPath}' for details.`, + this.importConfig.context, + ); + } else { + log.success('Publishing rules have been imported successfully!', this.importConfig.context); + } + + if (failCount > 0) { + return { noSuccessMsg: true }; + } + } + + private readUidMappingFile(path: string): Record { + return fileHelper.fileExistsSync(path) ? (fsUtil.readFile(path, true) as Record) ?? {} : {}; + } + + private readMapper(moduleDir: string): Record { + const p = join(this.importConfig.backupDir, 'mapper', moduleDir, 'uid-mapping.json'); + return this.readUidMappingFile(p); + } + + private async importPublishingRules(): Promise { + const apiContent = values(this.publishingRules) as Record[]; + log.debug(`Importing ${apiContent.length} publishing rule(s)`, this.importConfig.context); + + const onSuccess = ({ response, apiData }: { response: { uid: string }; apiData: { uid: string } }) => { + const { uid } = apiData; + this.createdPublishingRules.push(response as unknown as Record); + this.publishingRulesUidMapper[uid] = response.uid; + log.success(`Publishing rule imported successfully (${uid} → ${response.uid})`, this.importConfig.context); + fsUtil.writeFile(this.publishingRulesUidMapperPath, this.publishingRulesUidMapper); + }; + + const onReject = ({ error, apiData }: { error: unknown; apiData: Record }) => { + const uid = apiData.uid as string; + const parsed = parseErrorPayload(error); + + if (isDuplicatePublishingRuleError(parsed, error)) { + log.info(`Publishing rule '${uid}' already exists`, this.importConfig.context); + return; + } + + this.failedPublishingRules.push(apiData); + handleAndLogError( + error as Error, + { ...this.importConfig.context, publishingRuleUid: uid }, + `Publishing rule '${uid}' failed to import`, + ); + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'import publishing rules', + apiParams: { + serializeData: this.serializePublishingRules.bind(this), + reject: onReject, + resolve: onSuccess, + entity: 'create-publishing-rule', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.importConfig.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + private mergeFetchedWorkflowStages( + workflow: { workflow_stages?: { uid?: string; name?: string }[] }, + oldStageUidToName: Record, + ): void { + for (const newStage of workflow.workflow_stages ?? []) { + const oldUid = Object.keys(oldStageUidToName).find((u) => oldStageUidToName[u] === newStage.name); + if (oldUid && newStage.uid) { + this.stageUidMapper[oldUid] = newStage.uid; + } + } + } + + private async buildStageUidMapper(): Promise { + const wf = this.importConfig.modules.workflows as { dirName: string; fileName: string }; + const workflowsFilePath = join(this.importConfig.backupDir, wf.dirName, wf.fileName); + + if (!fileHelper.fileExistsSync(workflowsFilePath)) { + log.debug('No exported workflows file; stage UID mapping skipped', this.importConfig.context); + return; + } + + const exportedWorkflows = fsUtil.readFile(workflowsFilePath, true) as Record< + string, + { workflow_stages?: { uid?: string; name?: string }[] } + > | null; + if (!exportedWorkflows) return; + + const oldStageUidToName = ImportPublishingRules.collectOldStageUidToName(exportedWorkflows); + + for (const newWorkflowUid of Object.values(this.workflowUidMapper)) { + try { + const workflow = await this.stack.workflow(newWorkflowUid as string).fetch(); + this.mergeFetchedWorkflowStages( + workflow as { workflow_stages?: { uid?: string; name?: string }[] }, + oldStageUidToName, + ); + } catch (error: unknown) { + log.debug(`Stage mapping: could not fetch workflow '${newWorkflowUid}'`, this.importConfig.context); + handleAndLogError(error as Error, { ...this.importConfig.context }); + } + } + + log.debug(`Stage UID mapper: ${Object.keys(this.stageUidMapper).length} entr(y/ies)`, this.importConfig.context); + } + + private stripApprovers(rule: Record): void { + if (rule.approvers == null) return; + + const a = rule.approvers as { roles?: unknown[]; users?: unknown[] }; + const hadContent = (Array.isArray(a.roles) && a.roles.length > 0) || (Array.isArray(a.users) && a.users.length > 0); + if (hadContent) { + log.info(chalk.yellow(PUBLISHING_RULES_APPROVERS_SKIP_MSG), this.importConfig.context); + } + rule.approvers = { roles: [], users: [] }; + } + + private remapReference( + rule: Record, + field: 'workflow' | 'environment', + mapper: Record, + ): void { + const current = rule[field] as string | undefined; + if (!current) return; + const mapped = mapper[current] as string | undefined; + if (mapped) { + rule[field] = mapped; + log.debug(`${field} UID remapped`, this.importConfig.context); + } else { + log.debug(`No ${field} mapping for ${current}; leaving as-is`, this.importConfig.context); + } + } + + serializePublishingRules(apiOptions: ApiOptions): ApiOptions { + const rule = apiOptions.apiData as Record; + const ruleUid = rule.uid as string; + + if (ruleUid in this.publishingRulesUidMapper) { + log.info( + `Publishing rule '${ruleUid}' already exists. Skipping it to avoid duplicates!`, + this.importConfig.context, + ); + apiOptions.entity = undefined; + return apiOptions; + } + + const oldUid = ruleUid; + delete rule.uid; + + this.stripApprovers(rule); + this.remapReference(rule, 'workflow', this.workflowUidMapper); + this.remapReference(rule, 'environment', this.envUidMapper); + + if (rule.workflow_stage) { + const stage = rule.workflow_stage as string; + const mappedStage = this.stageUidMapper[stage]; + if (mappedStage) { + rule.workflow_stage = mappedStage; + log.debug('workflow_stage UID remapped', this.importConfig.context); + } else { + log.debug(`No workflow_stage mapping for ${stage}; leaving as-is`, this.importConfig.context); + } + } + + apiOptions.apiData = { ...rule, uid: oldUid }; + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/types/default-config.ts b/packages/contentstack-import/src/types/default-config.ts index aa4867d29..e27968b9b 100644 --- a/packages/contentstack-import/src/types/default-config.ts +++ b/packages/contentstack-import/src/types/default-config.ts @@ -49,6 +49,11 @@ export default interface DefaultConfig { fileName: string; invalidKeys: string[]; }; + 'publishing-rules': { + dirName: string; + fileName: string; + invalidKeys: string[]; + }; assets: { dirName: string; assetBatchLimit: number; diff --git a/packages/contentstack-import/src/types/index.ts b/packages/contentstack-import/src/types/index.ts index ee9062465..8dac29ffa 100644 --- a/packages/contentstack-import/src/types/index.ts +++ b/packages/contentstack-import/src/types/index.ts @@ -46,6 +46,7 @@ export type Modules = | 'content-types' | 'custom-roles' | 'workflows' + | 'publishing-rules' | 'labels' | 'marketplace-apps' | 'taxonomies' @@ -94,6 +95,12 @@ export interface WorkflowConfig { invalidKeys: string[]; } +export interface PublishingRulesConfig { + dirName: string; + fileName: string; + invalidKeys: string[]; +} + export interface CustomRoleConfig { dirName: string; fileName: string; diff --git a/packages/contentstack-import/src/utils/index.ts b/packages/contentstack-import/src/utils/index.ts index fcf452a26..8232acd5d 100644 --- a/packages/contentstack-import/src/utils/index.ts +++ b/packages/contentstack-import/src/utils/index.ts @@ -33,3 +33,4 @@ export { export * from './common-helper'; export * from './log'; export { lookUpTaxonomy, lookUpTerms } from './taxonomies-helper'; +export { parseErrorPayload, isDuplicatePublishingRuleError } from './publishing-rules-helper'; diff --git a/packages/contentstack-import/src/utils/publishing-rules-helper.ts b/packages/contentstack-import/src/utils/publishing-rules-helper.ts new file mode 100644 index 000000000..b7f3b44ec --- /dev/null +++ b/packages/contentstack-import/src/utils/publishing-rules-helper.ts @@ -0,0 +1,32 @@ +/** + * Helpers for publishing rules import (API error shape, duplicate detection). + */ + +export function parseErrorPayload(error: unknown): { + errors?: Record; + error_message?: string; +} | null { + if (!error || typeof error !== 'object') return null; + const e = error as { message?: string; errors?: Record }; + if (e.errors) return e; + if (e.message && typeof e.message === 'string') { + try { + return JSON.parse(e.message) as { errors?: Record; error_message?: string }; + } catch { + return null; + } + } + return null; +} + +export function isDuplicatePublishingRuleError( + parsed: { errors?: Record; error_message?: string } | null, + raw: unknown, +): boolean { + const errors = parsed?.errors ?? (raw as { errors?: Record })?.errors; + if (errors?.name || errors?.['publishing_rule.name'] || errors?.['publish_rule.name']) { + return true; + } + const msg = parsed?.error_message; + return typeof msg === 'string' && /already exists|duplicate/i.test(msg); +} diff --git a/packages/contentstack-import/test/unit/import/modules/locales.test.ts b/packages/contentstack-import/test/unit/import/modules/locales.test.ts index fc3631e81..1f5da35cf 100644 --- a/packages/contentstack-import/test/unit/import/modules/locales.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/locales.test.ts @@ -51,6 +51,11 @@ describe('ImportLocales', () => { webhooks: { dirName: 'webhooks', fileName: 'webhooks.json' }, releases: { dirName: 'releases', fileName: 'releases.json', invalidKeys: ['uid'] }, workflows: { dirName: 'workflows', fileName: 'workflows.json', invalidKeys: ['uid'] }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: ['uid'], + }, assets: { dirName: 'assets', assetBatchLimit: 10, diff --git a/packages/contentstack-import/test/unit/import/modules/publishing-rules.test.ts b/packages/contentstack-import/test/unit/import/modules/publishing-rules.test.ts new file mode 100644 index 000000000..26aa3f4a7 --- /dev/null +++ b/packages/contentstack-import/test/unit/import/modules/publishing-rules.test.ts @@ -0,0 +1,333 @@ +import { expect } from 'chai'; +import sinon from 'sinon'; +import { join } from 'node:path'; +import ImportPublishingRules from '../../../../src/import/modules/publishing-rules'; +import { ImportConfig } from '../../../../src/types'; +describe('ImportPublishingRules', () => { + const BACKUP = '/test/backup'; + const rulesFile = join(BACKUP, 'workflows', 'publishing-rules.json'); + const workflowsExportFile = join(BACKUP, 'workflows', 'workflows.json'); + const workflowMapperFile = join(BACKUP, 'mapper', 'workflows', 'uid-mapping.json'); + const envMapperFile = join(BACKUP, 'mapper', 'environments', 'uid-mapping.json'); + const publishingMapperFile = join(BACKUP, 'mapper', 'publishing-rules', 'uid-mapping.json'); + + let importPublishingRules: ImportPublishingRules; + let mockStackClient: any; + let mockImportConfig: ImportConfig; + let fsUtilStub: any; + let fileHelperStub: any; + let makeConcurrentCallStub: sinon.SinonStub; + let logStub: { info: sinon.SinonStub; debug: sinon.SinonStub; success: sinon.SinonStub; error: sinon.SinonStub; warn: sinon.SinonStub }; + beforeEach(() => { + fsUtilStub = { + readFile: sinon.stub(), + writeFile: sinon.stub(), + makeDirectory: sinon.stub().resolves(), + }; + + fileHelperStub = { + fileExistsSync: sinon.stub(), + }; + + sinon.replace(require('../../../../src/utils'), 'fileHelper', fileHelperStub); + sinon.replaceGetter(require('../../../../src/utils'), 'fsUtil', () => fsUtilStub); + + const fetchWorkflowStub = sinon.stub().resolves({ + workflow_stages: [{ uid: 'stage-new', name: 'Review' }], + }); + mockStackClient = { + workflow: sinon.stub().returns({ + fetch: fetchWorkflowStub, + }), + }; + + mockImportConfig = { + apiKey: 'test', + backupDir: BACKUP, + data: '/test/content', + contentVersion: 1, + region: 'us', + fetchConcurrency: 2, + context: { + command: 'cm:stacks:import', + module: 'publishing-rules', + userId: 'user-123', + email: 'test@example.com', + sessionId: 'session-123', + apiKey: 'test', + orgId: 'org-123', + authenticationMethod: 'Basic Auth', + }, + modules: { + workflows: { + dirName: 'workflows', + fileName: 'workflows.json', + invalidKeys: ['uid'], + }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: ['uid'], + }, + }, + } as any; + + importPublishingRules = new ImportPublishingRules({ + importConfig: mockImportConfig as any, + stackAPIClient: mockStackClient, + moduleName: 'publishing-rules', + }); + + makeConcurrentCallStub = sinon.stub(importPublishingRules as any, 'makeConcurrentCall').resolves(); + + const cliUtilities = require('@contentstack/cli-utilities'); + logStub = { + info: sinon.stub(), + debug: sinon.stub(), + success: sinon.stub(), + error: sinon.stub(), + warn: sinon.stub(), + }; + sinon.stub(cliUtilities, 'log').value(logStub); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe('Constructor', () => { + it('sets context.module to publishing-rules and derives exact paths from backupDir and config', () => { + expect(mockImportConfig.context.module).to.equal('publishing-rules'); + expect(importPublishingRules['mapperDirPath']).to.equal(join(BACKUP, 'mapper', 'publishing-rules')); + expect(importPublishingRules['publishingRulesFolderPath']).to.equal(join(BACKUP, 'workflows')); + expect(importPublishingRules['publishingRulesUidMapperPath']).to.equal(publishingMapperFile); + expect(importPublishingRules['createdPublishingRulesPath']).to.equal( + join(BACKUP, 'mapper', 'publishing-rules', 'success.json'), + ); + expect(importPublishingRules['failedPublishingRulesPath']).to.equal( + join(BACKUP, 'mapper', 'publishing-rules', 'fails.json'), + ); + }); + + it('initializes empty rules, mappers, and result arrays', () => { + expect(importPublishingRules['publishingRules']).to.deep.equal({}); + expect(importPublishingRules['publishingRulesUidMapper']).to.deep.equal({}); + expect(importPublishingRules['createdPublishingRules']).to.deep.equal([]); + expect(importPublishingRules['failedPublishingRules']).to.deep.equal([]); + expect(importPublishingRules['envUidMapper']).to.deep.equal({}); + expect(importPublishingRules['workflowUidMapper']).to.deep.equal({}); + expect(importPublishingRules['stageUidMapper']).to.deep.equal({}); + }); + }); + + describe('start()', () => { + it('returns undefined and logs missing file path when rules file does not exist', async () => { + fileHelperStub.fileExistsSync.withArgs(rulesFile).returns(false); + + const result = await importPublishingRules.start(); + + expect(result).to.equal(undefined); + expect(makeConcurrentCallStub.called).to.be.false; + expect(logStub.info.firstCall.args[0]).to.include(rulesFile); + }); + + it('returns undefined when rules file exists but payload is empty; arrays stay empty', async () => { + fileHelperStub.fileExistsSync.withArgs(rulesFile).returns(true); + fsUtilStub.readFile.withArgs(rulesFile, true).returns({}); + + const result = await importPublishingRules.start(); + + expect(result).to.equal(undefined); + expect(makeConcurrentCallStub.called).to.be.false; + expect(importPublishingRules['createdPublishingRules']).to.deep.equal([]); + expect(importPublishingRules['failedPublishingRules']).to.deep.equal([]); + }); + + it('passes one apiContent item per rule and binds serializeData to serializePublishingRules', async () => { + const rules = { + r1: { uid: 'r1', name: 'Rule 1' }, + r2: { uid: 'r2', name: 'Rule 2' }, + }; + fileHelperStub.fileExistsSync.callsFake((p: string) => { + if (p === rulesFile) return true; + if (p === workflowsExportFile || p === workflowMapperFile || p === envMapperFile || p === publishingMapperFile) { + return false; + } + return false; + }); + fsUtilStub.readFile.callsFake((p: string) => { + if (p === rulesFile) return rules; + return {}; + }); + + await importPublishingRules.start(); + + expect(makeConcurrentCallStub.calledOnce).to.be.true; + const callArgs = makeConcurrentCallStub.firstCall.args[0]; + expect(callArgs.apiContent).to.have.length(2); + expect(callArgs.processName).to.equal('import publishing rules'); + expect(callArgs.apiParams.entity).to.equal('create-publishing-rule'); + const serialized = callArgs.apiParams.serializeData({ + apiData: { uid: 'r1', name: 'Rule 1' }, + entity: 'create-publishing-rule', + }); + expect(serialized.apiData).to.deep.include({ name: 'Rule 1', uid: 'r1' }); + expect(serialized.entity).to.equal('create-publishing-rule'); + }); + + it('builds stageUidMapper from exported workflows and fetched target workflow stages by name', async () => { + fileHelperStub.fileExistsSync.callsFake((p: string) => { + if (p === rulesFile) return true; + if (p === workflowsExportFile) return true; + if (p === workflowMapperFile) return true; + if (p === envMapperFile || p === publishingMapperFile) return false; + return false; + }); + fsUtilStub.readFile.callsFake((p: string) => { + if (p === rulesFile) return { r1: { uid: 'r1', name: 'R' } }; + if (p === workflowsExportFile) { + return { + expWf: { workflow_stages: [{ uid: 'stage-old', name: 'Review' }] }, + }; + } + if (p === workflowMapperFile) return { oldWf: 'newWf' }; + return {}; + }); + + await importPublishingRules.start(); + + expect(importPublishingRules['stageUidMapper']).to.deep.equal({ 'stage-old': 'stage-new' }); + expect(mockStackClient.workflow.calledWith('newWf')).to.be.true; + }); + + it('returns { noSuccessMsg: true } when a rule fails to import (non-duplicate error)', async () => { + fileHelperStub.fileExistsSync.callsFake((p: string) => p === rulesFile); + fsUtilStub.readFile.callsFake((p: string) => (p === rulesFile ? { r1: { uid: 'r1', name: 'R' } } : {})); + + makeConcurrentCallStub.callsFake(async (env: any) => { + const { apiParams, apiContent } = env; + for (const element of apiContent) { + apiParams.apiData = element; + let opts = { ...apiParams, apiData: { ...element } }; + opts = apiParams.serializeData(opts); + if (opts.entity) { + await apiParams.reject({ error: new Error('network'), apiData: opts.apiData }); + } + } + }); + + const result = await importPublishingRules.start(); + + expect(result).to.deep.equal({ noSuccessMsg: true }); + expect(importPublishingRules['failedPublishingRules']).to.have.length(1); + expect(importPublishingRules['failedPublishingRules'][0].uid).to.equal('r1'); + expect(String(logStub.error.firstCall?.args[0] ?? '')).to.include('could not be imported'); + }); + + it('returns undefined when import succeeds with no failures', async () => { + fileHelperStub.fileExistsSync.callsFake((p: string) => p === rulesFile); + fsUtilStub.readFile.callsFake((p: string) => (p === rulesFile ? { r1: { uid: 'r1', name: 'R' } } : {})); + + makeConcurrentCallStub.callsFake(async (env: any) => { + const { apiParams, apiContent } = env; + for (const element of apiContent) { + apiParams.apiData = element; + let opts = { ...apiParams, apiData: { ...element } }; + opts = apiParams.serializeData(opts); + if (opts.entity) { + await apiParams.resolve({ response: { uid: 'new-r1' }, apiData: opts.apiData }); + } + } + }); + + const result = await importPublishingRules.start(); + + expect(result).to.equal(undefined); + expect(importPublishingRules['failedPublishingRules']).to.deep.equal([]); + expect(importPublishingRules['publishingRulesUidMapper']).to.deep.equal({ r1: 'new-r1' }); + expect(logStub.success.calledWith('Publishing rules have been imported successfully!', mockImportConfig.context)).to.be + .true; + }); + }); + + describe('serializePublishingRules', () => { + it('clears entity when rule uid already in mapper; leaves apiData.uid unchanged', () => { + importPublishingRules['publishingRulesUidMapper'] = { 'rule-1': 'mapped-1' }; + + const apiOptions: any = { + apiData: { uid: 'rule-1', name: 'N' }, + entity: 'create-publishing-rule', + }; + + const out = importPublishingRules.serializePublishingRules(apiOptions); + + expect(out.entity).to.equal(undefined); + expect(out.apiData).to.deep.equal({ uid: 'rule-1', name: 'N' }); + expect(String(logStub.info.firstCall?.args[0] ?? '')).to.match(/already exists\. Skipping/); + }); + + it('remaps workflow, environment, workflow_stage and strips approvers; apiData carries uid for completion handler', () => { + const pr = importPublishingRules as any; + pr.workflowUidMapper = { wfOld: 'wfNew' }; + pr.envUidMapper = { envOld: 'envNew' }; + Object.keys(pr.stageUidMapper).forEach((k) => delete pr.stageUidMapper[k]); + pr.stageUidMapper.stOld = 'stNew'; + + const apiOptions: any = { + apiData: { + uid: 'pr-1', + name: 'PR', + workflow: 'wfOld', + environment: 'envOld', + workflow_stage: 'stOld', + approvers: { roles: ['r1'], users: ['u1'] }, + }, + entity: 'create-publishing-rule', + }; + + const out = importPublishingRules.serializePublishingRules(apiOptions); + + expect(out.entity).to.equal('create-publishing-rule'); + expect(out.apiData).to.deep.equal({ + uid: 'pr-1', + name: 'PR', + workflow: 'wfNew', + environment: 'envNew', + workflow_stage: 'stNew', + approvers: { roles: [], users: [] }, + }); + const infoArgs = logStub.info.getCalls().map((c) => c.args[0]); + expect(infoArgs.some((msg) => String(msg).includes('Skipping import of publish rule approver'))).to.be.true; + }); + }); + + describe('importPublishingRules callbacks', () => { + beforeEach(() => { + importPublishingRules['publishingRules'] = { r1: { uid: 'r1', name: 'R' } }; + }); + + it('onSuccess updates mapper and persists uid-mapping.json with expected payload', async () => { + await (importPublishingRules as any).importPublishingRules(); + + const onSuccess = makeConcurrentCallStub.firstCall.args[0].apiParams.resolve; + await onSuccess({ response: { uid: 'created-uid', name: 'R' }, apiData: { uid: 'r1', name: 'R' } }); + + expect(importPublishingRules['createdPublishingRules']).to.deep.equal([{ uid: 'created-uid', name: 'R' }]); + expect(importPublishingRules['publishingRulesUidMapper']).to.deep.equal({ r1: 'created-uid' }); + expect(fsUtilStub.writeFile.calledWith(publishingMapperFile, { r1: 'created-uid' })).to.be.true; + }); + + it('onReject for duplicate error does not append to failedPublishingRules', async () => { + await (importPublishingRules as any).importPublishingRules(); + + const onReject = makeConcurrentCallStub.firstCall.args[0].apiParams.reject; + await onReject({ + error: { errors: { name: 'taken' } }, + apiData: { uid: 'r1', name: 'R' }, + }); + + expect(importPublishingRules['failedPublishingRules']).to.deep.equal([]); + expect(logStub.info.calledWith(`Publishing rule 'r1' already exists`, mockImportConfig.context)).to.be.true; + }); + }); +}); diff --git a/packages/contentstack-import/test/unit/utils/extension-helper.test.ts b/packages/contentstack-import/test/unit/utils/extension-helper.test.ts index c9b567218..fa537a84e 100644 --- a/packages/contentstack-import/test/unit/utils/extension-helper.test.ts +++ b/packages/contentstack-import/test/unit/utils/extension-helper.test.ts @@ -54,6 +54,11 @@ describe('Extension Helper', () => { webhooks: { dirName: 'webhooks', fileName: 'webhooks.json' }, releases: { dirName: 'releases', fileName: 'releases.json', invalidKeys: ['uid'] }, workflows: { dirName: 'workflows', fileName: 'workflows.json', invalidKeys: ['uid'] }, + 'publishing-rules': { + dirName: 'workflows', + fileName: 'publishing-rules.json', + invalidKeys: ['uid'], + }, assets: { dirName: 'assets', assetBatchLimit: 10, diff --git a/packages/contentstack-import/test/unit/utils/publishing-rules-helper.test.ts b/packages/contentstack-import/test/unit/utils/publishing-rules-helper.test.ts new file mode 100644 index 000000000..1453b68eb --- /dev/null +++ b/packages/contentstack-import/test/unit/utils/publishing-rules-helper.test.ts @@ -0,0 +1,57 @@ +import { expect } from 'chai'; +import { parseErrorPayload, isDuplicatePublishingRuleError } from '../../../src/utils/publishing-rules-helper'; + +describe('publishing-rules-helper', () => { + describe('parseErrorPayload', () => { + it('returns the object when error has errors', () => { + const err = { errors: { name: 'taken' } }; + expect(parseErrorPayload(err)).to.deep.equal({ errors: { name: 'taken' } }); + }); + + it('parses JSON from message string', () => { + const err = { message: JSON.stringify({ error_message: 'already exists' }) }; + expect(parseErrorPayload(err)).to.deep.equal({ error_message: 'already exists' }); + }); + + it('returns null for invalid JSON in message', () => { + expect(parseErrorPayload({ message: 'not-json{' })).to.equal(null); + }); + + it('returns null for non-object', () => { + expect(parseErrorPayload(null)).to.equal(null); + expect(parseErrorPayload('x')).to.equal(null); + }); + + it('returns null when object has no errors or parseable message', () => { + expect(parseErrorPayload({ foo: 1 })).to.equal(null); + }); + }); + + describe('isDuplicatePublishingRuleError', () => { + it('returns true when errors.name is set', () => { + expect(isDuplicatePublishingRuleError({ errors: { name: 'x' } }, {})).to.equal(true); + }); + + it('returns true when errors.publishing_rule.name is set', () => { + expect(isDuplicatePublishingRuleError({ errors: { 'publishing_rule.name': 'x' } }, {})).to.equal(true); + }); + + it('returns true when errors.publish_rule.name is set', () => { + expect(isDuplicatePublishingRuleError({ errors: { 'publish_rule.name': 'x' } }, {})).to.equal(true); + }); + + it('returns true when error_message matches duplicate wording', () => { + expect(isDuplicatePublishingRuleError({ error_message: 'Rule already exists' }, {})).to.equal(true); + }); + + it('reads errors from raw when parsed is null', () => { + const raw = { errors: { name: 'dup' } }; + expect(isDuplicatePublishingRuleError(null, raw)).to.equal(true); + }); + + it('returns false when no duplicate signals', () => { + expect(isDuplicatePublishingRuleError({ errors: { other: 'x' } }, {})).to.equal(false); + expect(isDuplicatePublishingRuleError({ error_message: 'timeout' }, {})).to.equal(false); + }); + }); +}); diff --git a/packages/contentstack-query-export/package.json b/packages/contentstack-query-export/package.json index 9e3cad7bd..35290df05 100644 --- a/packages/contentstack-query-export/package.json +++ b/packages/contentstack-query-export/package.json @@ -1,12 +1,12 @@ { "name": "@contentstack/cli-cm-export-query", "description": "Contentstack CLI plugin to export content from stack", - "version": "1.0.0", + "version": "1.0.1", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-variants": "~1.4.3", - "@contentstack/cli-cm-export": "~1.24.3", + "@contentstack/cli-variants": "~1.5.0", + "@contentstack/cli-cm-export": "~1.25.0", "@contentstack/cli-command": "~1.8.2", "@contentstack/cli-utilities": "~1.18.3", "@oclif/core": "^4.10.5", @@ -99,4 +99,4 @@ } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-seed/package.json b/packages/contentstack-seed/package.json index 6c0822f84..cd62401f0 100644 --- a/packages/contentstack-seed/package.json +++ b/packages/contentstack-seed/package.json @@ -1,11 +1,11 @@ { "name": "@contentstack/cli-cm-seed", "description": "create a Stack from existing content types, entries, assets, etc.", - "version": "1.15.2", + "version": "1.15.3", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-cm-import": "~1.32.3", + "@contentstack/cli-cm-import": "~1.33.0", "@contentstack/cli-command": "~1.8.2", "@contentstack/cli-utilities": "~1.18.3", "inquirer": "8.2.7", @@ -70,4 +70,4 @@ "compile": "tsc -b tsconfig.json", "build": "pnpm compile && oclif manifest && oclif readme" } -} +} \ No newline at end of file diff --git a/packages/contentstack-variants/package.json b/packages/contentstack-variants/package.json index 492f2b1ec..923fc8717 100644 --- a/packages/contentstack-variants/package.json +++ b/packages/contentstack-variants/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-variants", - "version": "1.4.3", + "version": "1.5.0", "description": "Variants plugin", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/packages/contentstack-variants/src/types/export-config.ts b/packages/contentstack-variants/src/types/export-config.ts index f9336bc96..8b782c2b0 100644 --- a/packages/contentstack-variants/src/types/export-config.ts +++ b/packages/contentstack-variants/src/types/export-config.ts @@ -17,6 +17,7 @@ export type Modules = | 'content-types' | 'custom-roles' | 'workflows' + | 'publishing-rules' | 'labels' | 'marketplace-apps' | 'taxonomies' @@ -88,6 +89,13 @@ export interface DefaultConfig { invalidKeys: string[]; dependencies?: Modules[]; }; + 'publishing-rules': { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + limit?: number; + }; globalfields: { dirName: string; fileName: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a2f26bac..3528982ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,19 +18,19 @@ importers: version: 9.1.7 pnpm: specifier: ^10.28.0 - version: 10.33.2 + version: 10.33.4 packages/contentstack-audit: dependencies: '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@20.19.39) + version: 1.8.2(@types/node@20.19.40) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@20.19.39) + version: 1.18.3(@types/node@20.19.40) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -39,7 +39,7 @@ importers: version: 4.3.6 fs-extra: specifier: ^11.3.0 - version: 11.3.4 + version: 11.3.5 lodash: specifier: ^4.18.1 version: 4.18.1 @@ -49,7 +49,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/chai': specifier: ^4.3.20 version: 4.3.20 @@ -61,7 +61,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.39 + version: 20.19.40 chai: specifier: ^4.5.0 version: 4.5.0 @@ -82,7 +82,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@20.19.39) + version: 4.23.0(@types/node@20.19.40) shx: specifier: ^0.4.0 version: 0.4.0 @@ -91,7 +91,7 @@ importers: version: 21.1.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.39)(typescript@5.9.3) + version: 10.9.2(@types/node@20.19.40)(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -99,7 +99,7 @@ importers: packages/contentstack-bootstrap: dependencies: '@contentstack/cli-cm-seed': - specifier: ~1.15.2 + specifier: ~1.15.3 version: link:../contentstack-seed '@contentstack/cli-command': specifier: ~1.8.2 @@ -112,7 +112,7 @@ importers: version: 1.18.3(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 inquirer: specifier: 8.2.7 version: 8.2.7(@types/node@14.18.63) @@ -121,11 +121,11 @@ importers: version: 2.1.6 tar: specifier: ^7.5.11 - version: 7.5.13 + version: 7.5.15 devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/inquirer': specifier: ^9.0.8 version: 9.0.9 @@ -164,13 +164,13 @@ importers: dependencies: '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@22.19.17) + version: 1.8.2(@types/node@22.19.18) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@22.19.17) + version: 1.18.3(@types/node@22.19.18) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -204,13 +204,13 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@22.19.17) + version: 4.23.0(@types/node@22.19.18) sinon: specifier: ^21.0.1 version: 21.1.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.17)(typescript@4.9.5) + version: 10.9.2(@types/node@22.19.18)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -219,16 +219,16 @@ importers: dependencies: '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@22.19.17) + version: 1.8.2(@types/node@22.19.18) '@contentstack/cli-config': specifier: ~1.20.3 - version: 1.20.3(@types/node@22.19.17) + version: 1.20.3(@types/node@22.19.18) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@22.19.17) + version: 1.18.3(@types/node@22.19.18) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -237,7 +237,7 @@ importers: version: 16.6.1 inquirer: specifier: 8.2.7 - version: 8.2.7(@types/node@22.19.17) + version: 8.2.7(@types/node@22.19.18) lodash: specifier: ^4.18.1 version: 4.18.1 @@ -247,7 +247,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) chai: specifier: ^4.5.0 version: 4.5.0 @@ -265,7 +265,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@22.19.17) + version: 4.23.0(@types/node@22.19.18) packages/contentstack-clone: dependencies: @@ -273,10 +273,10 @@ importers: specifier: ^1.6.0 version: 1.6.0 '@contentstack/cli-cm-export': - specifier: ~1.24.3 + specifier: ~1.25.0 version: link:../contentstack-export '@contentstack/cli-cm-import': - specifier: ~1.32.3 + specifier: ~1.33.0 version: link:../contentstack-import '@contentstack/cli-command': specifier: ~1.8.2 @@ -286,7 +286,7 @@ importers: version: 1.18.3(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 chalk: specifier: ^4.1.2 version: 4.1.2 @@ -311,7 +311,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/chai': specifier: ^4.3.0 version: 4.3.20 @@ -326,7 +326,7 @@ importers: version: 10.0.20 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) chai: specifier: ^4.5.0 version: 4.5.0 @@ -359,16 +359,16 @@ importers: dependencies: '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@22.19.17) + version: 1.8.2(@types/node@22.19.18) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@22.19.17) + version: 1.18.3(@types/node@22.19.18) '@contentstack/cli-variants': - specifier: ~1.4.3 + specifier: ~1.5.0 version: link:../contentstack-variants '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 async: specifier: ^3.2.6 version: 3.2.6 @@ -402,10 +402,10 @@ importers: devDependencies: '@contentstack/cli-auth': specifier: ~1.8.0 - version: 1.8.2(@types/node@22.19.17) + version: 1.8.2(@types/node@22.19.18) '@contentstack/cli-config': specifier: ~1.20.1 - version: 1.20.3(@types/node@22.19.17) + version: 1.20.3(@types/node@22.19.18) '@contentstack/cli-dev-dependencies': specifier: ^1.3.1 version: 1.3.1 @@ -414,7 +414,7 @@ importers: version: 6.2.46 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -453,7 +453,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@22.19.17) + version: 4.23.0(@types/node@22.19.18) sinon: specifier: ^17.0.1 version: 17.0.2 @@ -462,7 +462,7 @@ importers: version: 0.5.21 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.17)(typescript@4.9.5) + version: 10.9.2(@types/node@22.19.18)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -471,26 +471,26 @@ importers: dependencies: '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@20.19.39) + version: 1.8.2(@types/node@20.19.40) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@20.19.39) + version: 1.18.3(@types/node@20.19.40) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 fast-csv: specifier: ^4.3.6 version: 4.3.6 inquirer: specifier: 8.2.7 - version: 8.2.7(@types/node@20.19.39) + version: 8.2.7(@types/node@20.19.40) inquirer-checkbox-plus-prompt: specifier: 1.4.2 - version: 1.4.2(inquirer@8.2.7(@types/node@20.19.39)) + version: 1.4.2(inquirer@8.2.7(@types/node@20.19.40)) devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/chai': specifier: ^4.3.20 version: 4.3.20 @@ -502,7 +502,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.39 + version: 20.19.40 chai: specifier: ^4.5.0 version: 4.5.0 @@ -523,13 +523,13 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@20.19.39) + version: 4.23.0(@types/node@20.19.40) sinon: specifier: ^19.0.5 version: 19.0.5 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.39)(typescript@5.9.3) + version: 10.9.2(@types/node@20.19.40)(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -546,11 +546,11 @@ importers: specifier: ~1.18.3 version: 1.18.3(@types/node@14.18.63)(debug@4.4.3) '@contentstack/cli-variants': - specifier: ~1.4.3 + specifier: ~1.5.0 version: link:../contentstack-variants '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 big-json: specifier: ^3.2.0 version: 3.2.0 @@ -565,7 +565,7 @@ importers: version: 4.4.3(supports-color@8.1.1) fs-extra: specifier: ^11.3.3 - version: 11.3.4 + version: 11.3.5 lodash: specifier: ^4.18.1 version: 4.18.1 @@ -587,7 +587,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -608,7 +608,7 @@ importers: version: 14.18.63 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) eslint: specifier: ^9.26.0 version: 9.39.4 @@ -641,7 +641,7 @@ importers: version: 1.18.3(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 big-json: specifier: ^3.2.0 version: 3.2.0 @@ -650,7 +650,7 @@ importers: version: 4.1.2 fs-extra: specifier: ^11.3.0 - version: 11.3.4 + version: 11.3.5 lodash: specifier: ^4.18.1 version: 4.18.1 @@ -684,7 +684,7 @@ importers: version: 14.18.63 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) chai: specifier: ^4.5.0 version: 4.5.0 @@ -717,7 +717,7 @@ importers: version: 1.18.3(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 async: specifier: ^3.2.6 version: 3.2.6 @@ -742,7 +742,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/mocha': specifier: ^8.2.3 version: 8.2.3 @@ -789,20 +789,20 @@ importers: packages/contentstack-query-export: dependencies: '@contentstack/cli-cm-export': - specifier: ~1.24.3 + specifier: ~1.25.0 version: link:../contentstack-export '@contentstack/cli-command': specifier: ~1.8.2 - version: 1.8.2(@types/node@20.19.39) + version: 1.8.2(@types/node@20.19.40) '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@20.19.39) + version: 1.18.3(@types/node@20.19.40) '@contentstack/cli-variants': - specifier: ~1.4.3 + specifier: ~1.5.0 version: link:../contentstack-variants '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 async: specifier: ^3.2.6 version: 3.2.6 @@ -842,7 +842,7 @@ importers: version: 6.2.46 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -857,7 +857,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.19.39 - version: 20.19.39 + version: 20.19.40 '@types/progress-stream': specifier: ^2.0.5 version: 2.0.5 @@ -890,13 +890,13 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.0(@types/node@20.19.39) + version: 4.23.0(@types/node@20.19.40) sinon: specifier: ^17.0.2 version: 17.0.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.39)(typescript@4.9.5) + version: 10.9.2(@types/node@20.19.40)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -904,7 +904,7 @@ importers: packages/contentstack-seed: dependencies: '@contentstack/cli-cm-import': - specifier: ~1.32.3 + specifier: ~1.33.0 version: link:../contentstack-import '@contentstack/cli-command': specifier: ~1.8.2 @@ -920,7 +920,7 @@ importers: version: 1.0.4 tar: specifier: ^7.5.11 - version: 7.5.13 + version: 7.5.15 tmp: specifier: 0.2.4 version: 0.2.4 @@ -972,10 +972,10 @@ importers: dependencies: '@contentstack/cli-utilities': specifier: ~1.18.3 - version: 1.18.3(@types/node@20.19.39) + version: 1.18.3(@types/node@20.19.40) '@oclif/core': specifier: ^4.10.5 - version: 4.11.0 + version: 4.11.1 lodash: specifier: ^4.18.1 version: 4.18.1 @@ -991,10 +991,10 @@ importers: version: 1.3.1 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.0) + version: 4.1.18(@oclif/core@4.11.1) '@types/node': specifier: ^20.19.39 - version: 20.19.39 + version: 20.19.40 mocha: specifier: ^10.8.2 version: 10.8.2 @@ -1003,7 +1003,7 @@ importers: version: 15.1.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.39)(typescript@5.9.3) + version: 10.9.2(@types/node@20.19.40)(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1797,8 +1797,8 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@oclif/core@4.11.0': - resolution: {integrity: sha512-nTkRMgxFlIKQIIYGvhO2JMsLSQ1aHPHblHfFgxgoBrGK8Ao/8wxc4eNOIv/+t8dMXliZd7mREVr6la4aXXXg5A==} + '@oclif/core@4.11.1': + resolution: {integrity: sha512-+N5yqeoOKPnT0p+ZJiNutMILsZukZrEpsVup24XERla594EkGSWS9tiCqRfvzr1xfvf/AhM9pb0yPaf8L3Y9Uw==} engines: {node: '>=18.0.0'} '@oclif/core@4.9.0': @@ -1887,8 +1887,8 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@sinonjs/fake-timers@15.3.2': - resolution: {integrity: sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==} + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} '@sinonjs/samsam@10.0.2': resolution: {integrity: sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A==} @@ -2169,8 +2169,8 @@ packages: '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -2232,11 +2232,11 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/node@20.19.39': - resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} + '@types/node@20.19.40': + resolution: {integrity: sha512-xxx6M2IpSTnnKcR0cMvIiohkiCx20/oRPtWGbenFygKCGl3zqUzdNjQ/1V4solq1LU+dgv0nQzeGOuqkqZGg0Q==} - '@types/node@22.19.17': - resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + '@types/node@22.19.18': + resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2305,11 +2305,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.59.1': - resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.1 + '@typescript-eslint/parser': ^8.59.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' @@ -2323,15 +2323,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.59.1': - resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} 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.59.1': - resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2348,12 +2348,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.59.1': - resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.1': - resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2378,8 +2378,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.59.1': - resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2397,8 +2397,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.59.1': - resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -2428,8 +2428,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.59.1': - resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2452,8 +2452,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.59.1': - resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2471,12 +2471,12 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.59.1': - resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -2853,8 +2853,8 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -2938,8 +2938,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001791: - resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -3393,8 +3393,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.349: - resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + electron-to-chromium@1.5.352: + resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} elegant-spinner@1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} @@ -3413,8 +3413,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.21.1: + resolution: {integrity: sha512-8p7DUVq6XJnZEz9W4oSwiwycxBIjHjRzYb3Je3zVN+geKTRQKzAkR/K4PBExlS0090d9nshak6phMUxr3PDjmQ==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -3774,11 +3774,11 @@ packages: fast-levenshtein@3.0.0: resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - fast-xml-builder@1.1.7: - resolution: {integrity: sha512-Yh7/7rQuMXICNr0oMYDR2yHP6oUvmQsTToFeOWj/kIDhAwQ+c4Ol/lbcwOmEM5OHYQmh6S6EQSQ1sljCKP36bQ==} + fast-xml-builder@1.1.9: + resolution: {integrity: sha512-jcyKVSEX13iseJqg7n/KWw+xnu/7fdrZ333Fac54KjHDIELVCfDDJXYIm6DTJ0Su4gSzrhqiK0DzY/wZbF40mw==} fast-xml-parser@5.7.2: resolution: {integrity: sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==} @@ -3918,8 +3918,8 @@ packages: fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - fs-extra@11.3.4: - resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} engines: {node: '>=14.14'} fs-extra@8.1.0: @@ -4272,8 +4272,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -4863,8 +4863,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -5344,8 +5344,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm@10.33.2: - resolution: {integrity: sha512-qQ+vb+6rca1sblf5Tg/hoS9dzCLNdU20CulZPraj4LaxLjVAIYuzeuCDQEsfLObbKkEh6XmCm0r/lLmfSdoc+A==} + pnpm@10.33.4: + resolution: {integrity: sha512-HGezs1my1AgRm6HtKJ80uPw8aHNBK+xv0mT73IJInlEPy+y5zp0i2ufzt2Jp2EQQRgFL3KU7mXnNelYa1jG4AA==} engines: {node: '>=18.12'} hasBin: true @@ -5929,8 +5929,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@2.2.3: - resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} + strnum@2.3.0: + resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} @@ -5964,8 +5964,8 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar@7.5.13: - resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} engines: {node: '>=18'} temp-path@1.0.0: @@ -6176,8 +6176,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.59.1: - resolution: {integrity: sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==} + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -7128,11 +7128,11 @@ snapshots: '@colors/colors@1.6.0': {} - '@contentstack/cli-auth@1.8.2(@types/node@22.19.17)': + '@contentstack/cli-auth@1.8.2(@types/node@22.19.18)': dependencies: - '@contentstack/cli-command': 1.8.2(@types/node@22.19.17) - '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.17) - '@oclif/core': 4.11.0 + '@contentstack/cli-command': 1.8.2(@types/node@22.19.18) + '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.18) + '@oclif/core': 4.11.1 otplib: 12.0.1 transitivePeerDependencies: - '@types/node' @@ -7141,7 +7141,7 @@ snapshots: '@contentstack/cli-command@1.8.2(@types/node@14.18.63)': dependencies: '@contentstack/cli-utilities': 1.18.3(@types/node@14.18.63) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -7150,25 +7150,25 @@ snapshots: '@contentstack/cli-command@1.8.2(@types/node@14.18.63)(debug@4.4.3)': dependencies: '@contentstack/cli-utilities': 1.18.3(@types/node@14.18.63)(debug@4.4.3) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' - debug - '@contentstack/cli-command@1.8.2(@types/node@20.19.39)': + '@contentstack/cli-command@1.8.2(@types/node@20.19.40)': dependencies: - '@contentstack/cli-utilities': 1.18.3(@types/node@20.19.39) - '@oclif/core': 4.11.0 + '@contentstack/cli-utilities': 1.18.3(@types/node@20.19.40) + '@oclif/core': 4.11.1 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' - debug - '@contentstack/cli-command@1.8.2(@types/node@22.19.17)': + '@contentstack/cli-command@1.8.2(@types/node@22.19.18)': dependencies: - '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.17) - '@oclif/core': 4.11.0 + '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.18) + '@oclif/core': 4.11.1 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -7179,25 +7179,25 @@ snapshots: '@contentstack/cli-command': 1.8.2(@types/node@14.18.63) '@contentstack/cli-utilities': 1.18.3(@types/node@14.18.63) '@contentstack/utils': 1.9.1 - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 transitivePeerDependencies: - '@types/node' - debug - '@contentstack/cli-config@1.20.3(@types/node@22.19.17)': + '@contentstack/cli-config@1.20.3(@types/node@22.19.18)': dependencies: - '@contentstack/cli-command': 1.8.2(@types/node@22.19.17) - '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.17) + '@contentstack/cli-command': 1.8.2(@types/node@22.19.18) + '@contentstack/cli-utilities': 1.18.3(@types/node@22.19.18) '@contentstack/utils': 1.9.1 - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 transitivePeerDependencies: - '@types/node' - debug '@contentstack/cli-dev-dependencies@1.3.1': dependencies: - '@oclif/core': 4.11.0 - '@oclif/test': 4.1.18(@oclif/core@4.11.0) + '@oclif/core': 4.11.1 + '@oclif/test': 4.1.18(@oclif/core@4.11.1) fancy-test: 2.0.42 lodash: 4.18.1 transitivePeerDependencies: @@ -7207,7 +7207,7 @@ snapshots: dependencies: '@contentstack/management': 1.30.2(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.2(debug@4.4.3) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 axios: 1.15.2(debug@4.4.3) chalk: 4.1.2 cli-cursor: 3.1.0 @@ -7243,7 +7243,7 @@ snapshots: dependencies: '@contentstack/management': 1.30.2(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.2(debug@4.4.3) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 axios: 1.15.2(debug@4.4.3) chalk: 4.1.2 cli-cursor: 3.1.0 @@ -7275,11 +7275,11 @@ snapshots: - '@types/node' - debug - '@contentstack/cli-utilities@1.18.3(@types/node@20.19.39)': + '@contentstack/cli-utilities@1.18.3(@types/node@20.19.40)': dependencies: '@contentstack/management': 1.30.2(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.2(debug@4.4.3) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 axios: 1.15.2(debug@4.4.3) chalk: 4.1.2 cli-cursor: 3.1.0 @@ -7288,7 +7288,7 @@ snapshots: conf: 10.2.0 dotenv: 16.6.1 figures: 3.2.0 - inquirer: 8.2.7(@types/node@20.19.39) + inquirer: 8.2.7(@types/node@20.19.40) inquirer-search-checkbox: 1.0.0 inquirer-search-list: 1.2.6 js-yaml: 4.1.1 @@ -7311,11 +7311,11 @@ snapshots: - '@types/node' - debug - '@contentstack/cli-utilities@1.18.3(@types/node@22.19.17)': + '@contentstack/cli-utilities@1.18.3(@types/node@22.19.18)': dependencies: '@contentstack/management': 1.30.2(debug@4.4.3) '@contentstack/marketplace-sdk': 1.5.2(debug@4.4.3) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 axios: 1.15.2(debug@4.4.3) chalk: 4.1.2 cli-cursor: 3.1.0 @@ -7324,7 +7324,7 @@ snapshots: conf: 10.2.0 dotenv: 16.6.1 figures: 3.2.0 - inquirer: 8.2.7(@types/node@22.19.17) + inquirer: 8.2.7(@types/node@22.19.18) inquirer-search-checkbox: 1.0.0 inquirer-search-list: 1.2.6 js-yaml: 4.1.1 @@ -7399,8 +7399,8 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.59.1 + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.59.2 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -7574,25 +7574,25 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/checkbox@4.3.2(@types/node@20.19.39)': + '@inquirer/checkbox@4.3.2(@types/node@20.19.40)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/type': 3.0.10(@types/node@20.19.40) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/checkbox@4.3.2(@types/node@22.19.17)': + '@inquirer/checkbox@4.3.2(@types/node@22.19.18)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.18) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/confirm@3.2.0': dependencies: @@ -7606,19 +7606,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/confirm@5.1.21(@types/node@20.19.39)': + '@inquirer/confirm@5.1.21(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/confirm@5.1.21(@types/node@22.19.17)': + '@inquirer/confirm@5.1.21(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/core@10.3.2(@types/node@14.18.63)': dependencies: @@ -7633,38 +7633,38 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/core@10.3.2(@types/node@20.19.39)': + '@inquirer/core@10.3.2(@types/node@20.19.40)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/type': 3.0.10(@types/node@20.19.40) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/core@10.3.2(@types/node@22.19.17)': + '@inquirer/core@10.3.2(@types/node@22.19.18)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.18) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/core@9.2.1': dependencies: '@inquirer/figures': 1.0.15 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -7682,21 +7682,21 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/editor@4.2.23(@types/node@20.19.39)': + '@inquirer/editor@4.2.23(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/external-editor': 1.0.3(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/editor@4.2.23(@types/node@22.19.17)': + '@inquirer/editor@4.2.23(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/external-editor': 1.0.3(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/expand@4.0.23(@types/node@14.18.63)': dependencies: @@ -7706,21 +7706,21 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/expand@4.0.23(@types/node@20.19.39)': + '@inquirer/expand@4.0.23(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/expand@4.0.23(@types/node@22.19.17)': + '@inquirer/expand@4.0.23(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/external-editor@1.0.3(@types/node@14.18.63)': dependencies: @@ -7729,19 +7729,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/external-editor@1.0.3(@types/node@20.19.39)': + '@inquirer/external-editor@1.0.3(@types/node@20.19.40)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/external-editor@1.0.3(@types/node@22.19.17)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.18)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/figures@1.0.15': {} @@ -7757,19 +7757,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/input@4.3.1(@types/node@20.19.39)': + '@inquirer/input@4.3.1(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/input@4.3.1(@types/node@22.19.17)': + '@inquirer/input@4.3.1(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/number@3.0.23(@types/node@14.18.63)': dependencies: @@ -7778,19 +7778,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/number@3.0.23(@types/node@20.19.39)': + '@inquirer/number@3.0.23(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/number@3.0.23(@types/node@22.19.17)': + '@inquirer/number@3.0.23(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/password@4.0.23(@types/node@14.18.63)': dependencies: @@ -7800,21 +7800,21 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/password@4.0.23(@types/node@20.19.39)': + '@inquirer/password@4.0.23(@types/node@20.19.40)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/password@4.0.23(@types/node@22.19.17)': + '@inquirer/password@4.0.23(@types/node@22.19.18)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/prompts@7.10.1(@types/node@14.18.63)': dependencies: @@ -7831,35 +7831,35 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/prompts@7.10.1(@types/node@20.19.39)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@20.19.39) - '@inquirer/confirm': 5.1.21(@types/node@20.19.39) - '@inquirer/editor': 4.2.23(@types/node@20.19.39) - '@inquirer/expand': 4.0.23(@types/node@20.19.39) - '@inquirer/input': 4.3.1(@types/node@20.19.39) - '@inquirer/number': 3.0.23(@types/node@20.19.39) - '@inquirer/password': 4.0.23(@types/node@20.19.39) - '@inquirer/rawlist': 4.1.11(@types/node@20.19.39) - '@inquirer/search': 3.2.2(@types/node@20.19.39) - '@inquirer/select': 4.4.2(@types/node@20.19.39) + '@inquirer/prompts@7.10.1(@types/node@20.19.40)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@20.19.40) + '@inquirer/confirm': 5.1.21(@types/node@20.19.40) + '@inquirer/editor': 4.2.23(@types/node@20.19.40) + '@inquirer/expand': 4.0.23(@types/node@20.19.40) + '@inquirer/input': 4.3.1(@types/node@20.19.40) + '@inquirer/number': 3.0.23(@types/node@20.19.40) + '@inquirer/password': 4.0.23(@types/node@20.19.40) + '@inquirer/rawlist': 4.1.11(@types/node@20.19.40) + '@inquirer/search': 3.2.2(@types/node@20.19.40) + '@inquirer/select': 4.4.2(@types/node@20.19.40) optionalDependencies: - '@types/node': 20.19.39 - - '@inquirer/prompts@7.10.1(@types/node@22.19.17)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.17) - '@inquirer/confirm': 5.1.21(@types/node@22.19.17) - '@inquirer/editor': 4.2.23(@types/node@22.19.17) - '@inquirer/expand': 4.0.23(@types/node@22.19.17) - '@inquirer/input': 4.3.1(@types/node@22.19.17) - '@inquirer/number': 3.0.23(@types/node@22.19.17) - '@inquirer/password': 4.0.23(@types/node@22.19.17) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.17) - '@inquirer/search': 3.2.2(@types/node@22.19.17) - '@inquirer/select': 4.4.2(@types/node@22.19.17) + '@types/node': 20.19.40 + + '@inquirer/prompts@7.10.1(@types/node@22.19.18)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.18) + '@inquirer/confirm': 5.1.21(@types/node@22.19.18) + '@inquirer/editor': 4.2.23(@types/node@22.19.18) + '@inquirer/expand': 4.0.23(@types/node@22.19.18) + '@inquirer/input': 4.3.1(@types/node@22.19.18) + '@inquirer/number': 3.0.23(@types/node@22.19.18) + '@inquirer/password': 4.0.23(@types/node@22.19.18) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.18) + '@inquirer/search': 3.2.2(@types/node@22.19.18) + '@inquirer/select': 4.4.2(@types/node@22.19.18) optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/rawlist@4.1.11(@types/node@14.18.63)': dependencies: @@ -7869,21 +7869,21 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/rawlist@4.1.11(@types/node@20.19.39)': + '@inquirer/rawlist@4.1.11(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) + '@inquirer/type': 3.0.10(@types/node@20.19.40) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/rawlist@4.1.11(@types/node@22.19.17)': + '@inquirer/rawlist@4.1.11(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) + '@inquirer/type': 3.0.10(@types/node@22.19.18) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/search@3.2.2(@types/node@14.18.63)': dependencies: @@ -7894,23 +7894,23 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/search@3.2.2(@types/node@20.19.39)': + '@inquirer/search@3.2.2(@types/node@20.19.40)': dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/type': 3.0.10(@types/node@20.19.40) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/search@3.2.2(@types/node@22.19.17)': + '@inquirer/search@3.2.2(@types/node@22.19.18)': dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.18) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/select@2.5.0': dependencies: @@ -7930,25 +7930,25 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/select@4.4.2(@types/node@20.19.39)': + '@inquirer/select@4.4.2(@types/node@20.19.40)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.39) + '@inquirer/core': 10.3.2(@types/node@20.19.40) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.39) + '@inquirer/type': 3.0.10(@types/node@20.19.40) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/select@4.4.2(@types/node@22.19.17)': + '@inquirer/select@4.4.2(@types/node@22.19.18)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/core': 10.3.2(@types/node@22.19.18) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.18) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@inquirer/type@1.5.5': dependencies: @@ -7962,13 +7962,13 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/type@3.0.10(@types/node@20.19.39)': + '@inquirer/type@3.0.10(@types/node@20.19.40)': optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 - '@inquirer/type@3.0.10(@types/node@22.19.17)': + '@inquirer/type@3.0.10(@types/node@22.19.18)': optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@isaacs/fs-minipass@4.0.1': dependencies: @@ -7987,7 +7987,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -8000,14 +8000,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.39)(ts-node@8.10.2(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@20.19.40)(ts-node@8.10.2(typescript@4.9.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8032,7 +8032,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -8050,7 +8050,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.39 + '@types/node': 20.19.40 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8072,7 +8072,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -8141,7 +8141,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/yargs': 15.0.20 chalk: 4.1.2 @@ -8150,7 +8150,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8205,7 +8205,7 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@oclif/core@4.11.0': + '@oclif/core@4.11.1': dependencies: ansi-escapes: 4.3.2 ansis: 3.17.0 @@ -8249,30 +8249,30 @@ snapshots: '@oclif/plugin-help@6.2.46': dependencies: - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 '@oclif/plugin-not-found@3.2.82(@types/node@14.18.63)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@14.18.63) - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-not-found@3.2.82(@types/node@20.19.39)': + '@oclif/plugin-not-found@3.2.82(@types/node@20.19.40)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@20.19.39) - '@oclif/core': 4.11.0 + '@inquirer/prompts': 7.10.1(@types/node@20.19.40) + '@oclif/core': 4.11.1 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-not-found@3.2.82(@types/node@22.19.17)': + '@oclif/plugin-not-found@3.2.82(@types/node@22.19.18)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@22.19.17) - '@oclif/core': 4.11.0 + '@inquirer/prompts': 7.10.1(@types/node@22.19.18) + '@oclif/core': 4.11.1 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -8280,7 +8280,7 @@ snapshots: '@oclif/plugin-warn-if-update-available@3.1.62': dependencies: - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 ansis: 3.17.0 debug: 4.4.3(supports-color@8.1.1) http-call: 5.3.0 @@ -8289,9 +8289,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@oclif/test@4.1.18(@oclif/core@4.11.0)': + '@oclif/test@4.1.18(@oclif/core@4.11.1)': dependencies: - '@oclif/core': 4.11.0 + '@oclif/core': 4.11.1 ansis: 3.17.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: @@ -8362,7 +8362,7 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers@15.3.2': + '@sinonjs/fake-timers@15.4.0': dependencies: '@sinonjs/commons': 3.0.1 @@ -8718,7 +8718,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8730,7 +8730,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8742,7 +8742,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8755,7 +8755,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@8.57.1)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/types': 8.59.2 eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8765,7 +8765,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/types': 8.59.2 eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8812,22 +8812,22 @@ snapshots: '@types/big-json@3.2.5': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/bluebird@3.5.42': {} '@types/chai@4.3.20': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/http-cache-semantics@4.2.0': {} @@ -8857,7 +8857,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/linkify-it@5.0.0': {} @@ -8872,7 +8872,7 @@ snapshots: '@types/mkdirp@1.0.2': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/mocha@10.0.10': {} @@ -8880,15 +8880,15 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/node@14.18.63': {} - '@types/node@20.19.39': + '@types/node@20.19.40': dependencies: undici-types: 6.21.0 - '@types/node@22.19.17': + '@types/node@22.19.18': dependencies: undici-types: 6.21.0 @@ -8896,7 +8896,7 @@ snapshots: '@types/progress-stream@2.0.5': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/semver@7.7.1': {} @@ -8914,12 +8914,12 @@ snapshots: '@types/tar@6.1.13': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 minipass: 4.2.8 '@types/through@0.0.33': dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/tmp@0.2.6': {} @@ -8937,10 +8937,10 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@9.39.4)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@9.39.4)(typescript@4.9.5) @@ -8996,14 +8996,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/parser': 8.59.2(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.2 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9012,14 +9012,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.2 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9028,14 +9028,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.2 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9070,55 +9070,55 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.1(typescript@4.9.5)': + '@typescript-eslint/project-service@8.59.2(typescript@4.9.5)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@4.9.5) - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3(supports-color@8.1.1) typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.59.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@5.9.3) - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: @@ -9139,16 +9139,16 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.59.1': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.59.1(typescript@4.9.5)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@4.9.5)': dependencies: typescript: 4.9.5 - '@typescript-eslint/tsconfig-utils@8.59.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -9188,11 +9188,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.1(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.59.2(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 2.5.0(typescript@4.9.5) @@ -9200,11 +9200,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.1(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.59.2(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 ts-api-utils: 2.5.0(typescript@4.9.5) @@ -9212,11 +9212,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.1(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.59.2(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.4 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -9230,7 +9230,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.59.1': {} + '@typescript-eslint/types@8.59.2': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: @@ -9306,12 +9306,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.1(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@4.9.5)': dependencies: - '@typescript-eslint/project-service': 8.59.1(typescript@4.9.5) - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@4.9.5) - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/project-service': 8.59.2(typescript@4.9.5) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 @@ -9321,12 +9321,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@5.9.3) - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/project-service': 8.59.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 @@ -9401,34 +9401,34 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.59.1(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/utils@8.59.2(eslint@8.57.1)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) eslint: 8.57.1 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.1(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/utils@8.59.2(eslint@9.39.4)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) eslint: 9.39.4 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.1(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.59.2(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@5.9.3) eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: @@ -9449,12 +9449,12 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.59.1': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.3.1': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -9549,7 +9549,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9817,7 +9817,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -9834,8 +9834,8 @@ snapshots: browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.27 - caniuse-lite: 1.0.30001791 - electron-to-chromium: 1.5.349 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.352 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -9918,7 +9918,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001791: {} + caniuse-lite@1.0.30001792: {} capital-case@1.0.4: dependencies: @@ -10396,7 +10396,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.349: {} + electron-to-chromium@1.5.352: {} elegant-spinner@1.0.1: {} @@ -10410,7 +10410,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.21.0: + enhanced-resolve@5.21.1: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -10554,7 +10554,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@9.39.4)(typescript@5.9.3) eslint-config-xo-space: 0.35.0(eslint@9.39.4) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) eslint-plugin-mocha: 10.5.0(eslint@9.39.4) eslint-plugin-n: 15.7.0(eslint@9.39.4) eslint-plugin-perfectionist: 2.11.0(eslint@9.39.4)(typescript@5.9.3) @@ -10593,19 +10593,19 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@stylistic/eslint-plugin': 3.1.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.1)(typescript@4.9.5) eslint-config-oclif: 5.2.2(eslint@8.57.1) eslint-config-xo: 0.49.0(eslint@8.57.1) eslint-config-xo-space: 0.35.0(eslint@8.57.1) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsdoc: 50.8.0(eslint@8.57.1) eslint-plugin-mocha: 10.5.0(eslint@8.57.1) eslint-plugin-n: 17.24.0(eslint@8.57.1)(typescript@4.9.5) eslint-plugin-perfectionist: 4.15.1(eslint@8.57.1)(typescript@4.9.5) eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) - typescript-eslint: 8.59.1(eslint@8.57.1)(typescript@4.9.5) + typescript-eslint: 8.59.2(eslint@8.57.1)(typescript@4.9.5) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10619,19 +10619,19 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@stylistic/eslint-plugin': 3.1.0(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@4.9.5) eslint-config-oclif: 5.2.2(eslint@9.39.4) eslint-config-xo: 0.49.0(eslint@9.39.4) eslint-config-xo-space: 0.35.0(eslint@9.39.4) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) eslint-plugin-jsdoc: 50.8.0(eslint@9.39.4) eslint-plugin-mocha: 10.5.0(eslint@9.39.4) eslint-plugin-n: 17.24.0(eslint@9.39.4)(typescript@4.9.5) eslint-plugin-perfectionist: 4.15.1(eslint@9.39.4)(typescript@4.9.5) eslint-plugin-unicorn: 56.0.1(eslint@9.39.4) - typescript-eslint: 8.59.1(eslint@9.39.4)(typescript@4.9.5) + typescript-eslint: 8.59.2(eslint@9.39.4)(typescript@4.9.5) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10645,19 +10645,19 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@stylistic/eslint-plugin': 3.1.0(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@5.9.3) eslint-config-oclif: 5.2.2(eslint@9.39.4) eslint-config-xo: 0.49.0(eslint@9.39.4) eslint-config-xo-space: 0.35.0(eslint@9.39.4) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) eslint-plugin-jsdoc: 50.8.0(eslint@9.39.4) eslint-plugin-mocha: 10.5.0(eslint@9.39.4) eslint-plugin-n: 17.24.0(eslint@9.39.4)(typescript@5.9.3) eslint-plugin-perfectionist: 4.15.1(eslint@9.39.4)(typescript@5.9.3) eslint-plugin-unicorn: 56.0.1(eslint@9.39.4) - typescript-eslint: 8.59.1(eslint@9.39.4)(typescript@5.9.3) + typescript-eslint: 8.59.2(eslint@9.39.4)(typescript@5.9.3) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10706,7 +10706,7 @@ snapshots: eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color @@ -10722,7 +10722,7 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) transitivePeerDependencies: - supports-color @@ -10737,7 +10737,7 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10752,7 +10752,7 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) transitivePeerDependencies: - supports-color @@ -10778,33 +10778,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4) @@ -10850,7 +10850,7 @@ snapshots: eslint-import-resolver-node: 0.3.10 eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -10866,7 +10866,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10879,7 +10879,7 @@ snapshots: eslint-import-resolver-node: 0.3.10 eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -10895,7 +10895,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10906,9 +10906,9 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -10918,13 +10918,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.1)(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.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10935,9 +10935,9 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -10947,13 +10947,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(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.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10964,9 +10964,9 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4))(eslint@9.39.4))(eslint@9.39.4) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -10976,7 +10976,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -11035,7 +11035,7 @@ snapshots: eslint-plugin-es: 4.1.0(eslint@8.57.1) eslint-utils: 3.0.0(eslint@8.57.1) ignore: 5.3.2 - is-core-module: 2.16.1 + is-core-module: 2.16.2 minimatch: 3.1.5 resolve: 1.22.12 semver: 7.7.4 @@ -11047,7 +11047,7 @@ snapshots: eslint-plugin-es: 4.1.0(eslint@9.39.4) eslint-utils: 3.0.0(eslint@9.39.4) ignore: 5.3.2 - is-core-module: 2.16.1 + is-core-module: 2.16.2 minimatch: 3.1.5 resolve: 1.22.12 semver: 7.7.4 @@ -11055,7 +11055,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@8.57.1)(typescript@4.9.5): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.1 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) get-tsconfig: 4.14.0 @@ -11070,7 +11070,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@9.39.4)(typescript@4.9.5): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.1 eslint: 9.39.4 eslint-plugin-es-x: 7.8.0(eslint@9.39.4) get-tsconfig: 4.14.0 @@ -11085,7 +11085,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@9.39.4)(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.1 eslint: 9.39.4 eslint-plugin-es-x: 7.8.0(eslint@9.39.4) get-tsconfig: 4.14.0 @@ -11119,8 +11119,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@8.57.1)(typescript@4.9.5): dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -11129,8 +11129,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.4)(typescript@4.9.5): dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -11139,8 +11139,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -11273,7 +11273,7 @@ snapshots: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.1 ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -11320,7 +11320,7 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -11418,7 +11418,7 @@ snapshots: dependencies: '@types/chai': 4.3.20 '@types/lodash': 4.17.24 - '@types/node': 20.19.39 + '@types/node': 20.19.40 '@types/sinon': 17.0.4 lodash: 4.18.1 mock-stdin: 1.0.0 @@ -11450,18 +11450,18 @@ snapshots: dependencies: fastest-levenshtein: 1.0.16 - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} - fast-xml-builder@1.1.7: + fast-xml-builder@1.1.9: dependencies: path-expression-matcher: 1.5.0 fast-xml-parser@5.7.2: dependencies: '@nodable/entities': 2.1.0 - fast-xml-builder: 1.1.7 + fast-xml-builder: 1.1.9 path-expression-matcher: 1.5.0 - strnum: 2.2.3 + strnum: 2.3.0 fastest-levenshtein@1.0.16: {} @@ -11590,7 +11590,7 @@ snapshots: fromentries@1.3.2: {} - fs-extra@11.3.4: + fs-extra@11.3.5: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -11873,12 +11873,12 @@ snapshots: ini@1.3.8: {} - inquirer-checkbox-plus-prompt@1.4.2(inquirer@8.2.7(@types/node@20.19.39)): + inquirer-checkbox-plus-prompt@1.4.2(inquirer@8.2.7(@types/node@20.19.40)): dependencies: chalk: 4.1.2 cli-cursor: 3.1.0 figures: 3.2.0 - inquirer: 8.2.7(@types/node@20.19.39) + inquirer: 8.2.7(@types/node@20.19.40) lodash: 4.18.1 rxjs: 6.6.7 @@ -11933,9 +11933,9 @@ snapshots: transitivePeerDependencies: - '@types/node' - inquirer@8.2.7(@types/node@20.19.39): + inquirer@8.2.7(@types/node@20.19.40): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@20.19.39) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.40) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -11953,9 +11953,9 @@ snapshots: transitivePeerDependencies: - '@types/node' - inquirer@8.2.7(@types/node@22.19.17): + inquirer@8.2.7(@types/node@22.19.18): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@22.19.17) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.18) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -12030,7 +12030,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -12251,7 +12251,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 @@ -12321,7 +12321,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.39)(ts-node@8.10.2(typescript@4.9.5)): + jest-config@29.7.0(@types/node@20.19.40)(ts-node@8.10.2(typescript@4.9.5)): dependencies: '@babel/core': 7.29.0 '@jest/test-sequencer': 29.7.0 @@ -12346,7 +12346,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 ts-node: 8.10.2(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros @@ -12383,7 +12383,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12395,7 +12395,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.19.39 + '@types/node': 20.19.40 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12434,7 +12434,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -12469,7 +12469,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12497,7 +12497,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -12543,7 +12543,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12562,7 +12562,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.39 + '@types/node': 20.19.40 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12571,7 +12571,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.40 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12847,7 +12847,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.3.6: {} lru-cache@5.1.1: dependencies: @@ -12920,7 +12920,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -13014,7 +13014,7 @@ snapshots: nise@6.1.5: dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 15.3.2 + '@sinonjs/fake-timers': 15.4.0 just-extend: 6.2.0 path-to-regexp: 8.4.2 @@ -13187,7 +13187,7 @@ snapshots: - aws-crt - supports-color - oclif@4.23.0(@types/node@20.19.39): + oclif@4.23.0(@types/node@20.19.40): dependencies: '@aws-sdk/client-cloudfront': 3.1009.0 '@aws-sdk/client-s3': 3.1014.0 @@ -13196,7 +13196,7 @@ snapshots: '@inquirer/select': 2.5.0 '@oclif/core': 4.9.0 '@oclif/plugin-help': 6.2.46 - '@oclif/plugin-not-found': 3.2.82(@types/node@20.19.39) + '@oclif/plugin-not-found': 3.2.82(@types/node@20.19.40) '@oclif/plugin-warn-if-update-available': 3.1.62 ansis: 3.17.0 async-retry: 1.3.3 @@ -13218,7 +13218,7 @@ snapshots: - aws-crt - supports-color - oclif@4.23.0(@types/node@22.19.17): + oclif@4.23.0(@types/node@22.19.18): dependencies: '@aws-sdk/client-cloudfront': 3.1009.0 '@aws-sdk/client-s3': 3.1014.0 @@ -13227,7 +13227,7 @@ snapshots: '@inquirer/select': 2.5.0 '@oclif/core': 4.9.0 '@oclif/plugin-help': 6.2.46 - '@oclif/plugin-not-found': 3.2.82(@types/node@22.19.17) + '@oclif/plugin-not-found': 3.2.82(@types/node@22.19.18) '@oclif/plugin-warn-if-update-available': 3.1.62 ansis: 3.17.0 async-retry: 1.3.3 @@ -13402,7 +13402,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 path-to-regexp@6.3.0: {} @@ -13431,7 +13431,7 @@ snapshots: pluralize@8.0.0: {} - pnpm@10.33.2: {} + pnpm@10.33.4: {} possible-typed-array-names@1.1.0: {} @@ -13648,14 +13648,14 @@ snapshots: resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 @@ -13858,7 +13858,7 @@ snapshots: sinon@21.1.2: dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 15.3.2 + '@sinonjs/fake-timers': 15.4.0 '@sinonjs/samsam': 10.0.2 diff: 8.0.4 @@ -14060,7 +14060,7 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@2.2.3: {} + strnum@2.3.0: {} supports-color@2.0.0: {} @@ -14090,7 +14090,7 @@ snapshots: tapable@2.3.3: {} - tar@7.5.13: + tar@7.5.15: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -14221,14 +14221,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.19.39)(typescript@4.9.5): + ts-node@10.9.2(@types/node@20.19.40)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -14239,14 +14239,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.19.39)(typescript@5.9.3): + ts-node@10.9.2(@types/node@20.19.40)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.39 + '@types/node': 20.19.40 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -14257,14 +14257,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@22.19.17)(typescript@4.9.5): + ts-node@10.9.2(@types/node@22.19.18)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.17 + '@types/node': 22.19.18 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -14382,34 +14382,34 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.59.1(eslint@8.57.1)(typescript@4.9.5): + typescript-eslint@8.59.2(eslint@8.57.1)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.1(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 typescript: 4.9.5 transitivePeerDependencies: - supports-color - typescript-eslint@8.59.1(eslint@9.39.4)(typescript@4.9.5): + typescript-eslint@8.59.2(eslint@9.39.4)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/typescript-estree': 8.59.1(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 typescript: 4.9.5 transitivePeerDependencies: - supports-color - typescript-eslint@8.59.1(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.59.2(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.1(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.2(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: