diff --git a/packages/contentstack-export-to-csv/test/unit/base-command.test.ts b/packages/contentstack-export-to-csv/test/unit/base-command.test.ts index fb2277a51..68c97c23f 100644 --- a/packages/contentstack-export-to-csv/test/unit/base-command.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/base-command.test.ts @@ -1,6 +1,41 @@ import { expect } from 'chai'; +import sinon from 'sinon'; +import { Command as CsCommand } from '@contentstack/cli-command'; +import * as cliUtilities from '@contentstack/cli-utilities'; import { BaseCommand } from '../../src/base-command'; +/** Concrete command for exercising BaseCommand without production commands. */ +class TestExportCommand extends BaseCommand { + static id = 'cm:test-export-cmd'; + static description = 'Unit test command'; + async run(): Promise { + // intentionally empty + } + + public buildContext(apiKey?: string) { + return this.createCommandContext(apiKey); + } + + public async exposeCatch(err: Error & { exitCode?: number }) { + return this.catch(err); + } + + public async exposeFinally(err: Error | undefined) { + return this.finally(err); + } +} + +class CommandWithoutStaticId extends BaseCommand { + static description = 'No static id'; + async run(): Promise {} + + public buildContext() { + return this.createCommandContext(); + } +} + +const minimalConfig = { bin: 'csdx' } as any; + describe('BaseCommand', () => { describe('class definition', () => { it('should be an abstract class that extends Command', () => { @@ -14,4 +49,130 @@ describe('BaseCommand', () => { expect(BaseCommand.prototype).to.have.property('createCommandContext'); }); }); + + describe('createCommandContext', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((key: string) => { + const map: Record = { + userUid: 'user-uid-1', + email: 'test@example.com', + oauthOrgUid: 'org-uid-1', + }; + return map[key]; + }); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should map configHandler fields and command id', () => { + const cmd = new TestExportCommand([], minimalConfig); + const ctx = cmd.buildContext(); + expect(ctx.command).to.equal('cm:test-export-cmd'); + expect(ctx.module).to.equal('export-to-csv'); + expect(ctx.userId).to.equal('user-uid-1'); + expect(ctx.email).to.equal('test@example.com'); + expect(ctx.orgId).to.equal('org-uid-1'); + expect(ctx.apiKey).to.equal(''); + }); + + it('should set apiKey when provided', () => { + const cmd = new TestExportCommand([], minimalConfig); + const ctx = cmd.buildContext('stack-api-key'); + expect(ctx.apiKey).to.equal('stack-api-key'); + }); + + it('should fall back to default command id when this.id is missing', () => { + const cmd = new CommandWithoutStaticId([], minimalConfig); + (cmd as any).id = undefined; + const ctx = cmd.buildContext(); + expect(ctx.command).to.equal('cm:export-to-csv'); + }); + + it('should use empty strings when config keys are missing', () => { + (sandbox as sinon.SinonSandbox).restore(); + sandbox = sinon.createSandbox(); + sandbox.stub(cliUtilities.configHandler, 'get').returns(undefined); + const cmd = new TestExportCommand([], minimalConfig); + const ctx = cmd.buildContext(); + expect(ctx.userId).to.equal(''); + expect(ctx.email).to.equal(''); + expect(ctx.orgId).to.equal(''); + }); + }); + + describe('init', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(CsCommand.prototype as any, 'init').resolves(undefined); + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((key: string) => { + const map: Record = { + userUid: 'u1', + email: 'e1@test.com', + oauthOrgUid: 'o1', + }; + return map[key]; + }); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should await parent init and assign commandContext', async () => { + const cmd = new TestExportCommand([], minimalConfig); + await cmd.init(); + expect(cmd.commandContext.userId).to.equal('u1'); + expect(cmd.commandContext.email).to.equal('e1@test.com'); + }); + }); + + describe('catch and finally', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(CsCommand.prototype as any, 'init').resolves(undefined); + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((key: string) => { + const map: Record = { userUid: 'u', email: 'e', oauthOrgUid: 'o' }; + return map[key]; + }); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should delegate catch to parent Command', async () => { + const parentCatch = sandbox.stub(CsCommand.prototype as any, 'catch').resolves(undefined); + const cmd = new TestExportCommand([], minimalConfig); + await cmd.init(); + const err = new Error('test failure') as Error & { exitCode?: number }; + await cmd.exposeCatch(err); + expect(parentCatch.calledOnceWithExactly(err)).to.be.true; + }); + + it('should delegate finally to parent Command', async () => { + const parentFinally = sandbox.stub(CsCommand.prototype as any, 'finally').resolves(undefined); + const cmd = new TestExportCommand([], minimalConfig); + await cmd.init(); + const err = new Error('x'); + await cmd.exposeFinally(err); + expect(parentFinally.calledOnceWithExactly(err)).to.be.true; + }); + + it('should pass undefined to finally when no error', async () => { + const parentFinally = sandbox.stub(CsCommand.prototype as any, 'finally').resolves(undefined); + const cmd = new TestExportCommand([], minimalConfig); + await cmd.init(); + await cmd.exposeFinally(undefined); + expect(parentFinally.calledOnceWithExactly(undefined)).to.be.true; + }); + }); }); diff --git a/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts b/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts index 8363b77b2..2e787a9cb 100644 --- a/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/commands/export-to-csv.test.ts @@ -1,5 +1,104 @@ import { expect } from 'chai'; +import * as path from 'path'; +import { createRequire } from 'module'; +import sinon from 'sinon'; +import { Command as CsCommand } from '@contentstack/cli-command'; +import * as cliUtilities from '@contentstack/cli-utilities'; import ExportToCsv from '../../../src/commands/cm/export-to-csv'; +import { messages } from '../../../src/messages'; + +const nodeRequire = createRequire(path.join(__dirname, 'export-to-csv.test.ts')); +const cliUtilsPath = nodeRequire.resolve('@contentstack/cli-utilities'); +const exportCmdPath = nodeRequire.resolve('../../../src/commands/cm/export-to-csv'); +const utilsPath = nodeRequire.resolve('../../../src/utils'); +const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + +/** Region stub for CI runners that have no local `csdx config:set:region`. */ +const DEFAULT_TEST_REGION = { + cma: 'api.contentstack.io', + cda: 'cdn.contentstack.io', + uiHost: 'app.contentstack.com', + developerHubUrl: 'developer.contentstack.com', + launchHubUrl: 'launch.contentstack.com', + personalizeUrl: 'personalize.contentstack.com', + composableStudioUrl: 'studio.contentstack.com', +}; + +function getCliUtilsCacheEntry(): NodeModule { + return nodeRequire.cache[cliUtilsPath] as NodeModule; +} + +/** + * Reload export command after stubbing interactive helpers (utils re-exports use getters). + */ +function reloadExportCommandWithUtilsStubs( + sandbox: sinon.SinonSandbox, + stubs: { + chooseOrganization?: { name: string; uid: string }; + chooseStack?: { name: string; apiKey: string }; + }, +): { + ExportCmd: typeof ExportToCsv; + interactiveMod: typeof import('../../../src/utils/interactive'); +} { + delete nodeRequire.cache[interactivePath]; + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + if (stubs.chooseOrganization) { + sandbox.stub(interactiveMod, 'chooseOrganization').resolves(stubs.chooseOrganization); + } + if (stubs.chooseStack) { + sandbox.stub(interactiveMod, 'chooseStack').resolves(stubs.chooseStack); + } + + nodeRequire(utilsPath); + const ExportCmd = nodeRequire(exportCmdPath).default; + return { ExportCmd, interactiveMod }; +} + +function patchCliUtilities(partial: Record): () => void { + const entry = getCliUtilsCacheEntry(); + const baseline = entry.exports as typeof cliUtilities; + const fake = Object.assign({}, baseline, partial) as typeof cliUtilities; + entry.exports = fake as any; + delete nodeRequire.cache[exportCmdPath]; + return () => { + entry.exports = baseline as any; + delete nodeRequire.cache[exportCmdPath]; + }; +} + +function loadExportCommand(): typeof ExportToCsv { + return nodeRequire(exportCmdPath).default; +} + +function reloadUtilsAndCommand(): void { + delete nodeRequire.cache[exportCmdPath]; +} + +function baseFlags(over: Record = {}) { + return { + action: undefined as string | undefined, + alias: undefined as string | undefined, + org: undefined, + 'org-name': undefined, + 'stack-name': undefined, + 'stack-api-key': undefined, + locale: undefined, + 'content-type': undefined, + branch: undefined, + 'team-uid': undefined, + 'taxonomy-uid': undefined, + 'include-fallback': false, + 'fallback-locale': undefined, + delimiter: ',', + ...over, + }; +} + +const minimalConfig = { bin: 'csdx', root: process.cwd() } as any; describe('cm:export-to-csv', () => { describe('command scaffolding', () => { @@ -52,4 +151,1242 @@ describe('cm:export-to-csv', () => { expect(actionFlag.options).to.deep.equal(['entries', 'users', 'teams', 'taxonomies']); }); }); + + describe('command helpers', () => { + let sandbox: sinon.SinonSandbox; + let cmd: InstanceType; + + beforeEach(async () => { + sandbox = sinon.createSandbox(); + cmd = new ExportToCsv([], minimalConfig); + await cmd.init(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('snakeCase lowercases and replaces spaces with underscores', () => { + expect(cmd.snakeCase('Foo Bar')).to.equal('foo_bar'); + expect(cmd.snakeCase('')).to.equal(''); + }); + + it('getStackClient passes api_key and optional branch_uid', () => { + const stackApi = sandbox.stub().returns({}); + const mgmt = { stack: stackApi } as any; + cmd.getStackClient(mgmt, { name: 'n', apiKey: 'k1' } as any); + expect(stackApi.firstCall.args[0]).to.deep.equal({ api_key: 'k1' }); + cmd.getStackClient(mgmt, { name: 'n', apiKey: 'k2', branch_uid: 'br' } as any); + expect(stackApi.secondCall.args[0]).to.deep.equal({ api_key: 'k2', branch_uid: 'br' }); + }); + + it('getStackClient includes management_token when stack has token', () => { + const stackApi = sandbox.stub().returns({}); + const mgmt = { stack: stackApi } as any; + cmd.getStackClient(mgmt, { + name: 'n', + apiKey: 'k', + branch_uid: 'b', + token: 'tok', + } as any); + expect(stackApi.firstCall.args[0]).to.deep.equal({ + api_key: 'k', + branch_uid: 'b', + management_token: 'tok', + }); + }); + + it('getStackBranches returns items from branch().query().find()', async () => { + const find = sandbox.stub().resolves({ items: [{ uid: 'b1' }] }); + const stackClient = { + branch: () => ({ query: () => ({ find }) }), + } as any; + const out = await cmd.getStackBranches(stackClient); + expect(out).to.deep.equal([{ uid: 'b1' }]); + expect(find.called).to.equal(true); + }); + + it('getStackBranches returns [] when items missing or on error', async () => { + const findEmpty = sandbox.stub().resolves({}); + const c1 = { branch: () => ({ query: () => ({ find: findEmpty }) }) } as any; + expect(await cmd.getStackBranches(c1)).to.deep.equal([]); + const findRej = sandbox.stub().rejects(new Error('net')); + const c2 = { branch: () => ({ query: () => ({ find: findRej }) }) } as any; + expect(await cmd.getStackBranches(c2)).to.deep.equal([]); + }); + }); + + describe('exportUsers (direct)', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(cliUtilities.cliux, 'loader').returns(undefined); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('runs org-flag path, fetches org users/roles, and writes CSV', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + const writeStub = sandbox.stub(csvMod, 'write').callsFake(() => undefined); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const getInvitations = sandbox.stub().resolves({ items: [] }); + const rolesStub = sandbox.stub().resolves({ items: [] }); + const organization = sandbox.stub().callsFake((uid: string) => { + expect(uid).to.equal('org-uid-1'); + return { getInvitations, roles: rolesStub }; + }); + const getUser = sandbox.stub().resolves({ + organizations: [{ uid: 'org-uid-1', is_owner: true }], + }); + const mgmtClient = { getUser, organization }; + + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + await (cmd as any).exportUsers({ + managementAPIClient: mgmtClient, + org: 'org-uid-1', + orgName: 'My Test Org', + action: 'users', + delimiter: '|', + }); + + expect(cmd.commandContext.orgId).to.equal('org-uid-1'); + expect(getUser.callCount).to.be.greaterThan(0); + expect(organization.firstCall.args[0]).to.equal('org-uid-1'); + expect(getInvitations.calledOnce).to.equal(true); + expect(rolesStub.calledOnce).to.equal(true); + expect(writeStub.calledOnce).to.equal(true); + const writeArgs = writeStub.firstCall.args as [unknown, unknown[], string, string, string]; + expect(writeArgs[2]).to.equal('my-test-org_users_export.csv'); + expect(writeArgs[3]).to.equal('organization details'); + expect(writeArgs[4]).to.equal('|'); + expect(writeArgs[1]).to.deep.equal([]); + }); + }); + + describe('command private coverage', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(cliUtilities.cliux, 'loader').returns(undefined); + const configGet = cliUtilities.configHandler.get.bind(cliUtilities.configHandler); + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((key: string) => { + if (key === 'region') { + return DEFAULT_TEST_REGION; + } + return configGet(key); + }); + }); + + afterEach(() => { + sandbox.restore(); + }); + + function stubWriteAndReloadCommand(): typeof ExportToCsv { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + delete nodeRequire.cache[exportCmdPath]; + return nodeRequire(exportCmdPath).default; + } + + it('exportUsers uses chooseOrganization when org flag is absent (439–440)', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + const chooseOrg = sandbox.stub(interactiveMod, 'chooseOrganization').resolves({ name: 'Picked Org', uid: 'org-p' }); + + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const getInvitations = sandbox.stub().resolves({ items: [] }); + const rolesStub = sandbox.stub().resolves({ items: [] }); + const orgApi = sandbox.stub().callsFake((uid: string) => { + expect(uid).to.equal('org-p'); + return { getInvitations, roles: rolesStub }; + }); + const getUser = sandbox.stub().resolves({ + organizations: [{ uid: 'org-p', is_owner: true }], + }); + const mgmtClient = { getUser, organization: orgApi }; + + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + await (cmd as any).exportUsers({ + managementAPIClient: mgmtClient, + org: undefined, + orgName: undefined, + action: 'users', + delimiter: ',', + }); + + expect(chooseOrg.calledOnce).to.equal(true); + expect(cmd.commandContext.orgId).to.equal('org-p'); + }); + + it('exportTeamsData calls exportTeams when org is provided', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const teamsPath = nodeRequire.resolve('../../../src/utils/teams-export'); + delete nodeRequire.cache[teamsPath]; + const teamsMod = nodeRequire(teamsPath) as typeof import('../../../src/utils/teams-export'); + const exportTeamsStub = sandbox.stub(teamsMod, 'exportTeams').resolves(); + + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + await (cmd as any).exportTeamsData({ + managementAPIClient: {} as any, + org: 'org-t', + orgName: 'Team Org', + action: 'teams', + teamUid: undefined, + delimiter: ';', + }); + + expect(exportTeamsStub.calledOnce).to.equal(true); + const call = exportTeamsStub.firstCall.args; + expect(call[1]).to.deep.include({ uid: 'org-t', name: 'Team Org' }); + expect(call[3]).to.equal(';'); + }); + + it('exportUsers catch invokes handleAndLogError and rethrows', async () => { + const handleStub = sandbox.stub(); + const restoreCli = patchCliUtilities({ handleAndLogError: handleStub as any }); + try { + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + sandbox.stub(interactiveMod, 'chooseOrganization').rejects(new Error('org choose boom')); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + try { + await (cmd as any).exportUsers({ + managementAPIClient: {} as any, + org: undefined, + orgName: undefined, + action: 'users', + delimiter: ',', + }); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('org choose boom'); + } + expect(handleStub.calledOnce).to.equal(true); + } finally { + restoreCli(); + } + }); + + it('exportTeamsData catch invokes handleAndLogError and rethrows', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const teamsPath = nodeRequire.resolve('../../../src/utils/teams-export'); + delete nodeRequire.cache[teamsPath]; + const teamsMod = nodeRequire(teamsPath) as typeof import('../../../src/utils/teams-export'); + sandbox.stub(teamsMod, 'exportTeams').rejects(new Error('teams boom')); + const handleStub = sandbox.stub(); + const restoreCli = patchCliUtilities({ handleAndLogError: handleStub as any }); + try { + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + try { + await (cmd as any).exportTeamsData({ + managementAPIClient: {} as any, + org: 'org-x', + orgName: 'Org X', + action: 'teams', + teamUid: undefined, + delimiter: ',', + }); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('teams boom'); + } + expect(handleStub.calledOnce).to.equal(true); + } finally { + restoreCli(); + } + }); + + it('exportTaxonomiesData uses locale flag and calls createTaxonomyAndTermCsvFile', async () => { + const ExportCmd = stubWriteAndReloadCommand(); + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'StackX', apiKey: 'key-x' } as any); + const createStub = sandbox.stub(cmd, 'createTaxonomyAndTermCsvFile').resolves(); + + await (cmd as any).exportTaxonomiesData({ + managementAPIClient: { stack: sandbox.stub().returns({}) } as any, + stackAPIKey: 'key-x', + org: 'org-1', + locale: 'en-us', + branchUid: 'br1', + taxonomyUID: 'tax1', + includeFallback: true, + fallbackLocale: 'de-de', + delimiter: '|', + }); + + expect(cmd.commandContext.apiKey).to.equal('key-x'); + expect(createStub.calledOnce).to.equal(true); + const createArgs = createStub.firstCall.args as any[]; + expect(createArgs[3]).to.equal('tax1'); + expect(createArgs[4]).to.equal('|'); + expect(createArgs[5]).to.deep.include({ + locale: 'en-us', + branch: 'br1', + include_fallback: true, + fallback_locale: 'de-de', + }); + }); + + it('exportTaxonomiesData uses getAliasDetails when managementTokenAlias is set', async () => { + const ExportCmd = stubWriteAndReloadCommand(); + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + const aliasApi = { stack: sandbox.stub().returns({}) } as any; + const aliasSpy = sandbox.stub(cmd, 'getAliasDetails').resolves({ + stackDetails: { name: 'TStack', apiKey: 'tk', token: 'mtok' } as any, + apiClient: aliasApi, + }); + const createStub = sandbox.stub(cmd, 'createTaxonomyAndTermCsvFile').resolves(); + + await (cmd as any).exportTaxonomiesData({ + managementAPIClient: { stack: sandbox.stub().returns({}) } as any, + managementTokenAlias: 'al1', + stackName: 'NamedViaFlag', + stackAPIKey: undefined, + org: 'org-1', + locale: 'fr', + branchUid: undefined, + taxonomyUID: 'taxz', + includeFallback: false, + fallbackLocale: undefined, + delimiter: ',', + }); + + expect(aliasSpy.calledOnceWithExactly('al1', 'NamedViaFlag')).to.equal(true); + expect(cmd.commandContext.apiKey).to.equal('tk'); + expect(createStub.calledOnce).to.equal(true); + expect(createStub.firstCall.args[0]).to.deep.equal({}); + }); + + it('exportTaxonomiesData calls chooseLanguage when locale is omitted', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + sandbox.stub(interactiveMod, 'chooseLanguage').resolves({ code: 'it' } as any); + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'St', apiKey: 'k1' } as any); + const createStub = sandbox.stub(cmd, 'createTaxonomyAndTermCsvFile').resolves(); + + await (cmd as any).exportTaxonomiesData({ + managementAPIClient: { stack: sandbox.stub().returns({}) } as any, + stackAPIKey: 'k1', + org: 'org-1', + locale: undefined, + branchUid: undefined, + taxonomyUID: undefined, + includeFallback: false, + fallbackLocale: undefined, + delimiter: ';', + }); + + expect((interactiveMod.chooseLanguage as sinon.SinonStub).calledOnce).to.equal(true); + const opts = createStub.firstCall.args[5] as Record; + expect(opts.locale).to.equal('it'); + }); + + it('exportTaxonomiesData catch invokes handleAndLogError', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + const handleStub = sandbox.stub(); + const restoreCli = patchCliUtilities({ handleAndLogError: handleStub as any }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'St', apiKey: 'k1' } as any); + sandbox.stub(cmd, 'createTaxonomyAndTermCsvFile').rejects(new Error('tax fail')); + + try { + await (cmd as any).exportTaxonomiesData({ + managementAPIClient: { stack: sandbox.stub().returns({}) } as any, + stackAPIKey: 'k1', + org: 'org-1', + locale: 'en', + branchUid: undefined, + taxonomyUID: undefined, + includeFallback: false, + fallbackLocale: undefined, + delimiter: ',', + }); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('tax fail'); + } + expect(handleStub.calledOnce).to.equal(true); + } finally { + restoreCli(); + } + }); + + it('exportEntries returns early when stack has no content types', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(0); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({}); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + + const printStub = sandbox.stub(cliUtilities.cliux, 'print'); + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'S', apiKey: 'k1' } as any); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + const stackClient = {} as any; + const mgmt = { stack: sandbox.stub().returns(stackClient) } as any; + + await (cmd as any).exportEntries({ + managementAPIClient: mgmt, + stackAPIKey: 'k1', + org: 'org-1', + locale: 'en-us', + delimiter: ',', + }); + + const noCt = printStub.getCalls().some((c) => String(c.args[0]).includes('No content types found')); + expect(noCt).to.equal(true); + }); + + it('exportEntries uses getAliasDetails when managementTokenAlias is set', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(0); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({}); + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + const aliasClient = { stack: sandbox.stub().returns({}) } as any; + const aliasSpy = sandbox.stub(cmd, 'getAliasDetails').resolves({ + stackDetails: { name: 'Aliased', apiKey: 'ak-alias' } as any, + apiClient: aliasClient, + }); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + const printStub = sandbox.stub(cliUtilities.cliux, 'print'); + await (cmd as any).exportEntries({ + managementAPIClient: {} as any, + managementTokenAlias: 'my-alias', + stackAPIKey: undefined, + org: undefined, + locale: 'en', + delimiter: ',', + }); + + expect(aliasSpy.calledOnceWithExactly('my-alias', undefined)).to.equal(true); + expect(cmd.commandContext.apiKey).to.equal('ak-alias'); + const noCt = printStub.getCalls().some((c) => String(c.args[0]).includes('No content types found')); + expect(noCt).to.equal(true); + }); + + it('exportEntries with content-type flag validates and writes when type exists', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + const writeStub = sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const dataTransformPath = nodeRequire.resolve('../../../src/utils/data-transform'); + const dtMod = nodeRequire(dataTransformPath) as typeof import('../../../src/utils/data-transform'); + sandbox.stub(dtMod, 'cleanEntries').returns([] as any); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(3); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({}); + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const stackClient = { + contentType: sandbox.stub().callsFake((uid?: string) => { + if (uid === undefined) { + return { + query: () => ({ + find: () => Promise.resolve({ items: [{ uid: 'ct1' }] }), + }), + }; + } + return { + entry: () => ({ + query: () => ({ + count: () => Promise.resolve({ entries: 0 }), + find: () => Promise.resolve({ items: [] }), + }), + }), + }; + }), + environment: () => ({ + query: () => ({ + find: () => Promise.resolve({ items: [] }), + }), + }), + } as any; + + const mgmt = { stack: sandbox.stub().returns(stackClient) } as any; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'St', apiKey: 'k1' } as any); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + await (cmd as any).exportEntries({ + managementAPIClient: mgmt, + stackAPIKey: 'k1', + org: 'org-1', + locale: 'en-us', + contentTypesFlag: 'ct1', + delimiter: '|', + }); + + expect(writeStub.calledOnce).to.equal(true); + const writeArgs = writeStub.firstCall.args as [unknown, unknown[], string, string, string]; + expect(writeArgs[2]).to.include('ct1'); + expect(writeArgs[2]).to.include('en-us'); + expect(writeArgs[4]).to.equal('|'); + }); + + it('exportEntries with content-type flag throws when type is missing', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const dataTransformPath = nodeRequire.resolve('../../../src/utils/data-transform'); + const dtMod = nodeRequire(dataTransformPath) as typeof import('../../../src/utils/data-transform'); + sandbox.stub(dtMod, 'cleanEntries').returns([] as any); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(1); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({}); + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const stackClient = { + contentType: sandbox.stub().callsFake((uid?: string) => { + if (uid === undefined) { + return { + query: () => ({ + find: () => Promise.resolve({ items: [{ uid: 'other' }] }), + }), + }; + } + return { + entry: () => ({ + query: () => ({ + count: () => Promise.resolve({ entries: 0 }), + find: () => Promise.resolve({ items: [] }), + }), + }), + }; + }), + environment: () => ({ + query: () => ({ + find: () => Promise.resolve({ items: [] }), + }), + }), + } as any; + + const mgmt = { stack: sandbox.stub().returns(stackClient) } as any; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'St', apiKey: 'k1' } as any); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + try { + await (cmd as any).exportEntries({ + managementAPIClient: mgmt, + stackAPIKey: 'k1', + org: 'org-1', + locale: 'en', + contentTypesFlag: 'ct1', + delimiter: ',', + }); + expect.fail('expected rejection'); + } catch (e: any) { + expect(String(e.message)).to.include('not found'); + } + }); + + it('exportEntries without content-type flag uses chooseInMemContentTypes, chooseLanguage, and writes', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + const writeStub = sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const dataTransformPath = nodeRequire.resolve('../../../src/utils/data-transform'); + const dtMod = nodeRequire(dataTransformPath) as typeof import('../../../src/utils/data-transform'); + sandbox.stub(dtMod, 'cleanEntries').returns([] as any); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(1); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({ Lbl: 'ct1' } as any); + + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + sandbox.stub(interactiveMod, 'chooseInMemContentTypes').resolves(['ct1'] as any); + sandbox.stub(interactiveMod, 'chooseLanguage').resolves({ code: 'de' } as any); + + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + + const stackClient = { + contentType: sandbox.stub().callsFake((uid?: string) => { + if (uid === undefined) { + return { + query: () => ({ + find: () => Promise.resolve({ items: [{ uid: 'ct1' }] }), + }), + }; + } + return { + entry: () => ({ + query: () => ({ + count: () => Promise.resolve({ entries: 0 }), + find: () => Promise.resolve({ items: [] }), + }), + }), + }; + }), + environment: () => ({ + query: () => ({ + find: () => Promise.resolve({ items: [] }), + }), + }), + } as any; + + const mgmt = { stack: sandbox.stub().returns(stackClient) } as any; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackDetails').resolves({ name: 'St', apiKey: 'k1' } as any); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + await (cmd as any).exportEntries({ + managementAPIClient: mgmt, + stackAPIKey: 'k1', + org: 'org-1', + locale: undefined, + delimiter: ',', + }); + + expect((interactiveMod.chooseInMemContentTypes as sinon.SinonStub).calledOnce).to.equal(true); + expect((interactiveMod.chooseLanguage as sinon.SinonStub).calledOnce).to.equal(true); + expect(writeStub.calledOnce).to.equal(true); + const fname = (writeStub.firstCall.args as any[])[2] as string; + expect(fname).to.include('ct1'); + expect(fname).to.include('de'); + }); + + it('exportEntries catch invokes handleAndLogError and rethrows', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getContentTypeCount').resolves(0); + sandbox.stub(apiMod, 'getEnvironments').resolves({} as any); + sandbox.stub(apiMod, 'getContentTypes').resolves({}); + delete nodeRequire.cache[nodeRequire.resolve('../../../src/utils')]; + delete nodeRequire.cache[exportCmdPath]; + + const handleStub = sandbox.stub(); + const restoreCli = patchCliUtilities({ handleAndLogError: handleStub as any }); + try { + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + sandbox.stub(cmd, 'getStackDetails').rejects(new Error('stack boom')); + sandbox.stub(cmd, 'checkAndUpdateBranchDetail').callsFake(async (_b, _s, sc) => sc); + + try { + await (cmd as any).exportEntries({ + managementAPIClient: { stack: sandbox.stub().returns({}) } as any, + stackAPIKey: 'k', + org: 'o', + delimiter: ',', + }); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('stack boom'); + } + expect(handleStub.calledOnce).to.equal(true); + } finally { + restoreCli(); + } + }); + + it('getStackDetails returns stack when org and stackAPIKey are provided', async () => { + const restoreCli = patchCliUtilities({ isAuthenticated: () => true }); + try { + const { ExportCmd, interactiveMod } = reloadExportCommandWithUtilsStubs(sandbox, { + chooseStack: { name: 'MyStack', apiKey: 'stack-key-99' }, + }); + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + const out = await cmd.getStackDetails({} as any, 'stack-key-99', 'org-uid-z'); + + expect(out).to.deep.equal({ name: 'MyStack', apiKey: 'stack-key-99' }); + expect((interactiveMod.chooseStack as sinon.SinonStub).calledWith({}, 'org-uid-z', 'stack-key-99')).to.equal( + true, + ); + } finally { + restoreCli(); + } + }); + + it('getStackDetails errors when user is not authenticated', async () => { + const restoreCli = patchCliUtilities({ isAuthenticated: () => false }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + const errStub = sandbox.stub(cmd, 'error' as any).throws(new Error('not-auth')); + + try { + await cmd.getStackDetails({} as any, 'sk', 'org1'); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('not-auth'); + } + expect(errStub.calledOnce).to.equal(true); + } finally { + restoreCli(); + } + }); + + it('getStackDetails chooses org and stack when org and stack key are omitted', async () => { + const restoreCli = patchCliUtilities({ isAuthenticated: () => true }); + try { + const { ExportCmd, interactiveMod } = reloadExportCommandWithUtilsStubs(sandbox, { + chooseOrganization: { name: 'OrgA', uid: 'org-a' }, + chooseStack: { name: 'StackA', apiKey: 'ak-a' }, + }); + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + const out = await cmd.getStackDetails({} as any, undefined, undefined); + expect(out).to.deep.equal({ name: 'StackA', apiKey: 'ak-a' }); + expect((interactiveMod.chooseOrganization as sinon.SinonStub).calledOnce).to.equal(true); + expect((interactiveMod.chooseOrganization as sinon.SinonStub).firstCall.args[0]).to.deep.equal({}); + expect((interactiveMod.chooseStack as sinon.SinonStub).calledOnce).to.equal(true); + expect((interactiveMod.chooseStack as sinon.SinonStub).firstCall.args[0]).to.deep.equal({}); + expect((interactiveMod.chooseStack as sinon.SinonStub).firstCall.args[1]).to.equal('org-a'); + } finally { + restoreCli(); + } + }); + + it('getAliasDetails returns client and stack when token is valid', async () => { + const entry = getCliUtilsCacheEntry(); + const baselineCli = entry.exports as typeof cliUtilities; + const mgmtFromAlias = { stack: sandbox.stub() } as any; + const restore = patchCliUtilities({ + configHandler: { + ...baselineCli.configHandler, + get: sandbox.stub().callsFake((key: string) => { + if (key === 'tokens') return { tok1: { apiKey: 'ak1', token: 'secret' } }; + return baselineCli.configHandler.get(key); + }), + } as any, + isManagementTokenValid: sandbox.stub().resolves({}) as any, + managementSDKClient: sandbox.stub().resolves(mgmtFromAlias) as any, + }); + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + const out = await cmd.getAliasDetails('tok1', 'Named Stack'); + + expect(out.stackDetails).to.deep.include({ + name: 'Named Stack', + apiKey: 'ak1', + token: 'secret', + }); + expect(out.apiClient).to.equal(mgmtFromAlias); + restore(); + }); + + it('getAliasDetails throws token check message for failedToCheck', async () => { + const entry = getCliUtilsCacheEntry(); + const baselineCli = entry.exports as typeof cliUtilities; + const restore = patchCliUtilities({ + configHandler: { + ...baselineCli.configHandler, + get: sandbox.stub().callsFake((key: string) => { + if (key === 'tokens') return { tok1: { apiKey: 'ak1', token: 'secret' } }; + return baselineCli.configHandler.get(key); + }), + } as any, + isManagementTokenValid: sandbox.stub().resolves({ valid: 'failedToCheck', message: 'network down' }) as any, + }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + try { + await cmd.getAliasDetails('tok1', undefined); + expect.fail('expected rejection'); + } catch (e: any) { + expect(String(e.message)).to.include('network down'); + } + } finally { + restore(); + } + }); + + it('getAliasDetails throws invalid token message for generic failure', async () => { + const entry = getCliUtilsCacheEntry(); + const baselineCli = entry.exports as typeof cliUtilities; + const restore = patchCliUtilities({ + configHandler: { + ...baselineCli.configHandler, + get: sandbox.stub().callsFake((key: string) => { + if (key === 'tokens') return { tok1: { apiKey: 'ak1', token: 'secret' } }; + return baselineCli.configHandler.get(key); + }), + } as any, + isManagementTokenValid: sandbox.stub().resolves({ valid: 'failed', message: 'bad token' }) as any, + }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + try { + await cmd.getAliasDetails('tok1', undefined); + expect.fail('expected rejection'); + } catch (e: any) { + expect(String(e.message)).to.include('Management token or stack API key is invalid'); + expect(String(e.message)).to.include('bad token'); + } + } finally { + restore(); + } + }); + + it('getAliasDetails invokes this.error when alias is not in config', async () => { + const entry = getCliUtilsCacheEntry(); + const baselineCli = entry.exports as typeof cliUtilities; + const restore = patchCliUtilities({ + configHandler: { + ...baselineCli.configHandler, + get: sandbox.stub().callsFake((key: string) => { + if (key === 'tokens') return {}; + return baselineCli.configHandler.get(key); + }), + } as any, + }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + const errorStub = sandbox.stub(cmd, 'error' as any).throws(new Error('alias-missing')); + try { + await cmd.getAliasDetails('unknown', undefined); + expect.fail('expected rejection'); + } catch (e: any) { + expect(e.message).to.equal('alias-missing'); + } + expect(errorStub.calledOnce).to.equal(true); + } finally { + restore(); + } + }); + + it('getAliasDetails throws when alias is empty', async () => { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + try { + await cmd.getAliasDetails('' as any, undefined); + expect.fail('expected rejection'); + } catch (e: any) { + expect(e.message).to.equal('Management token alias is required.'); + } + }); + + it('checkAndUpdateBranchDetail validates branch when branchUid is set', async () => { + const restore = patchCliUtilities({ + doesBranchExist: sandbox.stub().resolves({}) as any, + }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + const stack = { name: 'S', apiKey: 'k1' } as any; + const stackClient = {} as any; + const mgmt = { stack: sandbox.stub().returns({}) } as any; + const out = await cmd.checkAndUpdateBranchDetail('branch-1', stack, stackClient, mgmt); + + expect(stack.branch_uid).to.equal('branch-1'); + expect(out).to.be.an('object'); + } finally { + restore(); + } + }); + + it('checkAndUpdateBranchDetail handles doesBranchExist errorCode and exits', async () => { + const handleStub = sandbox.stub(); + const restore = patchCliUtilities({ + doesBranchExist: sandbox.stub().resolves({ errorCode: '404', errorMessage: 'no branch' }) as any, + handleAndLogError: handleStub as any, + }); + try { + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + const exitStub = sandbox.stub(cmd, 'exit' as any).callsFake(() => undefined); + + const stack = { name: 'S', apiKey: 'k1' } as any; + await cmd.checkAndUpdateBranchDetail('missing-branch', stack, {} as any, { stack: sandbox.stub().returns({}) } as any); + + expect(handleStub.calledOnce).to.equal(true); + expect(exitStub.calledWith(1)).to.equal(true); + } finally { + restore(); + } + }); + + it('checkAndUpdateBranchDetail picks branch when none passed and branches exist', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + sandbox.stub(interactiveMod, 'chooseBranch').resolves({ branch: 'picked-br' }); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackBranches').resolves([{ uid: 'b1' }] as any); + + const stack = { name: 'S', apiKey: 'k1' } as any; + const stackClient = {} as any; + const mgmt = { stack: sandbox.stub().returns({}) } as any; + const out = await cmd.checkAndUpdateBranchDetail(undefined, stack, stackClient, mgmt); + + expect(stack.branch_uid).to.equal('picked-br'); + expect(out).to.be.an('object'); + }); + + it('checkAndUpdateBranchDetail avoids chooseBranch when stack has no branches', async () => { + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + const chooseBranchStub = sandbox.stub(interactiveMod, 'chooseBranch').resolves({ branch: 'never' }); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + sandbox.stub(cmd, 'getStackBranches').resolves([]); + + const stack = { name: 'S', apiKey: 'k1' } as any; + const stackClient = { from: 'original' } as any; + const mgmt = { stack: sandbox.stub().returns({ from: 'new' }) } as any; + const out = await cmd.checkAndUpdateBranchDetail(undefined, stack, stackClient, mgmt); + + expect(chooseBranchStub.called).to.equal(false); + expect(out).to.deep.equal({ from: 'new' }); + }); + + it('createTaxonomyAndTermCsvFile returns early when no taxonomies', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + sandbox.stub(apiMod, 'getAllTaxonomies').resolves([] as any); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + const printStub = sandbox.stub(cliUtilities.cliux, 'print'); + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + await cmd.createTaxonomyAndTermCsvFile({} as any, undefined, { name: 'St', apiKey: 'k' } as any, undefined, ','); + + const yellow = printStub + .getCalls() + .some((c) => c.args[1]?.color === 'yellow' && String(c.args[0]).includes('No taxonomies found')); + expect(yellow).to.equal(true); + }); + + it('createTaxonomyAndTermCsvFile uses getTaxonomy when taxonomy UID is set', async () => { + const csvWriterPath = nodeRequire.resolve('../../../src/utils/csv-writer'); + const csvMod = nodeRequire(csvWriterPath) as typeof import('../../../src/utils/csv-writer'); + sandbox.stub(csvMod, 'write').callsFake(() => undefined); + + const apiClientPath = nodeRequire.resolve('../../../src/utils/api-client'); + const apiMod = nodeRequire(apiClientPath) as typeof import('../../../src/utils/api-client'); + const tax = { uid: 't1', name: 'Tax1' } as any; + sandbox.stub(apiMod, 'getTaxonomy').resolves(tax); + sandbox.stub(apiMod, 'createImportableCSV').resolves({ taxonomiesData: [{ x: 1 }], headers: ['x'] } as any); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const ExportCmd = nodeRequire(exportCmdPath).default; + const cmd = new ExportCmd([], minimalConfig); + await cmd.init(); + + await cmd.createTaxonomyAndTermCsvFile({} as any, 'SN', { name: 'St', apiKey: 'k' } as any, 't1', ','); + + expect((apiMod.getTaxonomy as sinon.SinonStub).calledOnce).to.equal(true); + }); + }); + + describe('run()', () => { + let sandbox: sinon.SinonSandbox; + let restoreCli: (() => void) | undefined; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + const configGet = cliUtilities.configHandler.get.bind(cliUtilities.configHandler); + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((key: string) => { + if (key === 'region') { + return DEFAULT_TEST_REGION; + } + return configGet(key); + }); + }); + + afterEach(() => { + restoreCli?.(); + restoreCli = undefined; + sandbox.restore(); + }); + + async function createCmd(ExportCls: typeof ExportToCsv) { + const cmd = new ExportCls([], minimalConfig); + await cmd.init(); + return cmd; + } + + it('8a: initializes client and does not export entries when not authenticated', async () => { + const mgmt = sandbox.stub().resolves({}); + restoreCli = patchCliUtilities({ + managementSDKClient: mgmt as any, + isAuthenticated: () => false, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const entriesSpy = sandbox.stub(Cmd.prototype, 'exportEntries' as any).resolves(); + const exitStub = sandbox.stub(CsCommand.prototype, 'exit' as any).callsFake(() => undefined); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'entries' }) }); + await cmd.run(); + expect(mgmt.calledOnce).to.equal(true); + expect(entriesSpy.called).to.equal(false); + exitStub.restore(); + }); + + it('8b: skips startupQuestions when action is provided via flags', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const utilsMod = nodeRequire('../../../src/utils') as typeof import('../../../src/utils'); + const sq = sandbox.stub(utilsMod, 'startupQuestions').resolves('Export entries to a .CSV file'); + const Cmd = loadExportCommand(); + sandbox.stub(Cmd.prototype, 'exportEntries' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'entries', alias: 'a' }) }); + await cmd.run(); + expect(sq.called).to.equal(false); + }); + + it('8c: dispatches entries branch', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const stub = sandbox.stub(Cmd.prototype, 'exportEntries' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'entries', alias: 'a' }) }); + await cmd.run(); + expect(stub.calledOnce).to.equal(true); + }); + + it('8d: dispatches users branch', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const stub = sandbox.stub(Cmd.prototype, 'exportUsers' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'users', alias: 'a' }) }); + await cmd.run(); + expect(stub.calledOnce).to.equal(true); + }); + + it('8e: dispatches teams branch', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const stub = sandbox.stub(Cmd.prototype, 'exportTeamsData' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'teams', alias: 'a' }) }); + await cmd.run(); + expect(stub.calledOnce).to.equal(true); + }); + + it('8f: dispatches taxonomies branch', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const stub = sandbox.stub(Cmd.prototype, 'exportTaxonomiesData' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'taxonomies', alias: 'a' }) }); + await cmd.run(); + expect(stub.calledOnce).to.equal(true); + }); + + it('8g: catch invokes handleAndLogError, ux stop, and exit', async () => { + const handleStub = sandbox.stub(); + const stopStub = sandbox.stub(); + const entry = getCliUtilsCacheEntry(); + const baseline = entry.exports as typeof cliUtilities; + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + handleAndLogError: handleStub as any, + ux: { ...baseline.ux, action: { ...baseline.ux.action, stop: stopStub } } as any, + }); + reloadUtilsAndCommand(); + const Cmd = loadExportCommand(); + const exitStub = sandbox.stub(Cmd.prototype, 'exit' as any).callsFake(() => undefined); + sandbox.stub(Cmd.prototype, 'exportEntries' as any).rejects(new Error('boom')); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ action: 'entries', alias: 'a' }) }); + await cmd.run(); + expect(handleStub.calledOnce).to.equal(true); + expect(stopStub.calledWith('Export failed')).to.equal(true); + expect(exitStub.calledWith(1)).to.equal(true); + }); + + it('8h: calls startupQuestions when action flag is omitted', async () => { + restoreCli = patchCliUtilities({ + managementSDKClient: sandbox.stub().resolves({}) as any, + isAuthenticated: () => true, + }); + reloadUtilsAndCommand(); + const interactivePath = nodeRequire.resolve('../../../src/utils/interactive'); + delete nodeRequire.cache[interactivePath]; + const interactiveMod = nodeRequire(interactivePath) as typeof import('../../../src/utils/interactive'); + const sq = sandbox.stub(interactiveMod, 'startupQuestions').resolves(messages.ACTION_EXPORT_ENTRIES); + const utilsPath = nodeRequire.resolve('../../../src/utils'); + delete nodeRequire.cache[utilsPath]; + delete nodeRequire.cache[exportCmdPath]; + const Cmd = nodeRequire(exportCmdPath).default; + sandbox.stub(Cmd.prototype, 'exportEntries' as any).resolves(); + const cmd = await createCmd(Cmd); + sandbox.stub(cmd, 'parse' as any).resolves({ flags: baseFlags({ alias: 'a' }) }); + await cmd.run(); + expect(sq.calledOnce).to.equal(true); + }); + }); }); diff --git a/packages/contentstack-export-to-csv/test/unit/messages.test.ts b/packages/contentstack-export-to-csv/test/unit/messages.test.ts new file mode 100644 index 000000000..901a22746 --- /dev/null +++ b/packages/contentstack-export-to-csv/test/unit/messages.test.ts @@ -0,0 +1,36 @@ +import { expect } from 'chai'; +import { formatMessage, messages } from '../../src/messages'; + +describe('messages', () => { + describe('formatMessage', () => { + it('should replace a single placeholder', () => { + const result = formatMessage('Hello {name}', { name: 'World' }); + expect(result).to.equal('Hello World'); + }); + + it('should replace the same placeholder multiple times', () => { + const result = formatMessage('{x} and {x}', { x: 'twice' }); + expect(result).to.equal('twice and twice'); + }); + + it('should replace multiple distinct placeholders', () => { + const result = formatMessage('{a}-{b}-{c}', { a: '1', b: '2', c: '3' }); + expect(result).to.equal('1-2-3'); + }); + + it('should leave unknown placeholders unchanged', () => { + const result = formatMessage('keep {missing}', { other: 'x' }); + expect(result).to.equal('keep {missing}'); + }); + + it('should handle empty params object', () => { + const result = formatMessage(messages.INFO_WRITING_FILE, {}); + expect(result).to.equal(messages.INFO_WRITING_FILE); + }); + + it('should work with message template from messages constant', () => { + const result = formatMessage(messages.INFO_EXPORTING_TEAMS, { orgName: 'Acme' }); + expect(result).to.include('Acme'); + }); + }); +}); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/api-client.fixtures.ts b/packages/contentstack-export-to-csv/test/unit/utils/api-client.fixtures.ts new file mode 100644 index 000000000..7f43a6e2b --- /dev/null +++ b/packages/contentstack-export-to-csv/test/unit/utils/api-client.fixtures.ts @@ -0,0 +1,57 @@ +import type { StackClient } from '../../../src/types'; + +export function createStackClient(handlers: { + contentTypeCount?: unknown; + contentTypesFind?: unknown; + localesFind?: unknown; + entriesCount?: unknown; + entriesFind?: unknown; + envFind?: unknown; + taxonomyFind?: unknown; + taxonomyFetch?: unknown; + termsFind?: unknown; + taxonomyExport?: unknown; +}): StackClient { + return { + contentType: (uid?: string) => { + if (uid) { + return { + entry: () => ({ + query: () => ({ + count: () => Promise.resolve(handlers.entriesCount ?? { entries: 3 }), + find: () => Promise.resolve(handlers.entriesFind ?? { items: [] }), + }), + }), + }; + } + return { + query: () => ({ + count: () => Promise.resolve(handlers.contentTypeCount ?? { content_types: 2 }), + find: () => Promise.resolve(handlers.contentTypesFind ?? { items: [{ title: 'Blog', uid: 'blog' }] }), + }), + }; + }, + locale: () => ({ + query: () => ({ + find: () => Promise.resolve(handlers.localesFind ?? { items: [{ name: 'English', code: 'en-us' }] }), + }), + }), + environment: () => ({ + query: () => ({ + find: () => Promise.resolve(handlers.envFind ?? { items: [{ uid: 'env1', name: 'Production' }] }), + }), + }), + taxonomy: (taxonomyUID?: string) => ({ + query: () => ({ + find: () => Promise.resolve(handlers.taxonomyFind ?? { items: [], count: 0 }), + }), + fetch: () => Promise.resolve(handlers.taxonomyFetch ?? { uid: taxonomyUID, name: 'Tax' }), + terms: () => ({ + query: () => ({ + find: () => Promise.resolve(handlers.termsFind ?? { items: [], count: 0 }), + }), + }), + export: () => Promise.resolve(handlers.taxonomyExport ?? 'h1,h2\nv1,v2'), + }), + } as unknown as StackClient; +} diff --git a/packages/contentstack-export-to-csv/test/unit/utils/api-client.functional.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/api-client.functional.test.ts new file mode 100644 index 000000000..6d93b3ec3 --- /dev/null +++ b/packages/contentstack-export-to-csv/test/unit/utils/api-client.functional.test.ts @@ -0,0 +1,466 @@ +import { expect } from 'chai'; +import sinon from 'sinon'; +import * as cliUtilities from '@contentstack/cli-utilities'; +import * as errorHandler from '../../../src/utils/error-handler'; +import { messages } from '../../../src/messages'; +import { + getOrganizations, + getOrganizationsWhereUserIsAdmin, + getOrgUsers, + getOrgRoles, + getStacks, + getContentTypeCount, + getContentTypes, + getLanguages, + getEntriesCount, + getEntries, + getEnvironments, + getAllTeams, + exportOrgTeams, + getRoleData, + taxonomySDKHandler, + getAllTaxonomies, + getAllTermsOfTaxonomy, + getTaxonomy, + createImportableCSV, +} from '../../../src/utils/api-client'; +import { createStackClient } from './api-client.fixtures'; + +describe('api-client functional', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(errorHandler, 'wait').resolves(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('organizations', () => { + it('getOrganizations uses single org fetch when oauthOrgUid is set', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((k: string) => (k === 'oauthOrgUid' ? 'o-1' : undefined)); + const client = { + organization: (uid: string) => ({ + fetch: () => Promise.resolve({ name: 'OAuth Org', uid }), + }), + } as any; + const map = await getOrganizations(client); + expect(map['OAuth Org']).to.equal('o-1'); + }); + + it('getOrganizations maps fetchAll when under limit', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').returns(undefined); + const client = { + organization: () => ({ + fetchAll: () => Promise.resolve({ items: [{ name: 'Solo', uid: 'u1' }] }), + }), + } as any; + const map = await getOrganizations(client); + expect(map).to.deep.equal({ Solo: 'u1' }); + }); + + it('getOrganizations paginates when page is full', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').returns(undefined); + const full = Array.from({ length: 100 }, (_, i) => ({ name: `Org${i}`, uid: `id${i}` })); + let calls = 0; + const client = { + organization: () => ({ + fetchAll: () => { + calls++; + if (calls === 1) return Promise.resolve({ items: full }); + return Promise.resolve({ items: [{ name: 'Zed', uid: 'z' }] }); + }, + }), + } as any; + const map = await getOrganizations(client); + expect(map.Zed).to.equal('z'); + expect(Object.keys(map).length).to.be.greaterThan(100); + }); + + it('getOrganizationsWhereUserIsAdmin uses oauth org fetch', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').callsFake((k: string) => (k === 'oauthOrgUid' ? 'ox' : undefined)); + const client = { + organization: (uid: string) => ({ + fetch: () => Promise.resolve({ name: 'Owned', uid }), + }), + } as any; + const map = await getOrganizationsWhereUserIsAdmin(client); + expect(map.Owned).to.equal('ox'); + }); + + it('getOrganizationsWhereUserIsAdmin filters getUser orgs by admin role', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').returns(undefined); + const client = { + getUser: () => + Promise.resolve({ + organizations: [ + { name: 'NoAdmin', uid: '1', org_roles: [{ admin: false }] }, + { name: 'YesAdmin', uid: '2', org_roles: [{ admin: true }] }, + ], + }), + } as any; + const map = await getOrganizationsWhereUserIsAdmin(client); + expect(map).to.deep.equal({ YesAdmin: '2' }); + }); + + it('getOrganizationsWhereUserIsAdmin includes org when is_owner', async () => { + sandbox.stub(cliUtilities.configHandler, 'get').returns(undefined); + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ name: 'OwnerCo', uid: '9', is_owner: true }], + }), + } as any; + const map = await getOrganizationsWhereUserIsAdmin(client); + expect(map.OwnerCo).to.equal('9'); + }); + }); + + describe('getOrgUsers / getOrgRoles', () => { + it('getOrgUsers resolves invitations for org owner', async () => { + const invitations = { items: [{ email: 'a@b.com' }] }; + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: true }], + }), + organization: () => ({ + getInvitations: () => Promise.resolve(invitations), + }), + } as any; + const res = await getOrgUsers(client, 'org-1'); + expect(res).to.equal(invitations); + }); + + it('getOrgUsers rejects when org uid missing', async () => { + const client = { + getUser: () => Promise.resolve({ organizations: [{ uid: 'other' }] }), + } as any; + try { + await getOrgUsers(client, 'missing'); + expect.fail('expected reject'); + } catch (e: any) { + expect(String(e.message)).to.include('Org UID not found'); + } + }); + + it('getOrgUsers resolves paginated invitations for non-owner admin org', async () => { + const getInvitations = sandbox.stub(); + getInvitations.onFirstCall().resolves({ items: [{ email: 'a@b.com' }] }); + getInvitations.onSecondCall().resolves({ items: [] }); + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: false, org_roles: [{ admin: true }] }], + }), + organization: () => ({ + getInvitations, + }), + } as any; + const res = await getOrgUsers(client, 'org-1'); + expect(res.items).to.have.lengthOf(1); + expect(getInvitations.calledTwice).to.equal(true); + }); + + it('getOrgUsers returns empty list when paginated invitations call fails', async () => { + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: false, org_roles: [{ admin: true }] }], + }), + organization: () => ({ + getInvitations: () => Promise.reject(new Error('network')), + }), + } as any; + const res = await getOrgUsers(client, 'org-1'); + expect(res.items).to.deep.equal([]); + }); + + it('getOrgRoles resolves roles for owner', async () => { + const roles = { items: [{ uid: 'r1' }] }; + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: true }], + }), + organization: () => ({ + roles: () => Promise.resolve(roles), + }), + } as any; + const res = await getOrgRoles(client, 'org-1'); + expect(res).to.equal(roles); + }); + + it('getOrgRoles rejects when not admin', async () => { + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: false, org_roles: [{ admin: false }] }], + }), + } as any; + try { + await getOrgRoles(client, 'org-1'); + expect.fail('expected reject'); + } catch (e: any) { + expect(String(e.message)).to.include(messages.ERROR_ADMIN_ACCESS_DENIED); + } + }); + + it('getOrgRoles resolves roles for non-owner admin org', async () => { + const roles = { items: [{ uid: 'r-admin' }] }; + const client = { + getUser: () => + Promise.resolve({ + organizations: [{ uid: 'org-1', is_owner: false, org_roles: [{ admin: true }] }], + }), + organization: () => ({ + roles: () => Promise.resolve(roles), + }), + } as any; + const res = await getOrgRoles(client, 'org-1'); + expect(res).to.equal(roles); + }); + }); + + describe('stacks, content types, languages, entries, environments', () => { + it('getStacks maps stack names to api keys', async () => { + const client = { + stack: () => ({ + query: () => ({ + find: () => Promise.resolve({ items: [{ name: 'Main', api_key: 'key-1' }] }), + }), + }), + } as any; + const map = await getStacks(client, 'org-uid'); + expect(map).to.deep.equal({ Main: 'key-1' }); + }); + + it('getStacks rejects when stack query fails', async () => { + const client = { + stack: () => ({ + query: () => ({ + find: () => Promise.reject(new Error('stack query failed')), + }), + }), + } as any; + try { + await getStacks(client, 'org-uid'); + expect.fail('expected reject'); + } catch (e: any) { + expect(e.message).to.equal('stack query failed'); + } + }); + + it('getContentTypeCount and getContentTypes', async () => { + const stack = createStackClient({ + contentTypeCount: { content_types: 7 }, + contentTypesFind: { items: [{ title: 'Page', uid: 'page' }] }, + }); + const n = await getContentTypeCount(stack); + expect(n).to.equal(7); + const ct = await getContentTypes(stack, 0); + expect(ct.Page).to.equal('page'); + }); + + it('getLanguages maps locale names to codes', async () => { + const stack = createStackClient({ + localesFind: { items: [{ name: 'French', code: 'fr-fr' }] }, + }); + const langs = await getLanguages(stack); + expect(langs.French).to.equal('fr-fr'); + }); + + it('getEntriesCount and getEntries', async () => { + const stack = createStackClient({ + entriesCount: { entries: 42 }, + entriesFind: { items: [{ uid: 'e1' }] }, + }); + const c = await getEntriesCount(stack, 'blog', 'en-us'); + expect(c).to.equal(42); + const entries = await getEntries(stack, 'blog', 'en-us', 0, 10); + expect(entries.items).to.deep.equal([{ uid: 'e1' }]); + }); + + it('getEnvironments maps uid to name', async () => { + const stack = createStackClient({ + envFind: { items: [{ uid: 'e1', name: 'Prod' }] }, + }); + const env = await getEnvironments(stack); + expect(env.e1).to.equal('Prod'); + }); + }); + + describe('teams and roles', () => { + it('getAllTeams returns fetchAll payload', async () => { + const payload = { items: [{ uid: 't1' }], count: 1 } as any; + const client = { + organization: () => ({ + teams: () => ({ + fetchAll: () => Promise.resolve(payload), + }), + }), + } as any; + const res = await getAllTeams(client, { uid: 'org', name: 'O' }); + expect(res).to.equal(payload); + }); + + it('getAllTeams calls handleErrorMsg on failure', async () => { + const h = sandbox.stub(errorHandler, 'handleErrorMsg'); + const client = { + organization: () => ({ + teams: () => ({ + fetchAll: () => Promise.reject(new Error('fail')), + }), + }), + } as any; + await getAllTeams(client, { uid: 'org', name: 'O' }); + expect(h.calledOnce).to.equal(true); + }); + + it('exportOrgTeams aggregates pages and cleans teams', async () => { + const org = { uid: 'org1', name: 'Acme Org' }; + let calls = 0; + const client = { + organization: (uid: string) => { + expect(uid).to.equal('org1'); + return { + teams: () => ({ + fetchAll: () => { + calls++; + if (calls === 1) { + return Promise.resolve({ + items: [ + { + uid: 't1', + name: 'Team1', + organizationRole: 'mem', + users: [{ id: 1 }], + description: 'd', + }, + ], + count: 1, + }); + } + return Promise.resolve({ items: [], count: 1 }); + }, + }), + roles: () => + Promise.resolve({ + items: [ + { name: 'member', uid: 'mem' }, + { name: 'admin', uid: 'adm' }, + ], + }), + }; + }, + } as any; + const cleaned = await exportOrgTeams(client, org); + expect(cleaned).to.have.lengthOf(1); + expect(cleaned[0].uid).to.equal('t1'); + expect(cleaned[0].organizationRole).to.equal('member'); + }); + + it('getRoleData returns items or empty on error', async () => { + const okClient = { + stack: () => ({ + role: () => ({ + fetchAll: () => Promise.resolve({ items: [{ uid: 'r', name: 'Editor' }] }), + }), + }), + } as any; + const ok = await getRoleData(okClient, 'key'); + expect(ok.items).to.have.lengthOf(1); + + const badClient = { + stack: () => ({ + role: () => ({ + fetchAll: () => Promise.reject(new Error('nope')), + }), + }), + } as any; + const empty = await getRoleData(badClient, 'key'); + expect(empty.items).to.deep.equal([]); + }); + }); + + describe('taxonomySDKHandler and helpers', () => { + const basePayload = { + stackAPIClient: createStackClient({ + taxonomyFind: { items: [{ uid: 'tax1' }], count: 1 }, + taxonomyFetch: { uid: 'tax1', name: 'Taxonomy' }, + termsFind: { items: [{ uid: 'term1' }], count: 1 }, + taxonomyExport: 'a,b\n1,2', + }), + taxonomyUID: 'tax1', + limit: 10, + locale: 'en', + branch: 'main', + include_fallback: false, + fallback_locale: undefined, + } as any; + + it('taxonomies type returns find result', async () => { + const res = await taxonomySDKHandler({ ...basePayload, type: 'taxonomies' }); + expect((res as any).items).to.have.lengthOf(1); + }); + + it('taxonomy type returns fetch result', async () => { + const res = await taxonomySDKHandler({ ...basePayload, type: 'taxonomy' }); + expect((res as any).uid).to.equal('tax1'); + }); + + it('terms type returns terms find', async () => { + const res = await taxonomySDKHandler({ ...basePayload, type: 'terms' }); + expect((res as any).items[0].uid).to.equal('term1'); + }); + + it('export-taxonomies returns csv string', async () => { + const res = await taxonomySDKHandler({ ...basePayload, type: 'export-taxonomies', format: 'csv' }); + expect(res).to.include('a,b'); + }); + + it('default type calls handleTaxonomyErrorMsg', async () => { + const stub = sandbox.stub(errorHandler, 'handleTaxonomyErrorMsg'); + await taxonomySDKHandler({ ...basePayload, type: 'invalid' as any }); + expect(stub.calledOnce).to.equal(true); + }); + + it('getAllTaxonomies aggregates pages', async () => { + const stack = createStackClient({ + taxonomyFind: { + items: [{ uid: 'a' }, { uid: 'b' }], + count: 3, + }, + }); + const payload = { ...basePayload, stackAPIClient: stack, limit: 2, type: 'taxonomies' }; + const list = await getAllTaxonomies(payload); + expect(list.map((t) => t.uid)).to.deep.equal(['a', 'b', 'a', 'b']); + }); + + it('getAllTermsOfTaxonomy aggregates', async () => { + const stack = createStackClient({ + termsFind: { items: [{ uid: 't1' }], count: 2 }, + }); + const payload = { ...basePayload, stackAPIClient: stack, limit: 1, type: 'terms' }; + const terms = await getAllTermsOfTaxonomy(payload); + expect(terms.length).to.be.greaterThan(0); + }); + + it('getTaxonomy delegates to handler', async () => { + const tax = await getTaxonomy({ ...basePayload, type: 'taxonomy' }); + expect(tax.uid).to.equal('tax1'); + }); + + it('createImportableCSV parses export csv', async () => { + const stack = createStackClient({ + taxonomyExport: 'col1,col2\nv1,v2', + }); + const payload = { ...basePayload, stackAPIClient: stack, limit: 10 } as any; + const out = await createImportableCSV(payload, [{ uid: 'tax1' } as any]); + expect(out.headers.length).to.be.greaterThan(0); + expect(out.taxonomiesData.length).to.be.greaterThan(0); + }); + }); +}); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/api-client.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/api-client.test.ts index 915218a4c..cad6b7781 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/api-client.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/api-client.test.ts @@ -13,16 +13,13 @@ import { getEnvironments, getAllTeams, exportOrgTeams, + getRoleData, getAllTaxonomies, getAllTermsOfTaxonomy, getTaxonomy, createImportableCSV, } from '../../../src/utils/api-client'; -// API client functions are tightly coupled to the Contentstack SDK -// These tests verify the function signatures and basic structure -// Full integration testing requires actual SDK mocking or E2E tests - describe('api-client', () => { describe('module exports', () => { it('should export all expected functions', () => { @@ -39,6 +36,7 @@ describe('api-client', () => { expect(getEnvironments).to.be.a('function'); expect(getAllTeams).to.be.a('function'); expect(exportOrgTeams).to.be.a('function'); + expect(getRoleData).to.be.a('function'); expect(getAllTaxonomies).to.be.a('function'); expect(getAllTermsOfTaxonomy).to.be.a('function'); expect(getTaxonomy).to.be.a('function'); @@ -46,7 +44,5 @@ describe('api-client', () => { }); }); - // Note: Full functional tests for api-client require mocking the @contentstack/management SDK - // This is complex due to the SDK's internal structure. These tests are better suited for - // integration testing with a test stack or using more sophisticated mocking tools. + // Note: Functional tests use mocked SDK chains; keep in a dedicated file when re-adding coverage. }); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/csv-writer.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/csv-writer.test.ts index 397a2c9f2..b2d14b6c9 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/csv-writer.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/csv-writer.test.ts @@ -1,5 +1,10 @@ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; import { expect } from 'chai'; -import { csvParse } from '../../../src/utils/csv-writer'; +import sinon from 'sinon'; +import * as cliUtilities from '@contentstack/cli-utilities'; +import { csvParse, write } from '../../../src/utils/csv-writer'; describe('csv-writer', () => { describe('module exports', () => { @@ -68,8 +73,68 @@ describe('csv-writer', () => { expect(headers).to.deep.equal(['name', 'description']); expect(result).to.have.lengthOf(1); }); + }); - // Note: The write() function modifies process.cwd() and writes to filesystem - // These side effects are better tested via integration tests + describe('write', () => { + let originalCwd: string; + let tmpRoot: string; + let cliuxPrintStub: sinon.SinonStub; + + beforeEach(() => { + originalCwd = process.cwd(); + tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'csv-writer-test-')); + process.chdir(tmpRoot); + cliuxPrintStub = sinon.stub(cliUtilities.cliux, 'print'); + }); + + afterEach(() => { + cliuxPrintStub.restore(); + try { + process.chdir(originalCwd); + } catch { + // ignore + } + if (tmpRoot && fs.existsSync(tmpRoot)) { + fs.rmSync(tmpRoot, { recursive: true, force: true }); + } + }); + + async function waitForFile(filePath: string, maxMs = 3000): Promise { + const start = Date.now(); + while (!fs.existsSync(filePath)) { + if (Date.now() - start > maxMs) { + throw new Error(`Timeout waiting for ${filePath}`); + } + await new Promise((r) => setImmediate(r)); + } + } + + it('should create data dir, chdir, print message, and write CSV rows', async () => { + const rows = [{ a: '1', b: '2' }]; + const fileName = 'out-test.csv'; + + write(null, rows as any, fileName, 'test rows', '|'); + + expect(cliuxPrintStub.calledOnce).to.equal(true); + expect(cliuxPrintStub.firstCall.args[0]).to.include('test rows'); + expect(cliuxPrintStub.firstCall.args[0]).to.include(fileName); + + const dataDir = path.join(tmpRoot, 'data'); + expect(fs.existsSync(dataDir)).to.equal(true); + const written = path.join(dataDir, fileName); + await waitForFile(written); + const content = fs.readFileSync(written, 'utf8'); + expect(content).to.include('a'); + expect(content).to.include('|'); + }); + + it('should use custom headers when provided', async () => { + const rows = [{ x: 1 }]; + write(null, rows as any, 'headers.csv', 'with headers', ',', ['x']); + + const written = path.join(tmpRoot, 'data', 'headers.csv'); + await waitForFile(written); + }); + }); }); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/data-transform.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/data-transform.test.ts index c0a9ef6d1..5617095ee 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/data-transform.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/data-transform.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +import sinon from 'sinon'; import { flatten, sanitizeData, @@ -7,6 +8,7 @@ import { getMappedRoles, determineUserOrgRole, cleanOrgUsers, + cleanTeamsData, getTeamsUserDetails, formatTaxonomiesData, formatTermsOfTaxonomyData, @@ -14,6 +16,7 @@ import { getFormattedDate, getDateTime, } from '../../../src/utils/data-transform'; +import * as errorHandler from '../../../src/utils/error-handler'; describe('data-transform', () => { describe('flatten', () => { @@ -375,6 +378,129 @@ describe('data-transform', () => { const result = cleanOrgUsers(orgUsers, mappedUsers, mappedRoles); expect(result[0]['Invited By']).to.equal('System'); }); + + it('should use System when mappedUsers lookup throws', () => { + const orgUsers = { + items: [ + { + email: 'user@test.com', + user_uid: 'uid1', + org_roles: [], + status: 'active', + invited_by: 'throws', + created_at: '2024-01-15T00:00:00Z', + updated_at: '2024-01-16T00:00:00Z', + }, + ], + } as any; + + const mappedUsers = new Proxy( + { uid1: 'user@test.com', System: 'System' }, + { + get(target, prop: string) { + if (prop === 'throws') { + throw new Error('lookup failed'); + } + return (target as any)[prop]; + }, + }, + ) as any; + const mappedRoles = {}; + + const result = cleanOrgUsers(orgUsers, mappedUsers, mappedRoles); + expect(result[0]['Invited By']).to.equal('System'); + }); + }); + + describe('cleanTeamsData', () => { + const org = { name: 'Acme', uid: 'org-1' }; + + it('should return empty array when data is empty', async () => { + const client = { + organization() { + return { + roles: () => Promise.resolve({ items: [{ name: 'member', uid: 'm' }, { name: 'admin', uid: 'a' }] }), + }; + }, + } as any; + + const result = await cleanTeamsData([], client, org); + expect(result).to.deep.equal([]); + }); + + it('should map member vs admin, default description, and member count', async () => { + const memberUid = 'role-member'; + const adminUid = 'role-admin'; + const client = { + organization(uid: string) { + expect(uid).to.equal(org.uid); + return { + roles: () => + Promise.resolve({ + items: [ + { name: 'member', uid: memberUid }, + { name: 'admin', uid: adminUid }, + ], + }), + }; + }, + } as any; + + const teams = [ + { + uid: 't1', + name: 'Team M', + organizationRole: memberUid, + users: [{ id: 1 }, { id: 2 }], + _id: 'x', + description: 'has desc', + }, + { + uid: 't2', + name: 'Team A', + organizationRole: adminUid, + users: [], + _id: 'y', + }, + ] as any[]; + + const result = await cleanTeamsData(teams, client, org); + + expect(result).to.have.lengthOf(2); + expect(result[0].organizationRole).to.equal('member'); + expect(result[0].Total_Members).to.equal(2); + expect(result[1].organizationRole).to.equal('admin'); + expect(result[1].description).to.equal(''); + expect(result[1].Total_Members).to.equal(0); + }); + + it('should call handleErrorMsg when roles fetch fails', async () => { + const stub = sinon.stub(errorHandler, 'handleErrorMsg').callsFake(() => undefined as never); + try { + const client = { + organization() { + return { + roles: () => Promise.reject(new Error('roles unavailable')), + }; + }, + } as any; + + const teams = [ + { + uid: 't1', + name: 'T', + organizationRole: 'any', + users: [], + }, + ] as any[]; + + await cleanTeamsData(teams, client, org); + + expect(stub.calledOnce).to.equal(true); + } finally { + stub.restore(); + } + }); }); describe('getTeamsUserDetails', () => { diff --git a/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts index 3f775e3c0..3f412fa9d 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts @@ -1,8 +1,12 @@ import { expect } from 'chai'; import sinon from 'sinon'; +import * as cliUtilities from '@contentstack/cli-utilities'; import { formatError, wait, + handleErrorMsg, + handleTaxonomyErrorMsg, + exitProgram, } from '../../../src/utils/error-handler'; describe('error-handler', () => { @@ -167,7 +171,108 @@ describe('error-handler', () => { }); }); - // Note: handleErrorMsg, handleTaxonomyErrorMsg, and exitProgram call process.exit() - // Testing these would require stubbing process.exit which can be complex. - // For coverage purposes, we test formatError and wait which cover most logic. + describe('handleErrorMsg', () => { + let sandbox: sinon.SinonSandbox; + let printStub: sinon.SinonStub; + let exitStub: sinon.SinonStub; + let parseStub: sinon.SinonStub; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + exitStub = sandbox.stub(process, 'exit').callsFake(() => undefined as never); + printStub = sandbox.stub(cliUtilities.cliux, 'print'); + parseStub = sandbox.stub(cliUtilities.messageHandler, 'parse').returns('fallback-api-failed'); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should print errorMessage and exit with 1', () => { + handleErrorMsg({ errorMessage: 'Bad request' }, { ctx: 'x' }); + expect(printStub.calledWith('Error: Bad request', { color: 'red' })).to.be.true; + expect(exitStub.calledWith(1)).to.be.true; + }); + + it('should use message when errorMessage is absent', () => { + handleErrorMsg(new Error('Plain err')); + expect(printStub.calledWith('Error: Plain err', { color: 'red' })).to.be.true; + expect(exitStub.calledWith(1)).to.be.true; + }); + + it('should fall back to messageHandler when no message fields', () => { + handleErrorMsg({}); + expect(parseStub.calledWith('CLI_EXPORT_CSV_API_FAILED')).to.be.true; + expect(printStub.calledWith('Error: fallback-api-failed', { color: 'red' })).to.be.true; + expect(exitStub.calledWith(1)).to.be.true; + }); + }); + + describe('handleTaxonomyErrorMsg', () => { + let sandbox: sinon.SinonSandbox; + let printStub: sinon.SinonStub; + let exitStub: sinon.SinonStub; + let consoleStub: sinon.SinonStub; + let parseStub: sinon.SinonStub; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + exitStub = sandbox.stub(process, 'exit').callsFake(() => undefined as never); + printStub = sandbox.stub(cliUtilities.cliux, 'print'); + parseStub = sandbox.stub(cliUtilities.messageHandler, 'parse').returns('taxonomy-fallback'); + consoleStub = sandbox.stub(console, 'log'); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should prefer errorMessage', () => { + handleTaxonomyErrorMsg({ errorMessage: 'Tax failed' }); + expect(printStub.calledWith('Error: Tax failed', { color: 'red' })).to.be.true; + expect(exitStub.calledWith(1)).to.be.true; + }); + + it('should use errors.taxonomy when branch taken via message', () => { + handleTaxonomyErrorMsg({ message: 'wrapper', errors: { taxonomy: 'bad tax' } }); + expect(printStub.calledWith('Error: bad tax', { color: 'red' })).to.be.true; + }); + + it('should use errors.term when taxonomy absent but branch taken', () => { + handleTaxonomyErrorMsg({ message: 'wrapper', errors: { term: 'bad term' } }); + expect(printStub.calledWith('Error: bad term', { color: 'red' })).to.be.true; + }); + + it('should use message when present on object', () => { + handleTaxonomyErrorMsg({ message: 'msg path' }); + expect(printStub.calledWith('Error: msg path', { color: 'red' })).to.be.true; + }); + + it('should use fallback branch when no recognizable fields', () => { + handleTaxonomyErrorMsg({ foo: 1 }); + expect(consoleStub.called).to.be.true; + expect(parseStub.calledWith('CLI_EXPORT_CSV_API_FAILED')).to.be.true; + expect(printStub.calledWith('Error: taxonomy-fallback', { color: 'red' })).to.be.true; + expect(exitStub.calledWith(1)).to.be.true; + }); + }); + + describe('exitProgram', () => { + let sandbox: sinon.SinonSandbox; + let exitStub: sinon.SinonStub; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + exitStub = sandbox.stub(process, 'exit').callsFake(() => undefined as never); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should exit with 0', () => { + exitProgram(); + expect(exitStub.calledWith(0)).to.be.true; + }); + }); }); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/interactive.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/interactive.test.ts index e5518bb38..8cef315f1 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/interactive.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/interactive.test.ts @@ -1,32 +1,303 @@ import { expect } from 'chai'; -import { - startupQuestions, - chooseOrganization, - chooseStack, - chooseBranch, - chooseContentType, - chooseInMemContentTypes, - chooseLanguage, - chooseFallbackOptions, - promptContinueExport, -} from '../../../src/utils/interactive'; +import sinon from 'sinon'; +import * as cliUtilities from '@contentstack/cli-utilities'; +import * as apiClient from '../../../src/utils/api-client'; +import * as errorHandler from '../../../src/utils/error-handler'; +import { messages } from '../../../src/messages'; + +type InquirerMod = typeof import('@inquirer/prompts'); + +function uncacheResolved(id: string): void { + delete require.cache[id]; +} + +/** @inquirer/prompts exports select/checkbox/confirm via getters; replace with data properties so stubs apply. */ +function setPromptExport( + promptsMod: InquirerMod, + key: 'select' | 'checkbox' | 'confirm', + fn: (...args: unknown[]) => unknown, +): void { + Object.defineProperty(promptsMod, key, { + configurable: true, + enumerable: true, + writable: true, + value: fn, + }); +} + +/** Reload @inquirer/prompts and interactive so interactive uses patched prompt functions. */ +function loadInteractiveWithInquirerSetup(setupPrompts: (p: InquirerMod) => void): typeof import('../../../src/utils/interactive') { + uncacheResolved(require.resolve('../../../src/utils/interactive')); + uncacheResolved(require.resolve('@inquirer/prompts')); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const promptsMod = require('@inquirer/prompts') as InquirerMod; + setupPrompts(promptsMod); + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(require.resolve('../../../src/utils/interactive')) as typeof import('../../../src/utils/interactive'); +} describe('interactive', () => { - describe('module exports', () => { + let sandbox: sinon.SinonSandbox; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('module shape', () => { it('should export all interactive functions', () => { - expect(startupQuestions).to.be.a('function'); - expect(chooseOrganization).to.be.a('function'); - expect(chooseStack).to.be.a('function'); - expect(chooseBranch).to.be.a('function'); - expect(chooseContentType).to.be.a('function'); - expect(chooseInMemContentTypes).to.be.a('function'); - expect(chooseLanguage).to.be.a('function'); - expect(chooseFallbackOptions).to.be.a('function'); - expect(promptContinueExport).to.be.a('function'); + const m = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves(messages.ACTION_EXPORT_ENTRIES) as any); + }); + expect(m.startupQuestions).to.be.a('function'); + expect(m.chooseOrganization).to.be.a('function'); + expect(m.chooseStack).to.be.a('function'); + expect(m.chooseBranch).to.be.a('function'); + expect(m.chooseContentType).to.be.a('function'); + expect(m.chooseInMemContentTypes).to.be.a('function'); + expect(m.chooseLanguage).to.be.a('function'); + expect(m.chooseFallbackOptions).to.be.a('function'); + expect(m.promptContinueExport).to.be.a('function'); + }); + }); + + describe('startupQuestions (5a)', () => { + it('should return selected action', async () => { + const { startupQuestions } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves(messages.ACTION_EXPORT_ENTRIES) as any); + }); + const action = await startupQuestions(); + expect(action).to.equal(messages.ACTION_EXPORT_ENTRIES); + }); + + it('should call exitProgram when user chooses Exit', async () => { + const exitStub = sandbox.stub(errorHandler, 'exitProgram'); + const { startupQuestions } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('Exit') as any); + }); + await startupQuestions(); + expect(exitStub.calledOnce).to.equal(true); }); }); - // Note: Interactive functions use inquirer.prompt() which requires - // user input simulation. These are better tested via integration tests - // or using tools like @inquirer/testing. + describe('chooseOrganization (5b)', () => { + it('should use getOrganizations for default action', async () => { + sandbox.stub(apiClient, 'getOrganizations').resolves({ Acme: 'org-1' }); + sandbox.stub(apiClient, 'getOrganizationsWhereUserIsAdmin').resolves({ AdminCo: 'org-2' }); + const { chooseOrganization } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('Acme') as any); + }); + const client = {} as any; + const result = await chooseOrganization(client, messages.ACTION_EXPORT_ENTRIES); + expect((apiClient.getOrganizations as sinon.SinonStub).calledOnce).to.equal(true); + expect((apiClient.getOrganizationsWhereUserIsAdmin as sinon.SinonStub).called).to.equal(false); + expect(result).to.deep.equal({ name: 'Acme', uid: 'org-1' }); + }); + + it('should use getOrganizationsWhereUserIsAdmin for users action', async () => { + sandbox.stub(apiClient, 'getOrganizations').resolves({ Acme: 'org-1' }); + sandbox.stub(apiClient, 'getOrganizationsWhereUserIsAdmin').resolves({ AdminCo: 'org-2' }); + const { chooseOrganization } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('AdminCo') as any); + }); + const client = {} as any; + const result = await chooseOrganization(client, messages.ACTION_EXPORT_USERS); + expect((apiClient.getOrganizationsWhereUserIsAdmin as sinon.SinonStub).calledOnce).to.equal(true); + expect(result).to.deep.equal({ name: 'AdminCo', uid: 'org-2' }); + }); + + it('should use getOrganizationsWhereUserIsAdmin for teams action string', async () => { + sandbox.stub(apiClient, 'getOrganizationsWhereUserIsAdmin').resolves({ T: 'org-t' }); + const { chooseOrganization } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('T') as any); + }); + const result = await chooseOrganization({} as any, 'teams'); + expect((apiClient.getOrganizationsWhereUserIsAdmin as sinon.SinonStub).calledOnce).to.equal(true); + expect(result.uid).to.equal('org-t'); + }); + + it('should exit when user cancels', async () => { + sandbox.stub(apiClient, 'getOrganizations').resolves({ A: '1' }); + const exitStub = sandbox.stub(errorHandler, 'exitProgram'); + const { chooseOrganization } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves(messages.ACTION_CANCEL) as any); + }); + await chooseOrganization({} as any); + expect(exitStub.calledOnce).to.equal(true); + }); + }); + + describe('chooseStack (5c)', () => { + it('should return stack by api key when found', async () => { + sandbox.stub(apiClient, 'getStacks').resolves({ MyStack: 'key-123' }); + const { chooseStack } = loadInteractiveWithInquirerSetup(() => { + /* no prompts when api key resolves */ + }); + const result = await chooseStack({} as any, 'org-1', 'key-123'); + expect(result).to.deep.equal({ name: 'MyStack', apiKey: 'key-123' }); + }); + + it('should throw when stack api key not found', async () => { + sandbox.stub(apiClient, 'getStacks').resolves({ MyStack: 'key-123' }); + const { chooseStack } = loadInteractiveWithInquirerSetup(() => {}); + try { + await chooseStack({} as any, 'org-1', 'missing'); + expect.fail('expected throw'); + } catch (e: any) { + expect(String(e.message)).to.include('Could not find stack'); + } + }); + + it('should prompt and return chosen stack', async () => { + sandbox.stub(apiClient, 'getStacks').resolves({ S1: 'k1', S2: 'k2' }); + const { chooseStack } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('S2') as any); + }); + const result = await chooseStack({} as any, 'org-1'); + expect(result).to.deep.equal({ name: 'S2', apiKey: 'k2' }); + }); + + it('should exit when user cancels stack selection', async () => { + sandbox.stub(apiClient, 'getStacks').resolves({ S1: 'k1' }); + const exitStub = sandbox.stub(errorHandler, 'exitProgram'); + const { chooseStack } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves(messages.ACTION_CANCEL) as any); + }); + await chooseStack({} as any, 'org-1'); + expect(exitStub.calledOnce).to.equal(true); + }); + }); + + describe('chooseBranch (5d)', () => { + it('should return selected branch uid', async () => { + const { chooseBranch } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('br-main') as any); + }); + const result = await chooseBranch([{ uid: 'br-main', name: 'main' } as any]); + expect(result).to.deep.equal({ branch: 'br-main' }); + }); + + it('should log and rethrow on select error', async () => { + const err = new Error('prompt failed'); + const errStub = sandbox.stub(cliUtilities.cliux, 'error'); + const { chooseBranch } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().rejects(err) as any); + }); + try { + await chooseBranch([{ uid: 'b1' } as any]); + expect.fail('expected throw'); + } catch (e: any) { + expect(e.message).to.equal('prompt failed'); + } + expect(errStub.calledOnce).to.equal(true); + }); + }); + + describe('chooseContentType & chooseInMemContentTypes (5d)', () => { + it('should return checkbox selection from getContentTypes', async () => { + sandbox.stub(apiClient, 'getContentTypes').resolves({ ct1: 'blog', ct2: 'page' } as any); + const { chooseContentType } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'checkbox', sandbox.stub().resolves(['blog']) as any); + }); + const result = await chooseContentType({} as any, 0); + expect(result).to.deep.equal(['blog']); + }); + + it('should loop until at least one content type selected', async () => { + const printStub = sandbox.stub(cliUtilities.cliux, 'print'); + const { chooseInMemContentTypes } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport( + p, + 'checkbox', + sandbox.stub().onFirstCall().resolves([]).onSecondCall().resolves(['a']) as any, + ); + }); + const result = await chooseInMemContentTypes(['a', 'b']); + expect(result).to.deep.equal(['a']); + expect(printStub.calledOnce).to.equal(true); + }); + }); + + describe('chooseLanguage & chooseFallbackOptions & promptContinueExport (5e)', () => { + it('should return chosen language', async () => { + sandbox.stub(apiClient, 'getLanguages').resolves({ English: 'en-us', French: 'fr-fr' } as any); + const { chooseLanguage } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('French') as any); + }); + const result = await chooseLanguage({} as any); + expect(result).to.deep.equal({ name: 'French', code: 'fr-fr' }); + }); + + it('should exit when language selection cancelled', async () => { + sandbox.stub(apiClient, 'getLanguages').resolves({ English: 'en-us' } as any); + sandbox.stub(errorHandler, 'exitProgram'); + const { chooseLanguage } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves(messages.ACTION_CANCEL) as any); + }); + await chooseLanguage({} as any); + expect((errorHandler.exitProgram as unknown as sinon.SinonStub).calledOnce).to.equal(true); + }); + + it('should return fallback options without locale when confirm false', async () => { + const { chooseFallbackOptions } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'confirm', sandbox.stub().resolves(false) as any); + }); + const result = await chooseFallbackOptions({} as any); + expect(result).to.deep.equal({ includeFallback: false, fallbackLocale: null }); + }); + + it('should load languages and set fallback locale when confirm true', async () => { + sandbox.stub(apiClient, 'getLanguages').resolves({ English: 'en-us', German: 'de-de' } as any); + const { chooseFallbackOptions } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'confirm', sandbox.stub().resolves(true) as any); + setPromptExport(p, 'select', sandbox.stub().resolves('German') as any); + }); + const result = await chooseFallbackOptions({} as any); + expect(result.includeFallback).to.equal(true); + expect(result.fallbackLocale).to.equal('de-de'); + }); + + it('should rethrow when getLanguages fails after confirm true (catch path)', async () => { + sandbox.stub(apiClient, 'getLanguages').rejects(new Error('lang fetch failed')); + const { chooseFallbackOptions } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'confirm', sandbox.stub().resolves(true) as any); + }); + try { + await chooseFallbackOptions({} as any); + expect.fail('expected rejection'); + } catch (e: any) { + expect(e.message).to.equal('lang fetch failed'); + } + }); + + it('should return true when user confirms continue export', async () => { + const { promptContinueExport } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('yes') as any); + }); + const ok = await promptContinueExport(); + expect(ok).to.equal(true); + }); + + it('should return false when user declines', async () => { + const { promptContinueExport } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().resolves('no') as any); + }); + const ok = await promptContinueExport(); + expect(ok).to.equal(false); + }); + + it('should print and exit on prompt error', async () => { + const printStub = sandbox.stub(cliUtilities.cliux, 'print'); + const exitStub = sandbox.stub(process, 'exit' as any); + const { promptContinueExport } = loadInteractiveWithInquirerSetup((p) => { + setPromptExport(p, 'select', sandbox.stub().rejects(new Error('tty')) as any); + }); + await promptContinueExport(); + expect(printStub.calledOnce).to.equal(true); + expect(exitStub.calledWith(1)).to.equal(true); + }); + }); }); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts new file mode 100644 index 000000000..427848f69 --- /dev/null +++ b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.functional.test.ts @@ -0,0 +1,217 @@ +import { expect } from 'chai'; +import sinon from 'sinon'; +import * as cliUtilities from '@contentstack/cli-utilities'; +import * as apiClient from '../../../src/utils/api-client'; +import * as csvWriter from '../../../src/utils/csv-writer'; + +/** Other suites evict `interactive` from require.cache; always load the canonical instance before stubbing. */ +function loadInteractiveFresh(): typeof import('../../../src/utils/interactive') { + const id = require.resolve('../../../src/utils/interactive'); + delete require.cache[id]; + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(id) as typeof import('../../../src/utils/interactive'); +} + +function loadTeamsExport(): typeof import('../../../src/utils/teams-export') { + const id = require.resolve('../../../src/utils/teams-export'); + delete require.cache[id]; + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(id) as typeof import('../../../src/utils/teams-export'); +} + +describe('teams-export functional', () => { + let sandbox: sinon.SinonSandbox; + const org = { name: 'Test Org', uid: 'org-1' }; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + sandbox.stub(cliUtilities.cliux, 'loader').returns(undefined); + sandbox.stub(cliUtilities.cliux, 'print'); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('exportTeams returns early when no teams (7a)', async () => { + sandbox.stub(apiClient, 'exportOrgTeams').resolves([] as any); + const { exportTeams } = loadTeamsExport(); + await exportTeams({} as any, org, undefined, ','); + const printStub = cliUtilities.cliux.print as sinon.SinonStub; + const noTeamMsg = printStub.getCalls().some((c) => String(c.args[0]).includes('does not have any teams')); + expect(noTeamMsg).to.equal(true); + }); + + it('exportTeams writes CSV and passes delimiter to write (7b)', async () => { + const team = { + uid: 't1', + name: 'Team A', + description: 'd', + organizationRole: 'mem', + Total_Members: 1, + users: [], + stackRoleMapping: [], + }; + sandbox.stub(apiClient, 'exportOrgTeams').resolves([team] as any); + const writeSpy = sandbox.stub(csvWriter, 'write'); + sandbox.stub(apiClient, 'getRoleData').resolves({ items: [] } as any); + const interactiveMod = loadInteractiveFresh(); + sandbox.stub(interactiveMod, 'promptContinueExport').resolves(true); + const { exportTeams } = loadTeamsExport(); + await exportTeams({} as any, org, undefined, '|'); + expect(writeSpy.called).to.equal(true); + const delimiterArgs = writeSpy.getCalls().map((c) => c.args[4]); + expect(delimiterArgs).to.include('|'); + }); + + it('getTeamsDetail writes all teams when no teamUid (7c)', async () => { + const writeSpy = sandbox.stub(csvWriter, 'write'); + const { getTeamsDetail } = loadTeamsExport(); + const teams = [ + { uid: 't1', name: 'A', users: [{ id: 1, active: true }] }, + ] as any[]; + await getTeamsDetail(teams, org, undefined, ','); + expect(writeSpy.calledOnce).to.equal(true); + }); + + it('getTeamsDetail handles missing team uid (7c)', async () => { + const { getTeamsDetail } = loadTeamsExport(); + const teams = [{ uid: 'other', name: 'A', users: [] }] as any[]; + await getTeamsDetail(teams, org, 'missing-uid', ','); + expect((cliUtilities.cliux.print as sinon.SinonStub).called).to.equal(true); + }); + + it('getTeamsDetail writes matched team users when teamUid is set (7c team branch)', async () => { + const writeSpy = sandbox.stub(csvWriter, 'write'); + const { getTeamsDetail } = loadTeamsExport(); + const teams = [ + { + uid: 'target-team', + name: 'Target Team', + users: [ + { id: 1, email: 'u@x.com', active: true, orgInvitationStatus: 'pending' }, + ], + }, + ] as any[]; + await getTeamsDetail(teams, org, 'target-team', ';'); + expect(writeSpy.calledOnce).to.equal(true); + const call = writeSpy.firstCall.args; + const rows = call[1] as any[]; + const fileName = call[2] as string; + expect(fileName).to.include('target-team'); + expect(fileName).to.include('_User_Details_export.csv'); + expect(rows).to.have.lengthOf(1); + expect(rows[0]['team-name']).to.equal('Target Team'); + expect(rows[0]['team-uid']).to.equal('target-team'); + expect(rows[0].active).to.equal(undefined); + expect(rows[0].orgInvitationStatus).to.equal(undefined); + }); + + it('exportRoleMappings with teamUid hits stack-not-admin warning path (7f)', async () => { + const teams = [ + { + uid: 't1', + name: 'T', + stackRoleMapping: [{ stackApiKey: 'k1', roles: ['r1'] }], + }, + ] as any[]; + sandbox.stub(apiClient, 'getRoleData').resolves({ + items: [ + { + uid: 'r1', + name: 'Role', + stack: { api_key: 'wrong-key', name: 'S', uid: 'su' }, + }, + ], + } as any); + const interactiveMod = loadInteractiveFresh(); + sandbox.stub(interactiveMod, 'promptContinueExport').resolves(true); + const writeSpy = sandbox.stub(csvWriter, 'write'); + const { exportRoleMappings } = loadTeamsExport(); + await exportRoleMappings({} as any, teams, 't1', ','); + + const printStub = cliUtilities.cliux.print as sinon.SinonStub; + const warned = printStub.getCalls().some((c) => String(c.args[0]).includes('Admin access denied')); + expect(warned).to.equal(true); + expect(writeSpy.calledOnce).to.equal(true); + const call = writeSpy.firstCall.args; + const rows = call[1] as any[]; + expect(rows[0]['Stack Name']).to.equal(''); + }); + + it('exportRoleMappings warns and exits when user declines (7d)', async () => { + const teams = [ + { + uid: 't1', + name: 'T', + stackRoleMapping: [{ stackApiKey: 'k1', roles: ['r1'] }], + }, + ] as any[]; + sandbox.stub(apiClient, 'getRoleData').resolves({ + items: [ + { + uid: 'r1', + name: 'Role', + stack: { api_key: 'wrong', name: 'S', uid: 'su' }, + }, + ], + } as any); + const interactiveMod = loadInteractiveFresh(); + sandbox.stub(interactiveMod, 'promptContinueExport').resolves(false); + const exitStub = sandbox.stub(process, 'exit' as any); + const { exportRoleMappings } = loadTeamsExport(); + await exportRoleMappings({} as any, teams, undefined, ','); + expect(exitStub.calledWith(1)).to.equal(true); + exitStub.restore(); + }); + + it('exportRoleMappings walks all teams when teamUid is omitted (nested loops)', async () => { + const teams = [ + { + uid: 't1', + name: 'T1', + stackRoleMapping: [{ stackApiKey: 'k1', roles: ['r1'] }], + }, + { + uid: 't2', + name: 'T2', + stackRoleMapping: [{ stackApiKey: 'k2', roles: ['r2'] }], + }, + ] as any[]; + const roleStub = sandbox.stub(apiClient, 'getRoleData'); + roleStub.onFirstCall().resolves({ + items: [{ uid: 'r1', name: 'Editor', stack: { api_key: 'k1', name: 'Stack1', uid: 's1' } }], + } as any); + roleStub.onSecondCall().resolves({ + items: [{ uid: 'r2', name: 'Author', stack: { api_key: 'wrong-k2', name: 'Stack2', uid: 's2' } }], + } as any); + const interactiveMod = loadInteractiveFresh(); + sandbox.stub(interactiveMod, 'promptContinueExport').resolves(true); + const writeSpy = sandbox.stub(csvWriter, 'write'); + const { exportRoleMappings } = loadTeamsExport(); + await exportRoleMappings({} as any, teams, undefined, '|'); + + expect(writeSpy.calledOnce).to.equal(true); + const rows = writeSpy.firstCall.args[1] as any[]; + expect(rows).to.have.lengthOf(2); + expect(rows[0]['Team Name']).to.equal('T1'); + expect(rows[1]['Team Name']).to.equal('T2'); + }); + + it('mapRoleWithTeams maps role rows (7e)', async () => { + sandbox.stub(apiClient, 'getRoleData').resolves({ + items: [ + { + uid: 'r1', + name: 'Editor', + stack: { api_key: 'k1', name: 'Stack1', uid: 'suid' }, + }, + ], + } as any); + const { mapRoleWithTeams } = loadTeamsExport(); + const rows = await mapRoleWithTeams({} as any, { stackApiKey: 'k1', roles: ['r1'] } as any, 'TeamX', 'tx'); + expect(rows[0]['Team Name']).to.equal('TeamX'); + expect(rows[0]['Stack Name']).to.equal('Stack1'); + expect(rows[0]['Role Name']).to.equal('Editor'); + }); +}); diff --git a/packages/contentstack-export-to-csv/test/unit/utils/teams-export.test.ts b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.test.ts index c7d03a946..1185f7e42 100644 --- a/packages/contentstack-export-to-csv/test/unit/utils/teams-export.test.ts +++ b/packages/contentstack-export-to-csv/test/unit/utils/teams-export.test.ts @@ -16,6 +16,5 @@ describe('teams-export', () => { }); }); - // Note: Team export functions interact with the Contentstack SDK and filesystem - // These are better tested via integration tests with proper SDK mocking + // Note: Team export flows call the SDK and csv-writer; cover with integration tests or isolated mocks. }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41615ac8b..8e7855df0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,7 +47,7 @@ importers: version: 8.57.1 eslint-config-oclif: specifier: ^6.0.68 - version: 6.0.164(eslint@8.57.1)(typescript@5.9.3) + version: 6.0.165(eslint@8.57.1)(typescript@5.9.3) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -56,7 +56,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@20.19.41) + version: 4.23.7(@types/node@20.19.41) sinon: specifier: ^17.0.1 version: 17.0.2 @@ -80,7 +80,7 @@ importers: version: 2.0.0-beta.8(@types/node@20.19.41) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -99,7 +99,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/chai': specifier: ^4.3.20 version: 4.3.20 @@ -120,7 +120,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.164(eslint@9.39.4)(typescript@5.9.3) + version: 6.0.165(eslint@9.39.4)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@9.39.4)(typescript@5.9.3) @@ -132,7 +132,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@20.19.41) + version: 4.23.7(@types/node@20.19.41) shx: specifier: ^0.4.0 version: 0.4.0 @@ -162,7 +162,7 @@ importers: version: 2.0.0-beta.8(@types/node@18.19.130) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 inquirer: specifier: 12.11.1 version: 12.11.1(@types/node@18.19.130) @@ -175,7 +175,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/inquirer': specifier: ^9.0.8 version: 9.0.9 @@ -202,7 +202,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@18.19.130) + version: 4.23.7(@types/node@18.19.130) tmp: specifier: 0.2.4 version: 0.2.4 @@ -223,7 +223,7 @@ importers: version: 2.0.0-beta.8(@types/node@22.19.19) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -248,7 +248,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.164(eslint@9.39.4)(typescript@4.9.5) + version: 6.0.165(eslint@9.39.4)(typescript@4.9.5) mocha: specifier: 10.8.2 version: 10.8.2 @@ -257,7 +257,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@22.19.19) + version: 4.23.7(@types/node@22.19.19) sinon: specifier: ^21.0.1 version: 21.1.2 @@ -287,7 +287,7 @@ importers: version: 2.0.0-beta.8(@types/node@18.19.130) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -312,7 +312,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/chai': specifier: ^4.3.0 version: 4.3.20 @@ -327,7 +327,7 @@ importers: version: 10.0.20 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + version: 5.62.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) chai: specifier: ^4.5.0 version: 4.5.0 @@ -336,7 +336,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.164(eslint@9.39.4)(typescript@5.9.3) + version: 6.0.165(eslint@9.39.4)(typescript@5.9.3) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -345,7 +345,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@18.19.130) + version: 4.23.7(@types/node@18.19.130) sinon: specifier: ^21.0.1 version: 21.1.2 @@ -372,7 +372,7 @@ importers: version: link:../contentstack-variants '@oclif/core': specifier: ^4.8.0 - version: 4.11.2 + version: 4.11.3 async: specifier: ^3.2.6 version: 3.2.6 @@ -415,10 +415,10 @@ importers: version: 2.0.0-beta.0 '@oclif/plugin-help': specifier: ^6.2.28 - version: 6.2.48 + version: 6.2.49 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -457,7 +457,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@22.19.19) + version: 4.23.7(@types/node@22.19.19) sinon: specifier: ^17.0.1 version: 17.0.2 @@ -481,14 +481,14 @@ importers: version: 2.0.0-beta.8(@types/node@20.19.41) '@oclif/core': specifier: ^4.8.0 - version: 4.11.2 + version: 4.11.3 fast-csv: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/chai': specifier: ^4.3.20 version: 4.3.20 @@ -509,7 +509,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.164(eslint@9.39.4)(typescript@5.9.3) + version: 6.0.165(eslint@9.39.4)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@9.39.4)(typescript@5.9.3) @@ -521,7 +521,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@20.19.41) + version: 4.23.7(@types/node@20.19.41) sinon: specifier: ^21.0.1 version: 21.1.2 @@ -551,7 +551,7 @@ importers: version: link:../contentstack-variants '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 big-json: specifier: ^3.2.0 version: 3.2.0 @@ -588,7 +588,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -609,13 +609,13 @@ importers: version: 14.18.63 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.3(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.4(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 eslint-config-oclif: specifier: ^6.0.89 - version: 6.0.164(eslint@9.39.4)(typescript@4.9.5) + version: 6.0.165(eslint@9.39.4)(typescript@4.9.5) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -624,7 +624,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@14.18.63) + version: 4.23.7(@types/node@14.18.63) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@14.18.63)(typescript@4.9.5) @@ -642,7 +642,7 @@ importers: version: 2.0.0-beta.8(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 big-json: specifier: ^3.2.0 version: 3.2.0 @@ -697,7 +697,7 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@8.59.3(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.4(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 @@ -712,7 +712,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@14.18.63) + version: 4.23.7(@types/node@14.18.63) rewire: specifier: ^9.0.1 version: 9.0.1 @@ -736,7 +736,7 @@ importers: version: 2.0.0-beta.8(@types/node@14.18.63)(debug@4.4.3) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 async: specifier: ^3.2.6 version: 3.2.6 @@ -764,7 +764,7 @@ importers: devDependencies: '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/mocha': specifier: ^8.2.3 version: 8.2.3 @@ -779,7 +779,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.62 - version: 6.0.164(eslint@9.39.4)(typescript@4.9.5) + version: 6.0.165(eslint@9.39.4)(typescript@4.9.5) jsdoc-to-markdown: specifier: ^8.0.3 version: 8.0.3 @@ -794,7 +794,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@14.18.63) + version: 4.23.7(@types/node@14.18.63) sinon: specifier: ^21.0.1 version: 21.1.2 @@ -821,7 +821,7 @@ importers: version: 2.0.0-beta.8(@types/node@20.19.41) '@oclif/core': specifier: ^4.10.5 - version: 4.11.2 + version: 4.11.3 async: specifier: ^3.2.6 version: 3.2.6 @@ -858,10 +858,10 @@ importers: version: 1.3.1 '@oclif/plugin-help': specifier: ^6.2.44 - version: 6.2.48 + version: 6.2.49 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/big-json': specifier: ^3.2.5 version: 3.2.5 @@ -897,7 +897,7 @@ importers: version: 8.57.1 eslint-config-oclif: specifier: ^6.0.157 - version: 6.0.164(eslint@8.57.1)(typescript@4.9.5) + version: 6.0.165(eslint@8.57.1)(typescript@4.9.5) husky: specifier: ^9.1.7 version: 9.1.7 @@ -909,7 +909,7 @@ importers: version: 15.1.0 oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@20.19.41) + version: 4.23.7(@types/node@20.19.41) sinon: specifier: ^17.0.2 version: 17.0.2 @@ -946,7 +946,7 @@ importers: devDependencies: '@oclif/plugin-help': specifier: ^6.2.28 - version: 6.2.48 + version: 6.2.49 '@types/inquirer': specifier: ^9.0.9 version: 9.0.9 @@ -970,7 +970,7 @@ importers: version: 9.39.4 eslint-config-oclif: specifier: ^6.0.137 - version: 6.0.164(eslint@9.39.4)(typescript@5.9.3) + version: 6.0.165(eslint@9.39.4)(typescript@5.9.3) eslint-config-oclif-typescript: specifier: ^3.1.14 version: 3.1.14(eslint@9.39.4)(typescript@5.9.3) @@ -979,7 +979,7 @@ importers: version: 29.7.0(@types/node@18.19.130)(ts-node@8.10.2(typescript@5.9.3)) oclif: specifier: ^4.17.46 - version: 4.23.2(@types/node@18.19.130) + version: 4.23.7(@types/node@18.19.130) ts-jest: specifier: ^29.4.6 version: 29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@18.19.130)(ts-node@8.10.2(typescript@5.9.3)))(typescript@5.9.3) @@ -997,7 +997,7 @@ importers: version: 2.0.0-beta.8(@types/node@20.19.41) '@oclif/core': specifier: ^4.3.0 - version: 4.11.2 + version: 4.11.3 lodash: specifier: ^4.18.1 version: 4.18.1 @@ -1013,7 +1013,7 @@ importers: version: 2.0.0-beta.0 '@oclif/test': specifier: ^4.1.18 - version: 4.1.18(@oclif/core@4.11.2) + version: 4.1.18(@oclif/core@4.11.3) '@types/node': specifier: ^20.19.39 version: 20.19.41 @@ -1055,134 +1055,98 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cloudfront@3.1047.0': - resolution: {integrity: sha512-KpCGmoUs0ShU/uQgdq6si94eEJ13ic/P8AIGRS6I3gAij9K2wYBLukUh42kP/5IyTYB/4PPCpyvJy9bFESAVdA==} + '@aws-sdk/client-cloudfront@3.1049.0': + resolution: {integrity: sha512-9ghj/qqA69bXmeEXSyUUIBTHZfx2eymMlD9rB5luaxbr3myUyTkRHSDz2zwcyzJsUw0jbhJJsQYeqAY9M7Xs3Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-s3@3.1047.0': - resolution: {integrity: sha512-gk8g31eqvgf7eLCpkVjWs9KL7gYgkomt3FT2o9tbIe6goYrBheN2lHxhCsTn1zFYbt7EwrZXTGkQPIQNIN0c5w==} + '@aws-sdk/client-s3@3.1049.0': + resolution: {integrity: sha512-e5ToFwYeHSfkKDPs/G0yhO7vxvfVOF6DhmlvI2xFi4m12NvjxPhaA2Y35QMaYLrw/oGPXmu9McfKnBm/oXYXbg==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.974.10': - resolution: {integrity: sha512-ZGFFlYynBR78Y/F8b/7y4i4sgW/iGwJSjoM7AZo5Et6vyr4/L0bunN+uzKMsvecCZyqcPp4RRK7Rs17l0kMujg==} + '@aws-sdk/core@3.974.12': + resolution: {integrity: sha512-qrqgioqYFjwR6LatVNS1L2Vk++EwRIxqSQXPKNv5Ofux2D8UNgqMQ1znnMyEImXquVPTtbf71fc128pvmU6y9A==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.8': resolution: {integrity: sha512-fVfUCL/Xh2zINYMPZvj+iBn6XWouQf0DAnjaWCI9MkmqXzL2Iy5FoQB8O7syFe6gN6AH1ecDDU58T51Ou0kFkA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.36': - resolution: {integrity: sha512-gE+CGuPZD1eqUWGSrM8CXDjlwuPujIuwI+IlorD1wE2RcANKKT4jscB9GY1nTJbjmXzD18sycsYbgCG5m3n4/g==} + '@aws-sdk/credential-provider-env@3.972.38': + resolution: {integrity: sha512-m3WjZEgPtioMhPmwqUt+DhlTJ2i9ufR6DhfkyXojb9puEvfR+ur2U5shavu5/Cc9WHHsDCvALi6UFHgcqjhQ5w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.38': - resolution: {integrity: sha512-cHZo3bV6zN9joDQ2AYVctfzHTKStxWKwnGu0z7GwCUC+DAtB3qL/+26l+a63RbmFbVvb1JK+0vJKodN3hRMwyw==} + '@aws-sdk/credential-provider-http@3.972.40': + resolution: {integrity: sha512-D78L/m2Dr6cJnnSvWoAudPhQmCwmJ7j6APXsPYmFpPaKfQTfCSu0rdm8j14Np+VmXF9z8Aj8HE3xFpsrwtfgeg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.40': - resolution: {integrity: sha512-0NFGS9I3PD2yMveQqqpwpRdyZVStzgk0Yr2rZHh80kV/QNqQCK5lSrksvU3nBcRNSUF5Uk8rL3Xk0EVR+UVAnA==} + '@aws-sdk/credential-provider-ini@3.972.42': + resolution: {integrity: sha512-Mu5ESvFXeinafVM8jTIvRqcvK2Ehj4kz3auT39yUcHwu1Vfxo6xRlmUafdKLW4tusjAJukQwK09sCSMgOm7OKg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.40': - resolution: {integrity: sha512-IEIl+UQnrEjZP53TSl91e8LBephi4i1Mt9WZrMgN8pOg6xPOLZdkN1GhsEzjkMD1TQy4Fp2dwWA/9ToTQFOlLA==} + '@aws-sdk/credential-provider-login@3.972.42': + resolution: {integrity: sha512-O6WkZga3kf0yqyJYd1dbeJqVhEgJx/x1UaLgtbR+XuL/YP+K5y6QTxQKL7ka9z3jnQASESKGAPnRyt4D5hQrxA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.41': - resolution: {integrity: sha512-h6BlclpsPGkx7Pv7ukr8oKVqN3jvxnH5n9ZIUQa8focr1ZkKd2MYiPJ2Nv9GI97dohJVJBfZAsTp/qoZL5R1pw==} + '@aws-sdk/credential-provider-node@3.972.43': + resolution: {integrity: sha512-D/DJmbrWRP5BXEO3FH+ar4el+2n6OlGofiud7dQun2jES+AQEJjczenp1jBb4MBN7CpGpS8nsWGQLtuzc9tQbA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.36': - resolution: {integrity: sha512-eDQ6X7clTAOxXegOx4rGT1hyfusGEYdJGCGo0Ym2+CKeMQBjk+SJSxSVev11NJew5xJHJ/c3hryl2awKaxuSEA==} + '@aws-sdk/credential-provider-process@3.972.38': + resolution: {integrity: sha512-EnbYVajGgbkb24s0K1eo4VNAPV5mHIET7LSvirTaFCwkfrfaOJxtSE+wY/tJdKDS21cEYkZs2ruCaAm+W4iblg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.40': - resolution: {integrity: sha512-jaABbsoOkGlKg5kaHetYmUV6mWM57H89ia0Yksom1XxC847mfjmEVb4p7VijS1sjPbXjUii4cftJuwsl4MXkRg==} + '@aws-sdk/credential-provider-sso@3.972.42': + resolution: {integrity: sha512-RVV/9NbFwI8ZHEH5dn39lGyFmSbSVj1+orZdr6QsOe1mW9DCglmlen0cFaNZmCcqkqc7erNRHNBduxbeZuHAnw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.40': - resolution: {integrity: sha512-bfIrM8IIzbRtXRQWx/vNEUBLTImLZyX5uKk8uSdeSAZ4Mj3Yi4UnRJLK4FkQLWErbM3McpVLQ1DaM6XO66Ed5g==} + '@aws-sdk/credential-provider-web-identity@3.972.42': + resolution: {integrity: sha512-/67fXX0ddllD4u2Nujc5PvT4byHgpMUfz6+RxIKi/0nFIckeorm7JvXgzBuDyVKw0s58EbofmETDWUf9vTEuHQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.12': - resolution: {integrity: sha512-MAG0Adg7FFEwuoeLbb5SBnXDW7S2EpNTwHnQ4h3pJqSKVQOhOmugyA1MfMh6AD4SAfx0lko4htZdwkNoLqFj5A==} + '@aws-sdk/middleware-bucket-endpoint@3.972.14': + resolution: {integrity: sha512-Aaj0d+xbo1jJquBWJP0/9V/XZRYukO3LWIRp3dOLHmoFrYKb4YZ0aLefgVHfGcNOVBS2ZTq7L/n5JcrE7DaC+Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.11': - resolution: {integrity: sha512-xpobcctR1AHSrvkiArgTyLffn78Lt9unPMpa/yic9RKn+bOf/5M55UIM6RaPL5xKzI06/GSsTDywTWvzEAbyyw==} + '@aws-sdk/middleware-expect-continue@3.972.12': + resolution: {integrity: sha512-dA5pKTom/Ls9mgeyeaRBNQrRIVOLVjv4AmKOB0/e4yaiXEUy0gSz2d3liP8JHtYoCAEWySU1jWnyzwLOREN+4g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.974.18': - resolution: {integrity: sha512-2noO+4ARfC+8vOIyvJvQE6bioVaTRkUcPvUoM/jgwXcweZnZovSZ6OCs/cs+NU2p7yvuwuJT/7LkTzBSj5pU4A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-host-header@3.972.11': - resolution: {integrity: sha512-CBC6+tVYaOJo7QXgN1zJ4Ba2f3/Cpy4eRViYFimXW/O5Mn8hBmgXXzHu4vy4ubT80YWnp8aCFygr7dTOa14yQg==} + '@aws-sdk/middleware-flexible-checksums@3.974.20': + resolution: {integrity: sha512-NdnMVQCR1YjIcqFAiNLdBiOwr2DyQDB2IiXQrBhzolKOv32ae4d4Ll7IzLMi04eMHiq/o/Y/GjFuVjF9HuG0QA==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-location-constraint@3.972.10': resolution: {integrity: sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.10': - resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.972.12': - resolution: {integrity: sha512-5eltYxKB4MfdQv7/VhWxRbAVQKow5dz9votRFigTYrWJHMQXwLMltlbk7KFWSZh5NDBySfmjT7Jv/DWfYCmDng==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.972.39': - resolution: {integrity: sha512-cimoQxecHHNad+lv2g7QJ24Cxqh1P0EULJSxyX4YD95BUIGeGRPumbdEXpHPxNkJRU99DVmh7u16Y+uhFu31Yw==} + '@aws-sdk/middleware-sdk-s3@3.972.41': + resolution: {integrity: sha512-M4T2I2WPuH5WQpU8Tsp+u2bcO29zGRkU14ATzuqb9I4xh8tzsLqtp4hzaJM5aO2dhMZnHDzyQwSFVgc3XbnoGg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.10': resolution: {integrity: sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.40': - resolution: {integrity: sha512-QLpD+HNQtL1Mc49/GRa6RmZvi/TEYBWPevC9F3L+j96IoG3xOSRctdQfbkX0lETb3TX9QQXU1oGYDmAB+YJprA==} + '@aws-sdk/nested-clients@3.997.10': + resolution: {integrity: sha512-FtQ/Bt327peZJuyo4WZSOLVUTw9ujRxntepiC7L65FxA2P82Xlq0g14T22BuqBUeMjDoxa9nvwiMHjLIfP3eUg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.8': - resolution: {integrity: sha512-/Vw2M27w+0APfMDzDpvv8auA4WiJ4D22+lC61pMS2M8Wk+4IydeRqh5utbrh+A5gQRxgUYd/xz3tdv8nQlmiHg==} + '@aws-sdk/signature-v4-multi-region@3.996.27': + resolution: {integrity: sha512-0Phbz4t6HI3D3skxvG2uI+VWU034/nSIw1T8d+FPzzQG9EQTrw94o9mOKO2Gv3n3Oc8P7JD7RAUxkoneLWv5Eg==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.14': - resolution: {integrity: sha512-VuLXVmm7+lKVxqFcOItPkXhjbJ02iUfxkxheRu41SfWf6/xrZup2A2SwHZos/LeQGu3SBHeqTQht80Uo3ienPA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.996.26': - resolution: {integrity: sha512-2N62veqdMZBCwQUHsbhtnaovOFjOa5Dn3dAD1nRqFTUXR4QmirT3HZnfus/L1DS08Vm5CkoKmL0iMVt6YbqEag==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.1047.0': - resolution: {integrity: sha512-GwJUeMijpeO2SOGGLRg4q2Nj9foBUBd7hTALYVId+m8fQmA4P2hITp5dmrZFd4AjEkSVmt2eFqmk3TttF7HZeQ==} + '@aws-sdk/token-providers@3.1049.0': + resolution: {integrity: sha512-r7+d0lQMTHKypkmaF5jRTBYLYHCUHzt3gaVoN9SidLhQeWhCmHk3AKrboDTpPF5b7Pt7vKu3+oeMjznM2Eu1ow==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.8': resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.9': - resolution: {integrity: sha512-ibx8Vd73rCTHekNGeXX8cpGWoBKbNAlwKHL3yjSxxttu5QnNDaSAM7/0MFYDjU31/F4lyrPoQcGirT0ew61xcg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.5': resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.11': - resolution: {integrity: sha512-kq3RS6XQtHMrLFShbkem6h+8fxazB3jEIsbMC6aaSInOciRGE+eGAqTgJ+obO7Euo/pjM8thVqLiLISEH9X9DA==} - - '@aws-sdk/util-user-agent-node@3.973.26': - resolution: {integrity: sha512-9bHR/EERjhrUGyo1qW620ogbGBtCglYB/pEtcm85sVd4/Ah+bwdLI3g1aJf75oNwNwh7+fw+8wOk/OCWHjzVmA==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - '@aws-sdk/xml-builder@3.972.24': resolution: {integrity: sha512-V8z5YcDPfsvzrBlj0xR1vhRtocblhYbqdreCJB/voGd4Sr5zjNAeWxexbnqVtskTJe0vFb5KMqbSL++ePl+zRw==} engines: {node: '>=20.0.0'} @@ -1796,8 +1760,11 @@ packages: resolution: {integrity: sha512-TuB0x50EoAvEX/UEWITd8Mkn3WhiTjSvbTMCLj0BhsQEl5iUzjXdA0bETEVpTk+5TGTLR6QktI9H4hLviVeaAQ==} engines: {node: '>=v12.0.0'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodable/entities@2.1.0': resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} @@ -1818,20 +1785,20 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@oclif/core@4.11.2': - resolution: {integrity: sha512-LWDalCgy+hYyAkLa9sMIXMXk6ws5RzQhVnkmfXtVIIyEEYigbXQ/9/x+s76p53MiXxNc6SJB7lfwkPF+SdzfMQ==} + '@oclif/core@4.11.3': + resolution: {integrity: sha512-gQCSYAtUhJilGKaSaZhqejH9X1dDu+jWQjLmtGOgN/XcKaAEPPSeT2mu1UvlvtPox1/NNRdlBcUa8KRKo2HnJQ==} engines: {node: '>=18.0.0'} - '@oclif/plugin-help@6.2.48': - resolution: {integrity: sha512-nvGLBtUZUWrHfoAEDRsRZUHKVwptyZ6F+MErdVRLQBo3dja0GCZH8DE33dA7mBux2KOmbxGqop15gyud9HZYhQ==} + '@oclif/plugin-help@6.2.49': + resolution: {integrity: sha512-fEsO0YU7ThtzHE1RGuoHxFu/OGlqxm7PCfFp+U1PS8sde4E0cDqjVDuv78+VKrr45LpC5lWOApj7pm3FNfHrVA==} engines: {node: '>=18.0.0'} - '@oclif/plugin-not-found@3.2.85': - resolution: {integrity: sha512-Si18rRKWknlvQ5anmFbQz9oKBae5/l/Npreuf05xdoNWfOV1J97Z7cpzqBlHbldmxCIiDRgmDKuCBBi4XN6ACA==} + '@oclif/plugin-not-found@3.2.86': + resolution: {integrity: sha512-BJhJSahwsYayZpo18f0fPTg8tKb9dIvydaz03NCK3eMfmcsT1MmXhXqh1KEV8J7mz0sQ6f0qFEb6BXy490/iUg==} engines: {node: '>=18.0.0'} - '@oclif/plugin-warn-if-update-available@3.1.64': - resolution: {integrity: sha512-+BauVC7jeMRs6NPvFFO1KHdSIVL10ruz6W3laKdN0i7PjSo14clmQe+DUJVTADI5Z3eYFYnsISwdDbOU/2pnYQ==} + '@oclif/plugin-warn-if-update-available@3.1.65': + resolution: {integrity: sha512-HcSJc8SeCVUBHwc063xDL0LcpdjcamAISlisSX14VDDYQayMantvtVNOo9PmciwYpXRXfAykeH1z066YkA9JvQ==} engines: {node: '>=18.0.0'} '@oclif/test@4.1.18': @@ -1920,32 +1887,32 @@ packages: Deprecated: no longer maintained and no longer used by Sinon packages. See https://github.com/sinonjs/nise/issues/243 for replacement details. - '@smithy/core@3.24.2': - resolution: {integrity: sha512-IKS7qX59fAGCYBmt5JChcDswQDupZqT2Yn2ZBA3UgTlsjRNNkQzZobbn95xoAAdtTyJmBiJB3Y02qR3rgy3Zog==} + '@smithy/core@3.24.3': + resolution: {integrity: sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.3.2': - resolution: {integrity: sha512-iYr9ekBjmZ+FwkiHEopqGscBbl78X62cq3p5Dd0eC+gNd7fybNZFQQdDuOQjTVmFymleuA8YRWZnuXWZ8B3kKA==} + '@smithy/credential-provider-imds@4.3.3': + resolution: {integrity: sha512-I2Bti0DKFo2IJyN28ijCsx51BAumEYR4/1yZ1FXyBygy9MqbnMqCev4JPth/MbpRfBSRAX35hITSnAdJRo1u5w==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.4.2': - resolution: {integrity: sha512-3wF40g8OOCA5BnwQUvwtzZqYBbWWftDjpAlWIUo6Yld3ZzJaMAKqg7MWQBPjE8oLaqvZQUE7tVGlZPsae6A4bQ==} + '@smithy/fetch-http-handler@5.4.3': + resolution: {integrity: sha512-F+DRf8IJazRJgYog2A/yJK7eYVc0rqTlRzO+5ZxjJd4WkZoKz0IJRncf7G6t1pdVT3kryJcwuTFhN1c5m6N47A==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@4.7.2': - resolution: {integrity: sha512-EdksTZ8UXYxGUgQ4mpIKrHoaj9WVGsp66TpZuixLAz1Jex8YDLnS4RH9ktGED5aOpN0OJlEtrsC9IGt76go1eA==} + '@smithy/node-http-handler@4.7.3': + resolution: {integrity: sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.4.2': - resolution: {integrity: sha512-1km1OjdLRFuITWpCPofjFqzZ+tbeWuB72ZhcYjbjkCxZ21tTPfIs4GUxRrelMyKMLxLghGD58RENnXorU/O8cw==} + '@smithy/signature-v4@5.4.3': + resolution: {integrity: sha512-53+75QuPl6DL+ct6vVEB51FDO5oulXr20TPV46VvJZg76lIlXNWfxi8j+G2V/t0I2qxCBOa3vX/8bmjrpFVo9g==} engines: {node: '>=18.0.0'} - '@smithy/types@4.14.1': - resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} + '@smithy/types@4.14.2': + resolution: {integrity: sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': @@ -2156,11 +2123,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.59.3': - resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} + '@typescript-eslint/eslint-plugin@8.59.4': + resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.3 + '@typescript-eslint/parser': ^8.59.4 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' @@ -2174,15 +2141,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.59.3': - resolution: {integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==} + '@typescript-eslint/parser@8.59.4': + resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} 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.3': - resolution: {integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==} + '@typescript-eslint/project-service@8.59.4': + resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2199,12 +2166,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.59.3': - resolution: {integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==} + '@typescript-eslint/scope-manager@8.59.4': + resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.3': - resolution: {integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==} + '@typescript-eslint/tsconfig-utils@8.59.4': + resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2229,8 +2196,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.59.3': - resolution: {integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==} + '@typescript-eslint/type-utils@8.59.4': + resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2248,8 +2215,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.59.3': - resolution: {integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==} + '@typescript-eslint/types@8.59.4': + resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -2279,8 +2246,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.59.3': - resolution: {integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==} + '@typescript-eslint/typescript-estree@8.59.4': + resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2303,8 +2270,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.59.3': - resolution: {integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==} + '@typescript-eslint/utils@8.59.4': + resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2322,105 +2289,110 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.59.3': - resolution: {integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==} + '@typescript-eslint/visitor-keys@8.59.4': + resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@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==} + '@unrs/resolver-binding-android-arm-eabi@1.12.1': + resolution: {integrity: sha512-diBxYrhKMJWZiQMFDgKVRDV4zSRyRTR6PBg+0p6/7zAWP6fqUfl0Be0RKvjLhzfRT0Ye5TCAP04gg4rZHSTvnA==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + '@unrs/resolver-binding-android-arm64@1.12.1': + resolution: {integrity: sha512-7VQXkWRrq3zFmL1byHilfy8YjCGxf9dKMYbLIGzR6ujAu4+FB3YD8IkesmpgB9vpiitYjMPs/Dk5Sh/P9aoHLQ==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + '@unrs/resolver-binding-darwin-arm64@1.12.1': + resolution: {integrity: sha512-SJbHelGnb7hZVLCEWSkbTOpmTC63ZUweZEIPNtRD1D+UkDqYHFynwGUTG1WAjQTdTTaiJ4xab3z5Vk334WeqbA==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + '@unrs/resolver-binding-darwin-x64@1.12.1': + resolution: {integrity: sha512-sCCTeB7e2L49YhjPK7IkPfWfCR+NHSfbCbDOy3LqyfkrBpK9qXRRyS1ImCHqEE1LMJxmVN5bAvioI/zTFu48xw==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + '@unrs/resolver-binding-freebsd-x64@1.12.1': + resolution: {integrity: sha512-rsKJJykPydB+lA/mdeMSYqsQpdRTAjhJiwdQ+jdihPDpbN1h7PaNAo6Fz8PxqWtKd+YC3uGjjW+m+1iPwRwJuA==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.1': + resolution: {integrity: sha512-D6Al5C6j9RdqjGI7Hqa/iVbh09xOEIyZScG60OJGRF0fvf9cy2FdSHG6qLG9Osv8aYe+syWId+PLRwR43soVkA==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.1': + resolution: {integrity: sha512-9+yQ/cnoapQ1G+HS6nXQ+4GZ/qKpieZuZxO8GWGJ+F2/1WC5eRzIU2BYUgT029A/y7n3qb0whuT6vvMzB9Zd0g==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.12.1': + resolution: {integrity: sha512-OY/REy8lJgrkZgUpiwhClBvSDLSJNxkvqV7il6I1iNBQFyIEZRpOm1ttV8iMjpcPN2Dl7kjGd7CoKoJUebn6Jw==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + '@unrs/resolver-binding-linux-arm64-musl@1.12.1': + resolution: {integrity: sha512-C0nRwuMNgiGU8M5ym7eFe1qOo4oJtZ4TH6g+qAMWIR0hXgMjMs0bsggIv7Sbeia1GI8ZQHzQwrhBEawFiHQIPQ==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.1': + resolution: {integrity: sha512-1GrdTqRuLZMsLa9d6T1BM6WTPGMZxkDKLR4SSzWaUtWpBuOVb33DIShXadhDYrTRESEm7pRN8m7SOM2m8pPT8w==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.1': + resolution: {integrity: sha512-q9gc8/37+8jGc8RJahXtonvxgbUisjOHCaiDXrg4Nv8+pk9iKv97drJ61crkZJEms+bIr7lLc54SlZ08qVY9nA==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + '@unrs/resolver-binding-linux-riscv64-musl@1.12.1': + resolution: {integrity: sha512-kLFS/MfGFpeYUrnnsUnmZAxwXMPHZOIPHNp3d4zHnx7/etyX2SSQQ1Kj/Ycaxy4V5dN16YoXpnhrwANjywiJCg==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + '@unrs/resolver-binding-linux-s390x-gnu@1.12.1': + resolution: {integrity: sha512-vKlW4XOJUrpvMBgbIg97t6UEBsFsxGZS5Khi47XkNzC5T1obPhEYWfaGGv9oAe6xXzXib9xaH64CQV8AXN9GiA==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + '@unrs/resolver-binding-linux-x64-gnu@1.12.1': + resolution: {integrity: sha512-e9gRaBDEraJLdeScpwBA+WqaJDXnmlHPC7aZTAp9N4BYiEs8BvDfjgeqSVygrc3NZbeMfiKygevINZ9QP271wA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + '@unrs/resolver-binding-linux-x64-musl@1.12.1': + resolution: {integrity: sha512-Z7813xEacoT+WRBm1O0wgIkXRgVyTctaRPkKx7T+WgeAfGzMfgWCxhRjAAJh/2LMDPlSXOnapr3vwI1TgDEtTA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + '@unrs/resolver-binding-openharmony-arm64@1.12.1': + resolution: {integrity: sha512-GN5YjvnL5nGd5twW4KHWre6iOzLVsIgZwBin3jTT1Pef2Q3l0WgMYA5uo908wL+gsxSFzFXuxkO+AjpsLoOaYw==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.1': + resolution: {integrity: sha512-Gue4obXW5E2223qBWqW05S9m1uPcBIEu8cJWs3YqzVVf+h6lNRofgJlhGNxmuqu+C/fSlqaW4T1JHFZdoOgGGQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + '@unrs/resolver-binding-win32-arm64-msvc@1.12.1': + resolution: {integrity: sha512-z09l7yiDIOLDTFkW+TEroFjidYAM6JriPqMMpXpM7/EnEe6tehrJZrghlvvPyI/W4JGWAJVDaOs4rl+snJlHwg==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + '@unrs/resolver-binding-win32-ia32-msvc@1.12.1': + resolution: {integrity: sha512-RZ9vu5nw+Lgf91LJIZXFx6OrbId+EN2x0HzpAdm0C9oywiPw5x7LBs4uNboZ2Taozo8SiX/7vEDWWyIpKqktgA==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + '@unrs/resolver-binding-win32-x64-msvc@1.12.1': + resolution: {integrity: sha512-rXHMTryD4YT8wuGDhV8UevKiD02/wUrdKLyokgNQQf/AcO6BCUEkQu5WGQ9i41bA4tlSfKo02WmAcAgxuP6izA==} cpu: [x64] os: [win32] @@ -2677,8 +2649,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.29: - resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} + baseline-browser-mapping@2.10.31: + resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -2789,8 +2761,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001792: - resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -3240,8 +3212,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.356: - resolution: {integrity: sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==} + electron-to-chromium@1.5.357: + resolution: {integrity: sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==} elegant-spinner@1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} @@ -3260,8 +3232,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.21.3: - resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==} + enhanced-resolve@5.21.4: + resolution: {integrity: sha512-wE4fDO8OjJhrPFH69HUQStq5oKvGRTNXEyW+k5C/pUQLASSsTu7obd2V3GvCDgPcY9AWjhJ4jz9Kh7iRvrxhJg==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -3340,8 +3312,8 @@ packages: resolution: {integrity: sha512-NNTyyolSmKJicgxtoWZ/hoy2Rw56WIoWCFxgnBkXqDgi9qPKMwZs2Nx2b6SHLJvCiWWhZhWr5V46CFPo3PSPag==} engines: {node: '>=18.0.0'} - eslint-config-oclif@6.0.164: - resolution: {integrity: sha512-LEJRa/q7FAIH8zeZJ16E3RghSU/kZEa6oBV8kxTSE57djsgSNcwf92NbhcPj6RaQ/eANIva8nWJ9h+FeeWUlew==} + eslint-config-oclif@6.0.165: + resolution: {integrity: sha512-kbzxHAXEHKTY2X4UVVu4cPjjxP2YsVEsgYaXJDakpBEoAUEUSnYCKOOoxrIHl1egDM3q07kOZnBPkwYQ+nR4Og==} engines: {node: '>=18.18.0'} eslint-config-xo-space@0.35.0: @@ -4710,8 +4682,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.6: - resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + lru-cache@11.4.0: + resolution: {integrity: sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -4998,8 +4970,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - oclif@4.23.2: - resolution: {integrity: sha512-fImWEPdjTSf4RGI7tjfkuyd35L6cAARldw1UBrI25jC4f3AhKxWO/RwbHxI8rMmd44cZQ6UaGgsH/pU97j1stg==} + oclif@4.23.7: + resolution: {integrity: sha512-rog7/P6l6PXe7O3zWMcKB4prQm35z6NyDfpED6B3UwnPr1Fy+KWdcBHSr6Er3AjmvYsP5wsJwwPEsxUfvMNsyg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5252,8 +5224,8 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -5417,8 +5389,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} hasBin: true @@ -6030,8 +6002,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.59.3: - resolution: {integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==} + typescript-eslint@8.59.4: + resolution: {integrity: sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6091,8 +6063,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + unrs-resolver@1.12.1: + resolution: {integrity: sha512-LmOTmcBbFqxu1rzubnqHT6EZeqDYpenlGYwyFhHj7oc1HdyZE+0cLQ+s9SDSK+KKQQKuoJhUbzHQ89Ubwg2Oxg==} update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} @@ -6350,331 +6322,232 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cloudfront@3.1047.0': + '@aws-sdk/client-cloudfront@3.1049.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.10 - '@aws-sdk/credential-provider-node': 3.972.41 - '@aws-sdk/middleware-host-header': 3.972.11 - '@aws-sdk/middleware-logger': 3.972.10 - '@aws-sdk/middleware-recursion-detection': 3.972.12 - '@aws-sdk/middleware-user-agent': 3.972.40 - '@aws-sdk/region-config-resolver': 3.972.14 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/credential-provider-node': 3.972.43 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.9 - '@aws-sdk/util-user-agent-browser': 3.972.11 - '@aws-sdk/util-user-agent-node': 3.973.26 - '@smithy/core': 3.24.2 - '@smithy/fetch-http-handler': 5.4.2 - '@smithy/node-http-handler': 4.7.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/fetch-http-handler': 5.4.3 + '@smithy/node-http-handler': 4.7.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-s3@3.1047.0': + '@aws-sdk/client-s3@3.1049.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.10 - '@aws-sdk/credential-provider-node': 3.972.41 - '@aws-sdk/middleware-bucket-endpoint': 3.972.12 - '@aws-sdk/middleware-expect-continue': 3.972.11 - '@aws-sdk/middleware-flexible-checksums': 3.974.18 - '@aws-sdk/middleware-host-header': 3.972.11 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/credential-provider-node': 3.972.43 + '@aws-sdk/middleware-bucket-endpoint': 3.972.14 + '@aws-sdk/middleware-expect-continue': 3.972.12 + '@aws-sdk/middleware-flexible-checksums': 3.974.20 '@aws-sdk/middleware-location-constraint': 3.972.10 - '@aws-sdk/middleware-logger': 3.972.10 - '@aws-sdk/middleware-recursion-detection': 3.972.12 - '@aws-sdk/middleware-sdk-s3': 3.972.39 + '@aws-sdk/middleware-sdk-s3': 3.972.41 '@aws-sdk/middleware-ssec': 3.972.10 - '@aws-sdk/middleware-user-agent': 3.972.40 - '@aws-sdk/region-config-resolver': 3.972.14 - '@aws-sdk/signature-v4-multi-region': 3.996.26 + '@aws-sdk/signature-v4-multi-region': 3.996.27 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.9 - '@aws-sdk/util-user-agent-browser': 3.972.11 - '@aws-sdk/util-user-agent-node': 3.973.26 - '@smithy/core': 3.24.2 - '@smithy/fetch-http-handler': 5.4.2 - '@smithy/node-http-handler': 4.7.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/fetch-http-handler': 5.4.3 + '@smithy/node-http-handler': 4.7.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/core@3.974.10': + '@aws-sdk/core@3.974.12': dependencies: '@aws-sdk/types': 3.973.8 '@aws-sdk/xml-builder': 3.972.24 - '@smithy/core': 3.24.2 - '@smithy/signature-v4': 5.4.2 - '@smithy/types': 4.14.1 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/core': 3.24.3 + '@smithy/signature-v4': 5.4.3 + '@smithy/types': 4.14.2 + bowser: 2.14.1 tslib: 2.8.1 '@aws-sdk/crc64-nvme@3.972.8': dependencies: - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.36': + '@aws-sdk/credential-provider-env@3.972.38': dependencies: - '@aws-sdk/core': 3.974.10 + '@aws-sdk/core': 3.974.12 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.38': + '@aws-sdk/credential-provider-http@3.972.40': dependencies: - '@aws-sdk/core': 3.974.10 + '@aws-sdk/core': 3.974.12 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/fetch-http-handler': 5.4.2 - '@smithy/node-http-handler': 4.7.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/fetch-http-handler': 5.4.3 + '@smithy/node-http-handler': 4.7.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.40': + '@aws-sdk/credential-provider-ini@3.972.42': dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/credential-provider-env': 3.972.36 - '@aws-sdk/credential-provider-http': 3.972.38 - '@aws-sdk/credential-provider-login': 3.972.40 - '@aws-sdk/credential-provider-process': 3.972.36 - '@aws-sdk/credential-provider-sso': 3.972.40 - '@aws-sdk/credential-provider-web-identity': 3.972.40 - '@aws-sdk/nested-clients': 3.997.8 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/credential-provider-env': 3.972.38 + '@aws-sdk/credential-provider-http': 3.972.40 + '@aws-sdk/credential-provider-login': 3.972.42 + '@aws-sdk/credential-provider-process': 3.972.38 + '@aws-sdk/credential-provider-sso': 3.972.42 + '@aws-sdk/credential-provider-web-identity': 3.972.42 + '@aws-sdk/nested-clients': 3.997.10 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/credential-provider-imds': 4.3.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/credential-provider-imds': 4.3.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-login@3.972.40': + '@aws-sdk/credential-provider-login@3.972.42': dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/nested-clients': 3.997.8 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/nested-clients': 3.997.10 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-node@3.972.41': + '@aws-sdk/credential-provider-node@3.972.43': dependencies: - '@aws-sdk/credential-provider-env': 3.972.36 - '@aws-sdk/credential-provider-http': 3.972.38 - '@aws-sdk/credential-provider-ini': 3.972.40 - '@aws-sdk/credential-provider-process': 3.972.36 - '@aws-sdk/credential-provider-sso': 3.972.40 - '@aws-sdk/credential-provider-web-identity': 3.972.40 + '@aws-sdk/credential-provider-env': 3.972.38 + '@aws-sdk/credential-provider-http': 3.972.40 + '@aws-sdk/credential-provider-ini': 3.972.42 + '@aws-sdk/credential-provider-process': 3.972.38 + '@aws-sdk/credential-provider-sso': 3.972.42 + '@aws-sdk/credential-provider-web-identity': 3.972.42 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/credential-provider-imds': 4.3.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/credential-provider-imds': 4.3.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-process@3.972.36': + '@aws-sdk/credential-provider-process@3.972.38': dependencies: - '@aws-sdk/core': 3.974.10 + '@aws-sdk/core': 3.974.12 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.40': + '@aws-sdk/credential-provider-sso@3.972.42': dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/nested-clients': 3.997.8 - '@aws-sdk/token-providers': 3.1047.0 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/nested-clients': 3.997.10 + '@aws-sdk/token-providers': 3.1049.0 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.40': + '@aws-sdk/credential-provider-web-identity@3.972.42': dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/nested-clients': 3.997.8 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/nested-clients': 3.997.10 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.972.12': + '@aws-sdk/middleware-bucket-endpoint@3.972.14': dependencies: - '@aws-sdk/core': 3.974.10 + '@aws-sdk/core': 3.974.12 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.11': + '@aws-sdk/middleware-expect-continue@3.972.12': dependencies: '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.974.18': + '@aws-sdk/middleware-flexible-checksums@3.974.20': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.974.10 + '@aws-sdk/core': 3.974.12 '@aws-sdk/crc64-nvme': 3.972.8 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.972.11': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-location-constraint@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.972.12': - dependencies: - '@aws-sdk/types': 3.973.8 - '@aws/lambda-invoke-store': 0.2.4 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.39': + '@aws-sdk/middleware-sdk-s3@3.972.41': dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/signature-v4-multi-region': 3.996.26 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/signature-v4-multi-region': 3.996.27 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/signature-v4': 5.4.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/signature-v4': 5.4.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/middleware-ssec@3.972.10': dependencies: '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.40': - dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.9 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.997.8': + '@aws-sdk/nested-clients@3.997.10': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.10 - '@aws-sdk/middleware-host-header': 3.972.11 - '@aws-sdk/middleware-logger': 3.972.10 - '@aws-sdk/middleware-recursion-detection': 3.972.12 - '@aws-sdk/middleware-user-agent': 3.972.40 - '@aws-sdk/region-config-resolver': 3.972.14 - '@aws-sdk/signature-v4-multi-region': 3.996.26 + '@aws-sdk/core': 3.974.12 + '@aws-sdk/signature-v4-multi-region': 3.996.27 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.9 - '@aws-sdk/util-user-agent-browser': 3.972.11 - '@aws-sdk/util-user-agent-node': 3.973.26 - '@smithy/core': 3.24.2 - '@smithy/fetch-http-handler': 5.4.2 - '@smithy/node-http-handler': 4.7.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/fetch-http-handler': 5.4.3 + '@smithy/node-http-handler': 4.7.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/region-config-resolver@3.972.14': + '@aws-sdk/signature-v4-multi-region@3.996.27': dependencies: '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/signature-v4': 5.4.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.26': + '@aws-sdk/token-providers@3.1049.0': dependencies: + '@aws-sdk/core': 3.974.12 + '@aws-sdk/nested-clients': 3.997.10 '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/signature-v4': 5.4.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1047.0': - dependencies: - '@aws-sdk/core': 3.974.10 - '@aws-sdk/nested-clients': 3.997.8 - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.973.8': dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.996.9': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.11': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.26': - dependencies: - '@aws-sdk/middleware-user-agent': 3.972.40 - '@aws-sdk/types': 3.973.8 - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.24': dependencies: '@nodable/entities': 2.1.0 - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 fast-xml-parser: 5.7.3 tslib: 2.8.1 @@ -6877,7 +6750,7 @@ snapshots: dependencies: '@contentstack/cli-command': 2.0.0-beta.7(@types/node@22.19.19) '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@22.19.19) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 otplib: 12.0.1 transitivePeerDependencies: - '@types/node' @@ -6886,7 +6759,7 @@ snapshots: '@contentstack/cli-command@2.0.0-beta.7(@types/node@14.18.63)': dependencies: '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@14.18.63) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -6895,7 +6768,7 @@ snapshots: '@contentstack/cli-command@2.0.0-beta.7(@types/node@14.18.63)(debug@4.4.3)': dependencies: '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@14.18.63)(debug@4.4.3) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -6904,7 +6777,7 @@ snapshots: '@contentstack/cli-command@2.0.0-beta.7(@types/node@18.19.130)': dependencies: '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@18.19.130) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -6913,7 +6786,7 @@ snapshots: '@contentstack/cli-command@2.0.0-beta.7(@types/node@20.19.41)': dependencies: '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@20.19.41) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -6922,7 +6795,7 @@ snapshots: '@contentstack/cli-command@2.0.0-beta.7(@types/node@22.19.19)': dependencies: '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@22.19.19) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 contentstack: 3.27.0 transitivePeerDependencies: - '@types/node' @@ -6933,7 +6806,7 @@ snapshots: '@contentstack/cli-command': 2.0.0-beta.7(@types/node@18.19.130) '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@18.19.130) '@contentstack/utils': 1.9.1 - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 transitivePeerDependencies: - '@types/node' - debug @@ -6943,15 +6816,15 @@ snapshots: '@contentstack/cli-command': 2.0.0-beta.7(@types/node@22.19.19) '@contentstack/cli-utilities': 2.0.0-beta.8(@types/node@22.19.19) '@contentstack/utils': 1.9.1 - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 transitivePeerDependencies: - '@types/node' - debug '@contentstack/cli-dev-dependencies@1.3.1': dependencies: - '@oclif/core': 4.11.2 - '@oclif/test': 4.1.18(@oclif/core@4.11.2) + '@oclif/core': 4.11.3 + '@oclif/test': 4.1.18(@oclif/core@4.11.3) fancy-test: 2.0.42 lodash: 4.18.1 transitivePeerDependencies: @@ -6959,8 +6832,8 @@ snapshots: '@contentstack/cli-dev-dependencies@2.0.0-beta.0': dependencies: - '@oclif/core': 4.11.2 - '@oclif/test': 4.1.18(@oclif/core@4.11.2) + '@oclif/core': 4.11.3 + '@oclif/test': 4.1.18(@oclif/core@4.11.3) fancy-test: 2.0.42 lodash: 4.18.1 transitivePeerDependencies: @@ -6970,7 +6843,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.2 + '@oclif/core': 4.11.3 axios: 1.15.2(debug@4.4.3) chalk: 5.6.2 cli-cursor: 3.1.0 @@ -7006,7 +6879,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.2 + '@oclif/core': 4.11.3 axios: 1.15.2(debug@4.4.3) chalk: 5.6.2 cli-cursor: 3.1.0 @@ -7042,7 +6915,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.2 + '@oclif/core': 4.11.3 axios: 1.15.2(debug@4.4.3) chalk: 5.6.2 cli-cursor: 3.1.0 @@ -7078,7 +6951,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.2 + '@oclif/core': 4.11.3 axios: 1.15.2(debug@4.4.3) chalk: 5.6.2 cli-cursor: 3.1.0 @@ -7114,7 +6987,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.2 + '@oclif/core': 4.11.3 axios: 1.15.2(debug@4.4.3) chalk: 5.6.2 cli-cursor: 3.1.0 @@ -7156,7 +7029,7 @@ snapshots: husky: 9.1.7 lodash: 4.18.1 otplib: 12.0.1 - qs: 6.15.1 + qs: 6.15.2 stream-browserify: 3.0.0 transitivePeerDependencies: - debug @@ -7199,7 +7072,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/types': 8.59.4 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -8102,7 +7975,7 @@ snapshots: dependencies: lodash: 4.18.1 - '@napi-rs/wasm-runtime@0.2.12': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 @@ -8125,7 +7998,7 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@oclif/core@4.11.2': + '@oclif/core@4.11.3': dependencies: ansi-escapes: 4.3.2 ansis: 3.17.0 @@ -8146,49 +8019,49 @@ snapshots: wordwrap: 1.0.0 wrap-ansi: 7.0.0 - '@oclif/plugin-help@6.2.48': + '@oclif/plugin-help@6.2.49': dependencies: - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 - '@oclif/plugin-not-found@3.2.85(@types/node@14.18.63)': + '@oclif/plugin-not-found@3.2.86(@types/node@14.18.63)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@14.18.63) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-not-found@3.2.85(@types/node@18.19.130)': + '@oclif/plugin-not-found@3.2.86(@types/node@18.19.130)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@18.19.130) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-not-found@3.2.85(@types/node@20.19.41)': + '@oclif/plugin-not-found@3.2.86(@types/node@20.19.41)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@20.19.41) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-not-found@3.2.85(@types/node@22.19.19)': + '@oclif/plugin-not-found@3.2.86(@types/node@22.19.19)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@22.19.19) - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: - '@types/node' - '@oclif/plugin-warn-if-update-available@3.1.64': + '@oclif/plugin-warn-if-update-available@3.1.65': dependencies: - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 debug: 4.4.3(supports-color@8.1.1) http-call: 5.3.0 @@ -8197,9 +8070,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@oclif/test@4.1.18(@oclif/core@4.11.2)': + '@oclif/test@4.1.18(@oclif/core@4.11.3)': dependencies: - '@oclif/core': 4.11.2 + '@oclif/core': 4.11.3 ansis: 3.17.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: @@ -8284,41 +8157,41 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@smithy/core@3.24.2': + '@smithy/core@3.24.3': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.1 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.3.2': + '@smithy/credential-provider-imds@4.3.3': dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.4.2': + '@smithy/fetch-http-handler@5.4.3': dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/node-http-handler@4.7.2': + '@smithy/node-http-handler@4.7.3': dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/signature-v4@5.4.2': + '@smithy/signature-v4@5.4.3': dependencies: - '@smithy/core': 3.24.2 - '@smithy/types': 4.14.1 + '@smithy/core': 3.24.3 + '@smithy/types': 4.14.2 tslib: 2.8.1 - '@smithy/types@4.14.1': + '@smithy/types@4.14.2': dependencies: tslib: 2.8.1 @@ -8339,7 +8212,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8351,7 +8224,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8363,7 +8236,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8375,7 +8248,7 @@ snapshots: '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8388,7 +8261,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.3 + '@typescript-eslint/types': 8.59.4 eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8398,7 +8271,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.3 + '@typescript-eslint/types': 8.59.4 eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -8578,10 +8451,10 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.59.3(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.4(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.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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) @@ -8597,10 +8470,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@8.59.4(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.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/utils': 5.62.0(eslint@9.39.4)(typescript@5.9.3) @@ -8636,14 +8509,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(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.3(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/type-utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/type-utils': 8.59.4(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.4 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -8652,14 +8525,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/type-utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/type-utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.4 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -8668,14 +8541,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(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.3(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/type-utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.4 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -8684,14 +8557,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(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.3(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/type-utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.4 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -8713,67 +8586,67 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.4 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.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.4 debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.59.4 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.3(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.59.4 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.3(typescript@4.9.5)': + '@typescript-eslint/project-service@8.59.4(typescript@4.9.5)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@4.9.5) - '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 debug: 4.4.3(supports-color@8.1.1) typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.3(typescript@5.9.3)': + '@typescript-eslint/project-service@8.59.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@5.9.3) - '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: @@ -8794,16 +8667,16 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.59.3': + '@typescript-eslint/scope-manager@8.59.4': dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/visitor-keys': 8.59.4 - '@typescript-eslint/tsconfig-utils@8.59.3(typescript@4.9.5)': + '@typescript-eslint/tsconfig-utils@8.59.4(typescript@4.9.5)': dependencies: typescript: 4.9.5 - '@typescript-eslint/tsconfig-utils@8.59.3(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.59.4(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -8843,11 +8716,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.3(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.59.4(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(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) @@ -8855,11 +8728,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.59.4(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -8867,11 +8740,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.3(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.59.4(eslint@9.39.4)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(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) @@ -8879,11 +8752,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.59.3(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.59.4(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(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) @@ -8897,7 +8770,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.59.3': {} + '@typescript-eslint/types@8.59.4': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: @@ -8957,12 +8830,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.3(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.59.4(typescript@4.9.5)': dependencies: - '@typescript-eslint/project-service': 8.59.3(typescript@4.9.5) - '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@4.9.5) - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/project-service': 8.59.4(typescript@4.9.5) + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/visitor-keys': 8.59.4 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.0 @@ -8972,12 +8845,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.59.3(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.59.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.3(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.3(typescript@5.9.3) - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/visitor-keys': 8.59.3 + '@typescript-eslint/project-service': 8.59.4(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/visitor-keys': 8.59.4 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.0 @@ -9042,45 +8915,45 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.59.3(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/utils@8.59.4(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.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) eslint: 8.57.1 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.3(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.59.4(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.3(eslint@9.39.4)(typescript@4.9.5)': + '@typescript-eslint/utils@8.59.4(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.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) eslint: 9.39.4 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.3(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.59.4(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.3 - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: @@ -9101,70 +8974,75 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.59.3': + '@typescript-eslint/visitor-keys@8.59.4': dependencies: - '@typescript-eslint/types': 8.59.3 + '@typescript-eslint/types': 8.59.4 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.1': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': + '@unrs/resolver-binding-android-arm-eabi@1.12.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.1': optional: true - '@unrs/resolver-binding-android-arm64@1.11.1': + '@unrs/resolver-binding-darwin-arm64@1.12.1': optional: true - '@unrs/resolver-binding-darwin-arm64@1.11.1': + '@unrs/resolver-binding-darwin-x64@1.12.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.11.1': + '@unrs/resolver-binding-freebsd-x64@1.12.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.11.1': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + '@unrs/resolver-binding-linux-arm64-gnu@1.12.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + '@unrs/resolver-binding-linux-arm64-musl@1.12.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-musl@1.12.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + '@unrs/resolver-binding-linux-s390x-gnu@1.12.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + '@unrs/resolver-binding-linux-x64-gnu@1.12.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + '@unrs/resolver-binding-linux-x64-musl@1.12.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': + '@unrs/resolver-binding-openharmony-arm64@1.12.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.11.1': + '@unrs/resolver-binding-wasm32-wasi@1.12.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + '@unrs/resolver-binding-win32-arm64-msvc@1.12.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + '@unrs/resolver-binding-win32-ia32-msvc@1.12.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + '@unrs/resolver-binding-win32-x64-msvc@1.12.1': optional: true JSONStream@1.3.5: @@ -9437,7 +9315,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.29: {} + baseline-browser-mapping@2.10.31: {} big-json@3.2.0: dependencies: @@ -9485,9 +9363,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.29 - caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.356 + baseline-browser-mapping: 2.10.31 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.357 node-releases: 2.0.44 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -9570,7 +9448,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001792: {} + caniuse-lite@1.0.30001793: {} capital-case@1.0.4: dependencies: @@ -10046,7 +9924,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.356: {} + electron-to-chromium@1.5.357: {} elegant-spinner@1.0.1: {} @@ -10060,7 +9938,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.21.3: + enhanced-resolve@5.21.4: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -10182,8 +10060,8 @@ snapshots: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) '@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)(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)(eslint@9.39.4))(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-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) @@ -10216,25 +10094,25 @@ snapshots: transitivePeerDependencies: - eslint - eslint-config-oclif@6.0.164(eslint@8.57.1)(typescript@4.9.5): + eslint-config-oclif@6.0.165(eslint@8.57.1)(typescript@4.9.5): dependencies: '@eslint/compat': 1.4.1(eslint@8.57.1) '@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.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(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.4(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.3(eslint@8.57.1)(typescript@4.9.5) + typescript-eslint: 8.59.4(eslint@8.57.1)(typescript@4.9.5) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10242,25 +10120,25 @@ snapshots: - supports-color - typescript - eslint-config-oclif@6.0.164(eslint@8.57.1)(typescript@5.9.3): + eslint-config-oclif@6.0.165(eslint@8.57.1)(typescript@5.9.3): dependencies: '@eslint/compat': 1.4.1(eslint@8.57.1) '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@stylistic/eslint-plugin': 3.1.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@5.9.3) 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(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.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@5.9.3) eslint-plugin-perfectionist: 4.15.1(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) - typescript-eslint: 8.59.3(eslint@8.57.1)(typescript@5.9.3) + typescript-eslint: 8.59.4(eslint@8.57.1)(typescript@5.9.3) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10268,25 +10146,25 @@ snapshots: - supports-color - typescript - eslint-config-oclif@6.0.164(eslint@9.39.4)(typescript@4.9.5): + eslint-config-oclif@6.0.165(eslint@9.39.4)(typescript@4.9.5): dependencies: '@eslint/compat': 1.4.1(eslint@9.39.4) '@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.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(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.4(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.3(eslint@9.39.4)(typescript@4.9.5) + typescript-eslint: 8.59.4(eslint@9.39.4)(typescript@4.9.5) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10294,25 +10172,25 @@ snapshots: - supports-color - typescript - eslint-config-oclif@6.0.164(eslint@9.39.4)(typescript@5.9.3): + eslint-config-oclif@6.0.165(eslint@9.39.4)(typescript@5.9.3): dependencies: '@eslint/compat': 1.4.1(eslint@9.39.4) '@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.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(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)(eslint@9.39.4) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(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.4(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.3(eslint@9.39.4)(typescript@5.9.3) + typescript-eslint: 8.59.4(eslint@9.39.4)(typescript@5.9.3) transitivePeerDependencies: - eslint - eslint-import-resolver-webpack @@ -10362,11 +10240,26 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.2 - resolve: 2.0.0-next.6 + resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): + 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): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.4 + get-tsconfig: 4.14.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.16 + unrs-resolver: 1.12.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) + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) @@ -10375,9 +10268,9 @@ snapshots: is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.16 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10390,9 +10283,9 @@ snapshots: is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.16 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.3(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.4(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10405,64 +10298,64 @@ snapshots: is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.16 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.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-plugin-import@2.32.0)(eslint@9.39.4))(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4) transitivePeerDependencies: - supports-color - 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)(eslint@9.39.4))(eslint@9.39.4): + 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): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(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)(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) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.3(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.4(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.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(eslint@8.57.1)(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@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(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@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.3(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.4(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.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(eslint@9.39.4)(typescript@5.9.3))(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.4(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.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(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)(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) transitivePeerDependencies: - supports-color @@ -10492,7 +10385,7 @@ snapshots: eslint-utils: 2.1.0 regexpp: 3.2.0 - 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)(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): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10503,7 +10396,7 @@ 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@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)(eslint@9.39.4))(eslint@9.39.4) + 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.2 is-glob: 4.0.3 @@ -10521,7 +10414,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(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.4(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 @@ -10532,7 +10425,7 @@ 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.3(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.4(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.2 is-glob: 4.0.3 @@ -10544,13 +10437,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -10561,7 +10454,7 @@ 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.3(eslint@8.57.1)(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@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(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@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.3 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -10573,13 +10466,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.3(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.4(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 @@ -10590,7 +10483,7 @@ 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.3(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.4(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.2 is-glob: 4.0.3 @@ -10602,13 +10495,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(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.3(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.4(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 @@ -10619,7 +10512,7 @@ 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.3(eslint@9.39.4)(typescript@5.9.3))(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.4(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.2 is-glob: 4.0.3 @@ -10631,7 +10524,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -10710,7 +10603,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.3 + enhanced-resolve: 5.21.4 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) get-tsconfig: 4.14.0 @@ -10725,7 +10618,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@8.57.1)(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - enhanced-resolve: 5.21.3 + enhanced-resolve: 5.21.4 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) get-tsconfig: 4.14.0 @@ -10740,7 +10633,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.3 + enhanced-resolve: 5.21.4 eslint: 9.39.4 eslint-plugin-es-x: 7.8.0(eslint@9.39.4) get-tsconfig: 4.14.0 @@ -10755,7 +10648,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.3 + enhanced-resolve: 5.21.4 eslint: 9.39.4 eslint-plugin-es-x: 7.8.0(eslint@9.39.4) get-tsconfig: 4.14.0 @@ -10779,8 +10672,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@8.57.1)(typescript@4.9.5): dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -10789,8 +10682,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -10799,8 +10692,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.4)(typescript@4.9.5): dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -10809,8 +10702,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.59.3 - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -12497,7 +12390,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.6: {} + lru-cache@11.4.0: {} lru-cache@5.1.1: dependencies: @@ -12799,17 +12692,17 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - oclif@4.23.2(@types/node@14.18.63): + oclif@4.23.7(@types/node@14.18.63): dependencies: - '@aws-sdk/client-cloudfront': 3.1047.0 - '@aws-sdk/client-s3': 3.1047.0 + '@aws-sdk/client-cloudfront': 3.1049.0 + '@aws-sdk/client-s3': 3.1049.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 - '@oclif/core': 4.11.2 - '@oclif/plugin-help': 6.2.48 - '@oclif/plugin-not-found': 3.2.85(@types/node@14.18.63) - '@oclif/plugin-warn-if-update-available': 3.1.64 + '@oclif/core': 4.11.3 + '@oclif/plugin-help': 6.2.49 + '@oclif/plugin-not-found': 3.2.86(@types/node@14.18.63) + '@oclif/plugin-warn-if-update-available': 3.1.65 ansis: 3.17.0 async-retry: 1.3.3 change-case: 4.1.2 @@ -12827,20 +12720,19 @@ snapshots: validate-npm-package-name: 5.0.1 transitivePeerDependencies: - '@types/node' - - aws-crt - supports-color - oclif@4.23.2(@types/node@18.19.130): + oclif@4.23.7(@types/node@18.19.130): dependencies: - '@aws-sdk/client-cloudfront': 3.1047.0 - '@aws-sdk/client-s3': 3.1047.0 + '@aws-sdk/client-cloudfront': 3.1049.0 + '@aws-sdk/client-s3': 3.1049.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 - '@oclif/core': 4.11.2 - '@oclif/plugin-help': 6.2.48 - '@oclif/plugin-not-found': 3.2.85(@types/node@18.19.130) - '@oclif/plugin-warn-if-update-available': 3.1.64 + '@oclif/core': 4.11.3 + '@oclif/plugin-help': 6.2.49 + '@oclif/plugin-not-found': 3.2.86(@types/node@18.19.130) + '@oclif/plugin-warn-if-update-available': 3.1.65 ansis: 3.17.0 async-retry: 1.3.3 change-case: 4.1.2 @@ -12858,20 +12750,19 @@ snapshots: validate-npm-package-name: 5.0.1 transitivePeerDependencies: - '@types/node' - - aws-crt - supports-color - oclif@4.23.2(@types/node@20.19.41): + oclif@4.23.7(@types/node@20.19.41): dependencies: - '@aws-sdk/client-cloudfront': 3.1047.0 - '@aws-sdk/client-s3': 3.1047.0 + '@aws-sdk/client-cloudfront': 3.1049.0 + '@aws-sdk/client-s3': 3.1049.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 - '@oclif/core': 4.11.2 - '@oclif/plugin-help': 6.2.48 - '@oclif/plugin-not-found': 3.2.85(@types/node@20.19.41) - '@oclif/plugin-warn-if-update-available': 3.1.64 + '@oclif/core': 4.11.3 + '@oclif/plugin-help': 6.2.49 + '@oclif/plugin-not-found': 3.2.86(@types/node@20.19.41) + '@oclif/plugin-warn-if-update-available': 3.1.65 ansis: 3.17.0 async-retry: 1.3.3 change-case: 4.1.2 @@ -12889,20 +12780,19 @@ snapshots: validate-npm-package-name: 5.0.1 transitivePeerDependencies: - '@types/node' - - aws-crt - supports-color - oclif@4.23.2(@types/node@22.19.19): + oclif@4.23.7(@types/node@22.19.19): dependencies: - '@aws-sdk/client-cloudfront': 3.1047.0 - '@aws-sdk/client-s3': 3.1047.0 + '@aws-sdk/client-cloudfront': 3.1049.0 + '@aws-sdk/client-s3': 3.1049.0 '@inquirer/confirm': 3.2.0 '@inquirer/input': 2.3.0 '@inquirer/select': 2.5.0 - '@oclif/core': 4.11.2 - '@oclif/plugin-help': 6.2.48 - '@oclif/plugin-not-found': 3.2.85(@types/node@22.19.19) - '@oclif/plugin-warn-if-update-available': 3.1.64 + '@oclif/core': 4.11.3 + '@oclif/plugin-help': 6.2.49 + '@oclif/plugin-not-found': 3.2.86(@types/node@22.19.19) + '@oclif/plugin-warn-if-update-available': 3.1.65 ansis: 3.17.0 async-retry: 1.3.3 change-case: 4.1.2 @@ -12920,7 +12810,6 @@ snapshots: validate-npm-package-name: 5.0.1 transitivePeerDependencies: - '@types/node' - - aws-crt - supports-color once@1.4.0: @@ -13076,7 +12965,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.6 + lru-cache: 11.4.0 minipass: 7.1.3 path-to-regexp@6.3.0: {} @@ -13165,7 +13054,7 @@ snapshots: pure-rand@6.1.0: {} - qs@6.15.1: + qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -13330,7 +13219,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.6: + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 is-core-module: 2.16.2 @@ -14085,45 +13974,45 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.59.3(eslint@8.57.1)(typescript@4.9.5): + typescript-eslint@8.59.4(eslint@8.57.1)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@4.9.5) eslint: 8.57.1 typescript: 4.9.5 transitivePeerDependencies: - supports-color - typescript-eslint@8.59.3(eslint@8.57.1)(typescript@5.9.3): + typescript-eslint@8.59.4(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.3(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript-eslint@8.59.3(eslint@9.39.4)(typescript@4.9.5): + typescript-eslint@8.59.4(eslint@9.39.4)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@4.9.5) - '@typescript-eslint/typescript-estree': 8.59.3(typescript@4.9.5) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@4.9.5))(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.59.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@4.9.5) eslint: 9.39.4 typescript: 4.9.5 transitivePeerDependencies: - supports-color - typescript-eslint@8.59.3(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.59.4(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.3(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.3(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.4(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4)(typescript@5.9.3) eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: @@ -14165,29 +14054,30 @@ snapshots: universalify@2.0.1: {} - unrs-resolver@1.11.1: + unrs-resolver@1.12.1: dependencies: napi-postinstall: 0.3.4 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + '@unrs/resolver-binding-android-arm-eabi': 1.12.1 + '@unrs/resolver-binding-android-arm64': 1.12.1 + '@unrs/resolver-binding-darwin-arm64': 1.12.1 + '@unrs/resolver-binding-darwin-x64': 1.12.1 + '@unrs/resolver-binding-freebsd-x64': 1.12.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.1 + '@unrs/resolver-binding-linux-x64-musl': 1.12.1 + '@unrs/resolver-binding-openharmony-arm64': 1.12.1 + '@unrs/resolver-binding-wasm32-wasi': 1.12.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.1 update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: