diff --git a/.cursor/rules/README.md b/.cursor/rules/README.md index 41143e4..f5c1f87 100644 --- a/.cursor/rules/README.md +++ b/.cursor/rules/README.md @@ -1,25 +1,5 @@ -# Cursor rules +# Cursor (optional) -Rules give context-aware guidance for this **Contentstack query-export CLI plugin** (`@contentstack/cli-cm-export-query`). +**Cursor** users: start at **[AGENTS.md](../../AGENTS.md)**. All conventions live in **`skills/*/SKILL.md`**. -## Rules overview - -| File | Purpose | -|------|---------| -| `dev-workflow.md` | TDD, structure, validation commands (always applied) | -| `typescript.mdc` | TypeScript style and naming | -| `contentstack-cli.mdc` | Contentstack CLI utilities, export flow, API habits | -| `testing.mdc` | Mocha/Chai/Sinon and coverage | -| `oclif-commands.mdc` | Command flag and delegation patterns | - -## How they attach - -- **Always**: `dev-workflow.md` -- **TypeScript**: `typescript.mdc` -- **Commands** (`src/commands/**`): `oclif-commands.mdc` + `typescript.mdc` -- **Core / utils** (`src/core/**`, `src/utils/**`, `src/types/**`): `contentstack-cli.mdc` + `typescript.mdc` -- **Tests** (`test/**`): `testing.mdc` + domain rules as needed - -## Chat shortcuts - -You can `@`-mention rule topics (for example TypeScript or testing) depending on how your workspace maps rule names. +This folder only points contributors to **`AGENTS.md`** so editor-specific config does not duplicate the canonical docs. diff --git a/.cursor/rules/contentstack-cli.mdc b/.cursor/rules/contentstack-cli.mdc deleted file mode 100644 index c4be6e1..0000000 --- a/.cursor/rules/contentstack-cli.mdc +++ /dev/null @@ -1,39 +0,0 @@ ---- -description: "Contentstack query-export plugin: CLI utilities, export flow, and API habits" -globs: - - "**/core/**/*.ts" - - "**/utils/**/*.ts" - - "**/types/**/*.ts" - - "**/config/**/*.ts" -alwaysApply: false ---- - -# Contentstack CLI — query export plugin - -This package is **`@contentstack/cli-cm-export-query`**. Business logic lives in **`src/core/`** and **`src/utils/`** (there is no `src/services/` layer). - -## Stack and auth - -- Use **`@contentstack/cli-utilities`**: `managementSDKClient`, `flags`, `log`, `handleAndLogError`, `sanitizePath`, etc. -- Resolve management tokens and stack context the same way as **`src/commands/cm/stacks/export-query.ts`** (alias, `--stack-api-key`, config file). -- **Never** log or write secrets (API keys, management tokens) to export artifacts or casual log lines. - -## Export orchestration - -- **`QueryExporter`** (`src/core/query-executor.ts`) drives the flow: parse query → export modules → resolve dependencies / references / assets per flags. -- **`ModuleExporter`** (`src/core/module-exporter.ts`) handles module-level export alongside **`@contentstack/cli-cm-export`** behavior. -- Prefer extending **utils** and **core** classes rather than putting heavy logic in the command’s `run()`. - -## Queries - -- Queries are JSON (string or path to a JSON file); see **`QueryParser`** (`src/utils/query-parser.ts`) and command examples in `export-query.ts`. -- Respect flags: **`skip-references`**, **`skip-dependencies`**, **`secured-assets`**, branch / branch-alias. - -## API usage - -- Respect Contentstack **rate limits**; use backoff for **429** and transient failures when adding new API calls. -- Mock **all** HTTP/SDK usage in tests (sinon); no live stack calls in unit tests. - -## Not in this plugin - -- Other CLI repos may use **`BaseBulkCommand`** or **`bulk-operation/*.json`** logs. This plugin uses **`Command`** from **`@contentstack/cli-command`** and the **`QueryExporter`** pipeline only. diff --git a/.cursor/rules/dev-workflow.md b/.cursor/rules/dev-workflow.md deleted file mode 100644 index fbfd52a..0000000 --- a/.cursor/rules/dev-workflow.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -description: "Core development workflow and TDD patterns - always applied" -globs: ["**/*.ts", "**/*.js", "**/*.json"] -alwaysApply: true ---- - -# Development Workflow - -## Quick Reference - -For detailed patterns, see project skills: - -- `@skills/testing` — Testing and TDD -- `@skills/contentstack-cli` — Export command, utilities, and API usage -- `@skills/framework` — Config, logging, and shared patterns -- `@skills/code-review` — PR review checklist - -## TDD workflow (recommended) - -For **new behavior or bug fixes**, prefer working in three steps: - -1. **RED** → Write a failing test (or extend an existing one) -2. **GREEN** → Minimal code to pass -3. **REFACTOR** → Clean up while tests stay green - -**Exceptions (no new test required when behavior is unchanged):** pure refactors, documentation-only edits, comments/config-only tweaks, trivial typos. - -## Guidelines - -- **Coverage:** aim high; **~80%** (lines/branches/functions) is an **aspirational target**, not a CI gate in this repo -- **TypeScript** — explicit return types where practical; avoid `any` -- **NO test.skip or .only** in commits - -## File structure (this repo) - -- **Command**: `src/commands/cm/stacks/export-query.ts` -- **Core**: `src/core/` — `QueryExporter`, `ModuleExporter` -- **Utils**: `src/utils/` — query parsing, config, dependencies, assets, branches, file helpers -- **Types**: `src/types/index.ts` -- **Config**: `src/config/` (copied to `lib/` on build) -- **Messages**: `messages/index.json` -- **Tests**: `test/unit/*.test.ts` (grouped by module under test) - -## Naming conventions - -- Files: `kebab-case.ts` / `kebab-case.test.ts` -- Classes: `PascalCase` -- Functions: `camelCase` -- Tests: `should [behavior] when [condition]` - -## Before coding - -1. Read relevant `@skills/*` references -2. For behavior changes: prefer a failing test first, then implement -3. Refactor and run tests - -## Validation commands - -- `npm run lint` — ESLint on `src/**/*.ts` -- `npm run test` — All tests with nyc -- `npm run test:report` — LCOV coverage report -- `npm run test:unit` — Unit tests only -- `npm run format` — ESLint `--fix` - -## Commit suggestions - -- Conventional commits are helpful but optional: `feat(scope): description` -- Tests passing before merge -- No lint errors -- No stray `console.log` / `debugger` diff --git a/.cursor/rules/oclif-commands.mdc b/.cursor/rules/oclif-commands.mdc deleted file mode 100644 index 6349d83..0000000 --- a/.cursor/rules/oclif-commands.mdc +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: "OCLIF / Contentstack command patterns for this plugin" -globs: ["**/commands/**/*.ts"] -alwaysApply: false ---- - -# Command standards (`export-query`) - -This plugin uses **`Command`** from **`@contentstack/cli-command`** and **`flags` / `FlagInput`** from **`@contentstack/cli-utilities`** (not `@oclif/core` `Flags` directly). Follow **`src/commands/cm/stacks/export-query.ts`** as the source of truth. - -## Structure - -```typescript -import { Command } from '@contentstack/cli-command'; -import { flags, FlagInput, managementSDKClient, log, handleAndLogError } from '@contentstack/cli-utilities'; -import { QueryExporter } from '../../../core/query-executor'; - -export default class ExportQueryCommand extends Command { - static description = 'Export content from a stack using query-based filtering'; - static examples = ['csdx cm:stacks:export-query --query \'{"modules":{...}}\'']; - - static flags: FlagInput = { - query: flags.string({ required: true, description: 'Query as JSON string or file path' }), - }; - - async run(): Promise { - const { flags } = await this.parse(ExportQueryCommand); - // Build config via src/utils (e.g. setupQueryExportConfig), then: - const exporter = new QueryExporter(client, exportQueryConfig); - await exporter.execute(); - } -} -``` - -## Practices - -- **Validate early**: required `query`; ensure stack auth is present before calling the API. -- **Delegate**: keep parsing, paths, and SDK wiring out of `QueryExporter` where helpers already exist under **`src/utils/`**. -- **User feedback**: prefer **`log`** from **`@contentstack/cli-utilities`** with export context. -- **Errors**: use **`handleAndLogError`** and/or command error UX consistent with other Contentstack CLI plugins. - -## Flags - -- Define flags with **`flags.string`**, **`flags.boolean`**, etc., and **`FlagInput`** typing for the static `flags` object. -- Use **`exclusive`** on mutually exclusive options (see branch vs branch-alias in `export-query.ts`). diff --git a/.cursor/rules/testing.mdc b/.cursor/rules/testing.mdc deleted file mode 100644 index e1db60f..0000000 --- a/.cursor/rules/testing.mdc +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: "Testing patterns and TDD workflow" -globs: ["**/__tests__/**/*.ts", "**/*.spec.ts", "**/*.test.ts"] -alwaysApply: true ---- - -# Testing Standards - -## TDD workflow -1. For behavior changes, prefer a failing test first -2. Minimal code to pass -3. Refactor while keeping tests green - -Pure refactors and docs-only changes may skip new tests when behavior is unchanged. - -## Coverage -- **~80%** (lines, branches, functions) is an **aspirational** goal, not enforced as a hard gate here -- Test both success and failure paths -- Mock all external dependencies - -## Test Patterns -```typescript -// ✅ GOOD - Simple test structure -describe('[ComponentName]', () => { - beforeEach(() => { - // Setup mocks and test data - sinon.stub(ExternalService.prototype, 'method').resolves(mockData); - }); - - afterEach(() => { - sinon.restore(); - }); - - it('should [expected behavior] when [condition]', () => { - // Arrange - const input = { /* test data */ }; - - // Act - const result = component.method(input); - - // Assert - expect(result).to.equal(expectedOutput); - }); -}); -``` - -## Mocking Standards -- Use sinon for API response mocking -- Never make real API calls in tests -- Mock at module boundaries (SDK clients, `fsUtil`, etc.), not irrelevant internals - -## Layout - -- Unit tests live under **`test/unit/**/*.test.ts`** (Mocha). - -## Common mock patterns -```typescript -// Mock external API -sinon.stub(HttpClient.prototype, 'request').resolves(mockResponse); - -// Mock file operations -sinon.stub(fs, 'readFile').resolves(mockFileContent); - -// Mock rate limiter -sinon.stub(RateLimiter.prototype, 'wait').resolves(); -``` \ No newline at end of file diff --git a/.cursor/rules/typescript.mdc b/.cursor/rules/typescript.mdc deleted file mode 100644 index 4b982c9..0000000 --- a/.cursor/rules/typescript.mdc +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: "TypeScript strict mode standards and naming conventions" -globs: ["**/*.ts", "**/*.tsx"] -alwaysApply: false ---- - -# TypeScript Standards - -## Strict Mode Requirements -- Explicit return types for all functions -- No `any` type usage -- Strict null checks enabled -- No unused variables or imports - -## Naming Conventions -- **Files**: kebab-case.ts -- **Classes**: PascalCase -- **Functions/Variables**: camelCase -- **Constants**: SCREAMING_SNAKE_CASE -- **Interfaces**: PascalCase (no I prefix) -- **Types**: PascalCase - -## Code Examples -```typescript -// ✅ GOOD - Explicit types and proper naming -export class UserService { - async fetchUser(userId: string): Promise { - const user = await this.client.getUser(userId); - return user; - } -} - -// ❌ BAD - Implicit any, poor naming -export class userservice { - async fetchUser(id) { - return await this.client.getUser(id); - } -} -``` - -## Import Organization -1. Node.js built-ins -2. External libraries -3. Internal modules (relative imports last) - -## Error Handling -- Use custom error classes -- Include error context and cause -- Never swallow errors silently \ No newline at end of file diff --git a/.cursor/skills/SKILL.md b/.cursor/skills/SKILL.md deleted file mode 100644 index d63c12d..0000000 --- a/.cursor/skills/SKILL.md +++ /dev/null @@ -1,5 +0,0 @@ -# Project skills - -Agent-oriented skills for **cli-query-export** (`@contentstack/cli-cm-export-query`) live under **[`skills/`](../../skills/)**. - -Reference in chat with `@skills/` (for example `@skills/contentstack-cli`, `@skills/testing`). diff --git a/.talismanrc b/.talismanrc index 445b1e3..2ee647a 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,4 +1,14 @@ fileignoreconfig: - filename: package-lock.json - checksum: 30fe4f8843bd6518638dab4c903c8dba58e9040bfce658d1678111cec5844f70 + checksum: b4f6e41c55c3c7fa9d8b7ea903eb9bc85f27464306a428c97b7e96e86ffce5f7 + - filename: skills/testing/SKILL.md + checksum: da9831797a5e6a4d2e6e846c3f6d2583d84008d2dfd454dd7effe2f897c43a7b + - filename: skills/framework/SKILL.md + checksum: 217cf9123bf9b62a4d9b0c891af8ba388173c601c782ed0fea432f6be7ef5e56 + - filename: skills/contentstack-cli/SKILL.md + checksum: b42e3526fb902a31080824b776cc8e233646139ee0915d89c0925744d56d586f + - filename: skills/code-review/SKILL.md + checksum: 687efb830fb4a9fb2b2e6682db052771706ddd9b12dc9cec04943e3cade929b3 + - filename: skills/dev-workflow/SKILL.md + checksum: 03434201e3aaaa9239aff2f97826d64ac4ca31467b77c07330ac4b608ee24939 version: '1.0' diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a50993c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,45 @@ +# CLI export-query plugin – Agent guide + +**Universal entry point** for contributors and AI agents. Detailed conventions live in **`skills/*/SKILL.md`**. + +## What this repo is + +| Field | Detail | +| --- | --- | +| **Name:** | `@contentstack/cli-cm-export-query` ([repository](https://github.com/contentstack/cli)) | +| **Purpose:** | OCLIF plugin for **query-based** stack export (`cm:stacks:export-query` / short `EXPRTQRY`); implements `QueryExporter` and related export flow. | +| **Out of scope (if any):** | Other export/import plugins live in sibling packages; this repo is only the query-export plugin. | + +## Tech stack (at a glance) + +| Area | Details | +| --- | --- | +| **Language** | TypeScript **^4.9** (`tsconfig.json`); Node **>= 14** (`engines`) | +| **Build** | `tsc -b` → `lib/`; `prepack` runs compile + `oclif manifest` + `oclif readme`; copies `src/config` → `lib/` | +| **Tests** | Mocha + Chai + Sinon; **nyc** coverage; tests under `test/**/*.test.ts` (see [skills/testing/SKILL.md](skills/testing/SKILL.md)) | +| **Lint / coverage** | ESLint `src/**/*.ts`; nyc in `npm test` | +| **Other** | OCLIF v4, Husky | + +## Commands (quick reference) + +| Command type | Command | +| --- | --- | +| **Build** | `npm run build` | +| **Test** | `npm test` | +| **Lint** | `npm run lint` | + +CI: [.github/workflows/unit-test.yml](.github/workflows/unit-test.yml); also `release.yml`, `sca-scan.yml`, `policy-scan.yml` under [.github/workflows/](.github/workflows/). + +## Where the documentation lives: skills + +| Skill | Path | What it covers | +| --- | --- | --- | +| Development workflow | [skills/dev-workflow/SKILL.md](skills/dev-workflow/SKILL.md) | CI, branches, Husky, PR expectations | +| Contentstack CLI | [skills/contentstack-cli/SKILL.md](skills/contentstack-cli/SKILL.md) | Commands, `QueryExporter`, APIs | +| Framework | [skills/framework/SKILL.md](skills/framework/SKILL.md) | Config, logging, errors, utilities | +| Testing | [skills/testing/SKILL.md](skills/testing/SKILL.md) | Mocha/Chai/Sinon, nyc, TDD | +| Code review | [skills/code-review/SKILL.md](skills/code-review/SKILL.md) | PR checklist | + +## Using Cursor (optional) + +If you use **Cursor**, [.cursor/rules/README.md](.cursor/rules/README.md) only points to **`AGENTS.md`**—same docs as everyone else. diff --git a/messages/index.json b/messages/index.json index 9e26dfe..21a72c8 100644 --- a/messages/index.json +++ b/messages/index.json @@ -1 +1,75 @@ -{} \ No newline at end of file +{ + "ASSET_EXPORT_COMPLETE": "Asset export process completed successfully", + "ASSET_FOLDERS_EXPORT_COMPLETE": "Asset folder structure exported successfully", + "ASSET_METADATA_EXPORT_COMPLETE": "Asset metadata exported successfully", + "ASSET_VERSIONED_METADATA_EXPORT_COMPLETE": "Versioned asset metadata exported successfully", + "ASSET_DOWNLOAD_COMPLETE": "Asset download completed successfully", + "ASSET_DOWNLOAD_SUCCESS": "Asset '%s' (UID: %s) downloaded successfully", + "ASSET_DOWNLOAD_FAILED": "Failed to download asset '%s' (UID: %s)", + "ASSET_WRITE_FAILED": "Failed to write asset file '%s' (UID: %s)", + "ASSET_QUERY_FAILED": "Failed to query asset data from the API", + "ASSET_VERSIONED_QUERY_FAILED": "Failed to query versioned asset data from the API", + "ASSET_COUNT_QUERY_FAILED": "Failed to retrieve total asset count", + + "CONTENT_TYPE_EXPORT_COMPLETE": "Content types exported successfully", + "CONTENT_TYPE_NO_TYPES": "No content types found", + "CONTENT_TYPE_EXPORT_FAILED": "Failed to export content types", + "CONTENT_TYPE_NO_TYPES_RETURNED": "API returned no content types for the given query", + + "ENVIRONMENT_EXPORT_COMPLETE": "Successfully exported %s environment(s)", + "ENVIRONMENT_EXPORT_SUCCESS": "Environment '%s' exported successfully", + "ENVIRONMENT_NOT_FOUND": "No environments found in the current stack", + + "EXTENSION_EXPORT_COMPLETE": "Successfully exported %s extension(s)", + "EXTENSION_EXPORT_SUCCESS": "Extension '%s' exported successfully", + "EXTENSION_NOT_FOUND": "No extensions found in the current stack", + + "GLOBAL_FIELDS_EXPORT_COMPLETE": "Successfully exported %s global field(s)", + + "LABELS_EXPORT_COMPLETE": "Successfully exported %s label(s)", + "LABEL_EXPORT_SUCCESS": "Label '%s' exported successfully", + "LABELS_NOT_FOUND": "No labels found in the current stack", + + "LOCALES_EXPORT_COMPLETE": "Successfully exported %s locale(s) including %s master locale(s)", + + "TAXONOMY_EXPORT_COMPLETE": "Successfully exported %s taxonomy entries", + "TAXONOMY_EXPORT_SUCCESS": "Taxonomy '%s' exported successfully", + "TAXONOMY_NOT_FOUND": "No taxonomies found in the current stack", + + "WEBHOOK_EXPORT_COMPLETE": "Successfully exported %s webhook(s)", + "WEBHOOK_EXPORT_SUCCESS": "Webhook '%s' exported successfully", + "WEBHOOK_NOT_FOUND": "No webhooks found in the current stack", + + "WORKFLOW_EXPORT_COMPLETE": "Successfully exported %s workflow(s)", + "WORKFLOW_EXPORT_SUCCESS": "Workflow '%s' exported successfully", + "WORKFLOW_NOT_FOUND": "No workflows found in the current stack", + + "PERSONALIZE_URL_NOT_SET": "Cannot export Personalize project: URL not configured", + "PERSONALIZE_SKIPPING_WITH_MANAGEMENT_TOKEN": "Skipping Personalize project export: Management token not supported", + "PERSONALIZE_MODULE_NOT_IMPLEMENTED": "Module '%s' implementation not found", + "PERSONALIZE_NOT_ENABLED": "Personalize feature is not enabled for this organization", + + "MARKETPLACE_APPS_EXPORT_COMPLETE": "Successfully exported %s marketplace app(s)", + "MARKETPLACE_APP_CONFIG_EXPORT": "Exporting configuration for app '%s'", + "MARKETPLACE_APP_CONFIG_SUCCESS": "Successfully exported configuration for app '%s'", + "MARKETPLACE_APP_EXPORT_SUCCESS": "Successfully exported app '%s'", + "MARKETPLACE_APPS_NOT_FOUND": "No marketplace apps found in the current stack", + "MARKETPLACE_APP_CONFIG_EXPORT_FAILED": "Failed to export configuration for app '%s'", + "MARKETPLACE_APP_MANIFEST_EXPORT_FAILED": "Failed to export manifest for app '%s'", + + "COMPOSABLE_STUDIO_EXPORT_START": "Starting Studio project export...", + "COMPOSABLE_STUDIO_NOT_FOUND": "No Studio project found for this stack", + "COMPOSABLE_STUDIO_EXPORT_COMPLETE": "Successfully exported Studio project '%s'", + "COMPOSABLE_STUDIO_EXPORT_FAILED": "Failed to export Studio project: %s", + "COMPOSABLE_STUDIO_AUTH_REQUIRED": "To export Studio projects, you must be logged in", + + "ENTRIES_EXPORT_COMPLETE": "Successfully exported entries (Content Type: %s, Locale: %s)", + "ENTRIES_EXPORT_SUCCESS": "All entries exported successfully", + "ENTRIES_VERSIONED_EXPORT_SUCCESS": "Successfully exported versioned entry (Content Type: %s, UID: %s, Locale: %s)", + "ENTRIES_EXPORT_VERSIONS_FAILED": "Failed to export versions for content type '%s' (UID: %s)", + + "BRANCH_EXPORT_FAILED": "Failed to export contents from branch (UID: %s)", + + "ROLES_NO_CUSTOM_ROLES": "No custom roles found in the current stack", + "ROLES_EXPORTING_ROLE": "Exporting role '%s'" +} diff --git a/package-lock.json b/package-lock.json index da6cfb7..85f4f5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@contentstack/cli-cm-export-query", - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/cli-cm-export-query", - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "license": "MIT", "dependencies": { - "@contentstack/cli-cm-export": "~1.24.1", - "@contentstack/cli-command": "~1.8.0", - "@contentstack/cli-utilities": "~1.18.1", + "@contentstack/cli-cm-export": "~2.0.0-beta.14", + "@contentstack/cli-command": "~2.0.0-beta.5", + "@contentstack/cli-utilities": "~2.0.0-beta.7", "@oclif/core": "^4.10.5", "async": "^3.2.6", "big-json": "^3.2.0", @@ -391,23 +391,24 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.27", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.27.tgz", - "integrity": "sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==", + "version": "3.974.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.5.tgz", + "integrity": "sha512-lMPlYlYfQdNZhlkJgnkmESwrY+hNh3PljmZ+37oAqLNdJ6rnILAwFSyc6B3bJeDOtMORNnMQIej0aTRuOlDyhQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@aws-sdk/xml-builder": "^3.972.17", - "@smithy/core": "^3.23.14", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/property-provider": "^4.2.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/signature-v4": "^5.3.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/xml-builder": "^3.972.19", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.13", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.4", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -416,13 +417,13 @@ } }, "node_modules/@aws-sdk/crc64-nvme": { - "version": "3.972.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.6.tgz", - "integrity": "sha512-NMbiqKdruhwwgI6nzBVe2jWMkXjaoQz2YOs3rFX+2F3gGyrJDkDPwMpV/RsTFeq2vAQ055wZNtOXFK4NYSkM8g==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.7.tgz", + "integrity": "sha512-QUagVVBbC8gODCF6e1aV0mE2TXWB9Opz4k8EJFdNrujUVQm5R4AjJa1mpOqzwOuROBzqJU9zawzig7M96L8Ejg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -430,16 +431,16 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.25", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.25.tgz", - "integrity": "sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==", + "version": "3.972.31", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.31.tgz", + "integrity": "sha512-X/yGB73LmDW/6MdDJGCDzZBUXnM3ys4vs9l+5ZTJmiEswDdP1OjeoAFlFjVGS9o4KB2wZWQ9KOfdVNSSK6Ep3w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -447,21 +448,21 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.27", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.27.tgz", - "integrity": "sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==", + "version": "3.972.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.33.tgz", + "integrity": "sha512-c0ZF+lwoWVvX5iCaGKL5T/4DnIw88CGqxA0BcBs3U86mIp5EZYPVg+KSPkMXOyokmADvNewiMUfSG2uFwjRp0g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/types": "^3.973.7", - "@smithy/fetch-http-handler": "^5.3.16", - "@smithy/node-http-handler": "^4.5.2", - "@smithy/property-provider": "^4.2.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", - "@smithy/util-stream": "^4.5.22", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-stream": "^4.5.25", "tslib": "^2.6.2" }, "engines": { @@ -469,25 +470,25 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.29.tgz", - "integrity": "sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/credential-provider-env": "^3.972.25", - "@aws-sdk/credential-provider-http": "^3.972.27", - "@aws-sdk/credential-provider-login": "^3.972.29", - "@aws-sdk/credential-provider-process": "^3.972.25", - "@aws-sdk/credential-provider-sso": "^3.972.29", - "@aws-sdk/credential-provider-web-identity": "^3.972.29", - "@aws-sdk/nested-clients": "^3.996.19", - "@aws-sdk/types": "^3.973.7", - "@smithy/credential-provider-imds": "^4.2.13", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.35.tgz", + "integrity": "sha512-jsU4u/cRkKFLKQS0k918FQ27fzXLG5ENiLWQMYE6581zLeI2hWh04ptlrvZMB3wJT/5d+vSzJk74X1CMFr4y8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/credential-provider-env": "^3.972.31", + "@aws-sdk/credential-provider-http": "^3.972.33", + "@aws-sdk/credential-provider-login": "^3.972.35", + "@aws-sdk/credential-provider-process": "^3.972.31", + "@aws-sdk/credential-provider-sso": "^3.972.35", + "@aws-sdk/credential-provider-web-identity": "^3.972.35", + "@aws-sdk/nested-clients": "^3.997.3", + "@aws-sdk/types": "^3.973.8", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -495,19 +496,19 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.29.tgz", - "integrity": "sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.35.tgz", + "integrity": "sha512-5oa3j0cA50jPqgNhZ9XdJVopuzUf1klRb28/2MfLYWWiPi9DRVvbrBWT+DidbHTT36520VuXZJahQwR+YgSjrg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/nested-clients": "^3.996.19", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/nested-clients": "^3.997.3", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -515,23 +516,23 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.30", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.30.tgz", - "integrity": "sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.25", - "@aws-sdk/credential-provider-http": "^3.972.27", - "@aws-sdk/credential-provider-ini": "^3.972.29", - "@aws-sdk/credential-provider-process": "^3.972.25", - "@aws-sdk/credential-provider-sso": "^3.972.29", - "@aws-sdk/credential-provider-web-identity": "^3.972.29", - "@aws-sdk/types": "^3.973.7", - "@smithy/credential-provider-imds": "^4.2.13", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.36.tgz", + "integrity": "sha512-4nT2T8Z7vH8KE9EdjEsuIlHpZSlcaK2PrKbQBjuUGU46BCCzF3WvP0u0Uiosni3Ykmmn4rWLVawoOCLotUtCbg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.31", + "@aws-sdk/credential-provider-http": "^3.972.33", + "@aws-sdk/credential-provider-ini": "^3.972.35", + "@aws-sdk/credential-provider-process": "^3.972.31", + "@aws-sdk/credential-provider-sso": "^3.972.35", + "@aws-sdk/credential-provider-web-identity": "^3.972.35", + "@aws-sdk/types": "^3.973.8", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -539,17 +540,17 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.25", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.25.tgz", - "integrity": "sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==", + "version": "3.972.31", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.31.tgz", + "integrity": "sha512-eKeT4MXumpBJsrDLCYcSzIkFPVTFn/es7It2oogp2OhU/ic7P/+xzFpQx9ZhwtXS57Mc5S42BPWi7lHmvs/nYg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -557,19 +558,19 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.29.tgz", - "integrity": "sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.35.tgz", + "integrity": "sha512-bCuBdfnj0KGDMdLp6utMTLiJcFN2ek9EgZinxQZZSc3FxjJ/HSqeqab2cjbnoNfy8RM6suDCsRkmVY1izp9I+A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/nested-clients": "^3.996.19", - "@aws-sdk/token-providers": "3.1026.0", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/nested-clients": "^3.997.3", + "@aws-sdk/token-providers": "3.1036.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -577,18 +578,18 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.29.tgz", - "integrity": "sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.35.tgz", + "integrity": "sha512-swW6Bwvl8lanyEMtZOWE/oR6yqcRQH4HTQZUVsnDVgoXvRjRywpYpLv2BWwjUFyjPrqsdX6FeTkf4tMSe/qFTQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/nested-clients": "^3.996.19", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/nested-clients": "^3.997.3", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -596,17 +597,17 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.9.tgz", - "integrity": "sha512-COToYKgquDyligbcAep7ygs48RK+mwe/IYprq4+TSrVFzNOYmzWvHf6werpnKV5VYpRiwdn+Wa5ZXkPqLVwcTg==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.10.tgz", + "integrity": "sha512-Vbc2frZH7wXlMNd+ZZSXUEs/l1Sv8Jj4zUnIfwrYF5lwaLdXHZ9xx4U3rjUcaye3HRhFVc+E5DbBxpRAbB16BA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", + "@aws-sdk/types": "^3.973.8", "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, @@ -615,15 +616,15 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.9.tgz", - "integrity": "sha512-V/FNCjFxnh4VGu+HdSiW4Yg5GELihA1MIDSAdsEPvuayXBVmr0Jaa6jdLAZLH38KYXl/vVjri9DQJWnTAujHEA==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.10.tgz", + "integrity": "sha512-2Yn0f1Qiq/DjxYR3wfI3LokXnjOhFM7Ssn4LTdFDIxRMCE6I32MAsVnhPX1cUZsuVA9tiZtwwhlSLAtFGxAZlQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -631,24 +632,24 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.974.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.7.tgz", - "integrity": "sha512-uU4/ch2CLHB8Phu1oTKnnQ4e8Ujqi49zEnQYBhWYT53zfFvtJCdGsaOoypBr8Fm/pmCBssRmGoIQ4sixgdLP9w==", + "version": "3.974.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.13.tgz", + "integrity": "sha512-b6QUe2hQX9XsnCzp6mtzVaERhganDKeb8lmGL6pVhr7rRVH9S9keDFW7uKytuuqmcY5943FixoGqn/QL+sbUBA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/crc64-nvme": "^3.972.6", - "@aws-sdk/types": "^3.973.7", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/crc64-nvme": "^3.972.7", + "@aws-sdk/types": "^3.973.8", "@smithy/is-array-buffer": "^4.2.2", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", - "@smithy/util-middleware": "^4.2.13", - "@smithy/util-stream": "^4.5.22", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-stream": "^4.5.25", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -657,15 +658,15 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.9.tgz", - "integrity": "sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz", + "integrity": "sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -673,14 +674,14 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.9.tgz", - "integrity": "sha512-TyfOi2XNdOZpNKeTJwRUsVAGa+14nkyMb2VVGG+eDgcWG/ed6+NUo72N3hT6QJioxym80NSinErD+LBRF0Ir1w==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.10.tgz", + "integrity": "sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -688,14 +689,14 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.9.tgz", - "integrity": "sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz", + "integrity": "sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -703,16 +704,16 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.10.tgz", - "integrity": "sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz", + "integrity": "sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", + "@aws-sdk/types": "^3.973.8", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -720,24 +721,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.28.tgz", - "integrity": "sha512-qJHcJQH9UNPUrnPlRtCozKjtqAaypQ5IgQxTNoPsVYIQeuwNIA8Rwt3NvGij1vCDYDfCmZaPLpnJEHlZXeFqmg==", + "version": "3.972.34", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.34.tgz", + "integrity": "sha512-/UL96JKjsjdodcRRMKl99tLQvK6Oi9ptLC9iU1yiTF/ruaDX0mtBBtnLNZDxIZRJOCVOtB49ed1YaTadqygk8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/types": "^3.973.7", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/types": "^3.973.8", "@aws-sdk/util-arn-parser": "^3.972.3", - "@smithy/core": "^3.23.14", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/signature-v4": "^5.3.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-middleware": "^4.2.13", - "@smithy/util-stream": "^4.5.22", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-stream": "^4.5.25", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -746,14 +747,14 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.9.tgz", - "integrity": "sha512-wSA2BR7L0CyBNDJeSrleIIzC+DzL93YNTdfU0KPGLiocK6YsRv1nPAzPF+BFSdcs0Qa5ku5Kcf4KvQcWwKGenQ==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.10.tgz", + "integrity": "sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -761,19 +762,19 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.29.tgz", - "integrity": "sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.35.tgz", + "integrity": "sha512-hOFWNOjVmOocpRlrU04nYxjMOeoe0Obu5AXEuhB8zblMCPl3cG1hdluQCZERRKFyhMQjwZnDbhSHjoMUjetFGw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/types": "^3.973.7", - "@aws-sdk/util-endpoints": "^3.996.6", - "@smithy/core": "^3.23.14", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", - "@smithy/util-retry": "^4.3.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.8", + "@smithy/core": "^3.23.17", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-retry": "^4.3.4", "tslib": "^2.6.2" }, "engines": { @@ -781,48 +782,49 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.19", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.19.tgz", - "integrity": "sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==", + "version": "3.997.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.3.tgz", + "integrity": "sha512-SivE6GP228IVgfsrr2c/vqTg95X0Qj39Yw4uIrcddpkUzIltNMoNOR62leHOLhODfjv9K8X2mPTwS69A5kT0nQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/middleware-host-header": "^3.972.9", - "@aws-sdk/middleware-logger": "^3.972.9", - "@aws-sdk/middleware-recursion-detection": "^3.972.10", - "@aws-sdk/middleware-user-agent": "^3.972.29", - "@aws-sdk/region-config-resolver": "^3.972.11", - "@aws-sdk/types": "^3.973.7", - "@aws-sdk/util-endpoints": "^3.996.6", - "@aws-sdk/util-user-agent-browser": "^3.972.9", - "@aws-sdk/util-user-agent-node": "^3.973.15", - "@smithy/config-resolver": "^4.4.14", - "@smithy/core": "^3.23.14", - "@smithy/fetch-http-handler": "^5.3.16", - "@smithy/hash-node": "^4.2.13", - "@smithy/invalid-dependency": "^4.2.13", - "@smithy/middleware-content-length": "^4.2.13", - "@smithy/middleware-endpoint": "^4.4.29", - "@smithy/middleware-retry": "^4.5.0", - "@smithy/middleware-serde": "^4.2.17", - "@smithy/middleware-stack": "^4.2.13", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/node-http-handler": "^4.5.2", - "@smithy/protocol-http": "^5.3.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", - "@smithy/url-parser": "^4.2.13", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/middleware-host-header": "^3.972.10", + "@aws-sdk/middleware-logger": "^3.972.10", + "@aws-sdk/middleware-recursion-detection": "^3.972.11", + "@aws-sdk/middleware-user-agent": "^3.972.35", + "@aws-sdk/region-config-resolver": "^3.972.13", + "@aws-sdk/signature-v4-multi-region": "^3.996.22", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.8", + "@aws-sdk/util-user-agent-browser": "^3.972.10", + "@aws-sdk/util-user-agent-node": "^3.973.21", + "@smithy/config-resolver": "^4.4.17", + "@smithy/core": "^3.23.17", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/hash-node": "^4.2.14", + "@smithy/invalid-dependency": "^4.2.14", + "@smithy/middleware-content-length": "^4.2.14", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-retry": "^4.5.5", + "@smithy/middleware-serde": "^4.2.20", + "@smithy/middleware-stack": "^4.2.14", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/protocol-http": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.45", - "@smithy/util-defaults-mode-node": "^4.2.49", - "@smithy/util-endpoints": "^3.3.4", - "@smithy/util-middleware": "^4.2.13", - "@smithy/util-retry": "^4.3.0", + "@smithy/util-defaults-mode-browser": "^4.3.49", + "@smithy/util-defaults-mode-node": "^4.2.54", + "@smithy/util-endpoints": "^3.4.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.4", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -831,16 +833,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.11.tgz", - "integrity": "sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz", + "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/config-resolver": "^4.4.14", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/config-resolver": "^4.4.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -848,17 +850,17 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.16.tgz", - "integrity": "sha512-EMdXYB4r/k5RWq86fugjRhid5JA+Z6MpS7n4sij4u5/C+STrkvuf9aFu41rJA9MjUzxCLzv8U2XL8cH2GSRYpQ==", + "version": "3.996.22", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.22.tgz", + "integrity": "sha512-/rXhMXteD+BqhFd0nYprAgcZ/KtU+963uftPqd3tiFcFfooHZINXUGtOmo2SQjRVauCTNqIEzkwuSETdZFqTTA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.28", - "@aws-sdk/types": "^3.973.7", - "@smithy/protocol-http": "^5.3.13", - "@smithy/signature-v4": "^5.3.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/middleware-sdk-s3": "^3.972.34", + "@aws-sdk/types": "^3.973.8", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -866,18 +868,18 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1026.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1026.0.tgz", - "integrity": "sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==", + "version": "3.1036.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1036.0.tgz", + "integrity": "sha512-aNSJ6jjDYayxN9ZA1JpycVScX93Lx03kKZ1EXt3DGOTahcWVLJj3oLAlop0xKP+vP2Ga2t49p1tEaMkTbCCaZA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.27", - "@aws-sdk/nested-clients": "^3.996.19", - "@aws-sdk/types": "^3.973.7", - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@aws-sdk/core": "^3.974.5", + "@aws-sdk/nested-clients": "^3.997.3", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -885,13 +887,13 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.7.tgz", - "integrity": "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==", + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -912,16 +914,16 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.6.tgz", - "integrity": "sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==", + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz", + "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/types": "^4.14.0", - "@smithy/url-parser": "^4.2.13", - "@smithy/util-endpoints": "^3.3.4", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-endpoints": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -942,29 +944,29 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.9.tgz", - "integrity": "sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz", + "integrity": "sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.7", - "@smithy/types": "^4.14.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.15", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.15.tgz", - "integrity": "sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==", + "version": "3.973.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.21.tgz", + "integrity": "sha512-Av4UHTcAWgdvbN0IP9pbtf4Qa1+6LtJqQdZWj5pLn5J67w0pnJJAZZ+7JPPcj2KN3378zD2JDM9DwJKEyvyMTQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.29", - "@aws-sdk/types": "^3.973.7", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/types": "^4.14.0", + "@aws-sdk/middleware-user-agent": "^3.972.35", + "@aws-sdk/types": "^3.973.8", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, @@ -981,14 +983,14 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.17.tgz", - "integrity": "sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==", + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.19.tgz", + "integrity": "sha512-Cw8IOMdBUEIl8ZlhRC3Dc/E64D5B5/8JhV6vhPLiPfJwcRC84S6F8aBOIi/N4vR9ZyA4I5Cc0Ateb/9EHaJXeQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", - "fast-xml-parser": "5.5.8", + "@smithy/types": "^4.14.1", + "fast-xml-parser": "5.7.1", "tslib": "^2.6.2" }, "engines": { @@ -1282,20 +1284,20 @@ } }, "node_modules/@contentstack/cli-cm-export": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-cm-export/-/cli-cm-export-1.24.1.tgz", - "integrity": "sha512-zTaun28JcIjT88NCi+p1gZabZVkJO6bQLOBs+QGHPOUxRBn5t++AYOuomm7iA1ZJAzsfMN5FF1lWRuRZ2qPf2A==", + "version": "2.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@contentstack/cli-cm-export/-/cli-cm-export-2.0.0-beta.15.tgz", + "integrity": "sha512-ATF8KjrdCmfyvH1YwoLuMPvYqdaPPKBB0P2EtZifZpkdOhkt3bmhXj29tfgr1o9mQVob3i9LEtOhCaBWUOC/kA==", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "~1.8.0", - "@contentstack/cli-utilities": "~1.18.0", - "@contentstack/cli-variants": "~1.4.0", - "@oclif/core": "^4.3.3", + "@contentstack/cli-command": "~2.0.0-beta.6", + "@contentstack/cli-utilities": "~2.0.0-beta.7", + "@contentstack/cli-variants": "~2.0.0-beta.12", + "@oclif/core": "^4.8.0", "async": "^3.2.6", "big-json": "^3.2.0", "bluebird": "^3.7.2", - "chalk": "^4.1.2", - "lodash": "4.18.1", + "chalk": "^5.6.2", + "lodash": "^4.18.1", "merge": "^2.1.1", "mkdirp": "^1.0.4", "progress-stream": "^2.0.0", @@ -1306,16 +1308,28 @@ "node": ">=14.0.0" } }, + "node_modules/@contentstack/cli-cm-export/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@contentstack/cli-command": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@contentstack/cli-command/-/cli-command-1.8.0.tgz", - "integrity": "sha512-JsOVaz7jBUMeul04DZagSlS74tsIyz/f0NmsHPsr9WV+u3fRO90ilRUG1SKrreUGa7x31gIU0CB5riQeu+TXYg==", + "version": "2.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@contentstack/cli-command/-/cli-command-2.0.0-beta.6.tgz", + "integrity": "sha512-T0RZpjHwNRpSHbZuveTUj7o4eranLMCqQ1BQf0wkUGFxqlg2WnjRlb6oQ1wVqMak9CYe9edfdsdHjIBOYeLmAA==", "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "~1.18.0", - "@oclif/core": "^4.8.3", - "@oclif/plugin-help": "^6.2.28", - "contentstack": "^3.25.3" + "@contentstack/cli-utilities": "~2.0.0-beta.7", + "@oclif/core": "^4.10.5", + "@oclif/plugin-help": "^6.2.44", + "contentstack": "^3.27.0" }, "engines": { "node": ">=14.0.0" @@ -1335,23 +1349,23 @@ } }, "node_modules/@contentstack/cli-utilities": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.18.1.tgz", - "integrity": "sha512-1ymPu5HbOXFdDJHJFiwtT1yVNpmDOgMH8qqCeP3kjS7ED1+rz7Q3cWPnJC9FlUfvFeOAyJaJPPQCiYd0lgujtw==", + "version": "2.0.0-beta.7", + "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-2.0.0-beta.7.tgz", + "integrity": "sha512-V0ooac32Krs5j+yS5mccGGjg+3blTt1P3xuqM0LlPfTmX3JWnQYgFZEBYE4yr4GHTFAIqog5xM5zQKjyM/KMpA==", "license": "MIT", "dependencies": { - "@contentstack/management": "~1.27.5", - "@contentstack/marketplace-sdk": "^1.5.0", - "@oclif/core": "^4.8.3", - "axios": "^1.13.5", - "chalk": "^4.1.2", + "@contentstack/management": "~1.30.1", + "@contentstack/marketplace-sdk": "^1.5.1", + "@oclif/core": "^4.10.5", + "axios": "^1.15.0", + "chalk": "^5.6.2", "cli-cursor": "^3.1.0", "cli-progress": "^3.12.0", "cli-table": "^0.3.11", "conf": "^10.2.0", "dotenv": "^16.6.1", "figures": "^3.2.0", - "inquirer": "8.2.7", + "inquirer": "12.11.1", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "js-yaml": "^4.1.1", @@ -1361,45 +1375,57 @@ "open": "^8.4.2", "ora": "^5.4.1", "papaparse": "^5.5.3", - "recheck": "~4.4.5", + "recheck": "~4.5.0", "rxjs": "^6.6.7", "traverse": "^0.6.11", "tty-table": "^4.2.3", "unique-string": "^2.0.0", "uuid": "^9.0.1", - "winston": "^3.17.0", + "winston": "^3.19.0", "xdg-basedir": "^4.0.0" } }, + "node_modules/@contentstack/cli-utilities/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@contentstack/cli-variants": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-variants/-/cli-variants-1.4.1.tgz", - "integrity": "sha512-iLl1QFeVLIxJGRSbBoTXp3OyfujBj74zj47yzQKo6eSUMBF4Eelb75zFrQlx2gI3UQY9hRX1KnAtqcfRk7jGmg==", + "version": "2.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@contentstack/cli-variants/-/cli-variants-2.0.0-beta.12.tgz", + "integrity": "sha512-JRCe7dyWm2DZnzr1OPFzkEJ8LNfyfeSr8w2d2lZSoeNXD1P55fFCLq4hYHcyYXT7rf/xvylIyu4AHm0wrt0v0Q==", "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "~1.18.0", + "@contentstack/cli-utilities": "~2.0.0-beta.7", "@oclif/core": "^4.3.0", "@oclif/plugin-help": "^6.2.28", - "lodash": "4.18.1", + "lodash": "^4.18.1", "mkdirp": "^1.0.4", "winston": "^3.17.0" } }, "node_modules/@contentstack/management": { - "version": "1.27.6", - "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.27.6.tgz", - "integrity": "sha512-92h8YzKZ2EDzMogf0fmBHapCjVpzHkDBIj0Eb/MhPFIhlybDlAZhcM/di6zwgicEJj5UjTJ+ETXXQMEJZouDew==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.30.1.tgz", + "integrity": "sha512-rwceQJ78/yRORDwlq+vO5ge5C02YIfiHvCPxpJXA/UJwHTuwehkMH6wQzFdBHnWItQU+ymT4oN9lX1uA31V52A==", "license": "MIT", "dependencies": { - "@contentstack/utils": "^1.7.0", + "@contentstack/utils": "^1.9.1", "assert": "^2.1.0", - "axios": "^1.13.5", + "axios": "^1.15.0", "buffer": "^6.0.3", "form-data": "^4.0.5", "husky": "^9.1.7", - "lodash": "^4.17.23", + "lodash": "^4.18.1", "otplib": "^12.0.1", - "qs": "^6.15.0", + "qs": "^6.15.1", "stream-browserify": "^3.0.0" }, "engines": { @@ -1407,13 +1433,13 @@ } }, "node_modules/@contentstack/marketplace-sdk": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.5.0.tgz", - "integrity": "sha512-n2USMwswXBDtmVOg0t5FUks8X0d49u0UDFSrwxti09X/SONeP0P8wSqIDCjoB2gGRQc6fg/Fg2YPRvejUWeR4A==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.5.1.tgz", + "integrity": "sha512-XoQODTWZ4cQeo7iIAcYcYLX9bSHvgeF1J230GTM2dVhN3w9aTylZ35zZttvsa76fDZWgRmZBO5AE99dVVq7xyA==", "license": "MIT", "dependencies": { - "@contentstack/utils": "^1.6.3", - "axios": "^1.13.2" + "@contentstack/utils": "^1.9.1", + "axios": "^1.15.0" } }, "node_modules/@contentstack/utils": { @@ -1458,9 +1484,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", "optional": true, @@ -1470,9 +1496,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -1559,47 +1585,47 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.5" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "*" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/core": "^0.17.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { @@ -1709,9 +1735,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1799,57 +1825,86 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -1930,7 +1985,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -1940,7 +1994,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -1965,7 +2018,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -1993,7 +2045,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2011,27 +2062,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/checkbox/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/checkbox/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2044,7 +2083,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2168,7 +2206,6 @@ "version": "4.2.23", "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2191,7 +2228,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2219,7 +2255,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2237,27 +2272,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/editor/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/editor/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2270,7 +2293,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2285,7 +2307,6 @@ "version": "4.0.23", "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2308,7 +2329,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2336,7 +2356,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2354,27 +2373,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/expand/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/expand/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2387,7 +2394,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2423,7 +2429,6 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2447,7 +2452,6 @@ "version": "3.0.23", "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2469,7 +2473,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2497,7 +2500,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2515,27 +2517,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/number/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/number/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2548,7 +2538,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2563,7 +2552,6 @@ "version": "4.0.23", "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2586,7 +2574,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2614,7 +2601,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2632,27 +2618,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/password/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/password/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2665,7 +2639,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2680,7 +2653,6 @@ "version": "7.10.1", "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/checkbox": "^4.3.2", @@ -2710,7 +2682,6 @@ "version": "5.1.21", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2732,7 +2703,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2760,7 +2730,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2782,7 +2751,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2807,7 +2775,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2825,27 +2792,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/prompts/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/prompts/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2858,7 +2813,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2873,7 +2827,6 @@ "version": "4.1.11", "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -2896,7 +2849,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -2924,7 +2876,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2942,27 +2893,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/rawlist/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/rawlist/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -2975,7 +2914,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -2990,7 +2928,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -3014,7 +2951,6 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -3042,7 +2978,6 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -3060,27 +2995,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, "license": "ISC", "engines": { "node": ">= 12" } }, - "node_modules/@inquirer/search/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/@inquirer/search/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -3093,7 +3016,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3324,6 +3246,19 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3373,9 +3308,9 @@ } }, "node_modules/@oclif/core": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.5.tgz", - "integrity": "sha512-qcdCF7NrdWPfme6Kr34wwljRCXbCVpL1WVxiNy0Ep6vbWKjxAjFQwuhqkoyL0yjI+KdwtLcOCGn5z2yzdijc8w==", + "version": "4.10.6", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.6.tgz", + "integrity": "sha512-ySCOYnPKZE3KACT1V9It99hWG9b8E5MpagbRdWxPNRO3beMqmbr4SLUQoFtZ9XRtW++kks1ZVwZOdpnR8rpb9A==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", @@ -3402,9 +3337,9 @@ } }, "node_modules/@oclif/plugin-help": { - "version": "6.2.44", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.44.tgz", - "integrity": "sha512-x03Se2LtlOOlGfTuuubt5C4Z8NHeR4zKXtVnfycuLU+2VOMu2WpsGy9nbs3nYuInuvsIY1BizjVaTjUz060Sig==", + "version": "6.2.45", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.45.tgz", + "integrity": "sha512-avWOKYmjANtyu8ipju/kopIIrSrbS/scJjiZTpBp/HKEHNm46v5riOo5LQj6MZ4bYJVQEoyHPg/2Seig5Ilkjw==", "license": "MIT", "dependencies": { "@oclif/core": "^4" @@ -3414,14 +3349,14 @@ } }, "node_modules/@oclif/plugin-not-found": { - "version": "3.2.80", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.80.tgz", - "integrity": "sha512-yTLjWvR1r/Rd/cO2LxHdMCDoL5sQhBYRUcOMCmxZtWVWhx4rAZ8KVUPDVsb+SvjJDV5ADTDBgt1H52fFx7YWqg==", + "version": "3.2.81", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.81.tgz", + "integrity": "sha512-M88tLONBH36hLAbkFbmCo1hoZPSdU5l8Px1xEIlIgSmGMam+CoAzx4kGqpLbokgfpaHeP8/Jx3QJ18u9ef/2Qw==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/prompts": "^7.10.1", - "@oclif/core": "^4.10.5", + "@oclif/core": "^4.10.6", "ansis": "^3.17.0", "fast-levenshtein": "^3.0.0" }, @@ -3430,9 +3365,9 @@ } }, "node_modules/@oclif/plugin-warn-if-update-available": { - "version": "3.1.60", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.60.tgz", - "integrity": "sha512-cRKBZm14IuA6G8W84dfd3iXj3BTAoxQ5o3pUE8DKEQ4n/tVha20t5nkVeD+ISC68e0Fuw5koTMvRwXb1lJSnzg==", + "version": "3.1.61", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.61.tgz", + "integrity": "sha512-4XcrTxcCs+brR/eZ0BPeuiREiH3USlJiaHbUqPhnIBuyxhhUSYVd8ZO6s5MQN7AXJq4SMQ+B5zLaHq+ep/afIw==", "dev": true, "license": "MIT", "dependencies": { @@ -3514,6 +3449,18 @@ "@otplib/plugin-thirty-two": "^12.0.1" } }, + "node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -3656,17 +3603,17 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.15", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.15.tgz", - "integrity": "sha512-BJdMBY5YO9iHh+lPLYdHv6LbX+J8IcPCYMl1IJdBt2KDWNHwONHrPVHk3ttYBqJd9wxv84wlbN0f7GlQzcQtNQ==", + "version": "4.4.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz", + "integrity": "sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.13", - "@smithy/types": "^4.14.0", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.4.0", - "@smithy/util-middleware": "^4.2.13", + "@smithy/util-endpoints": "^3.4.2", + "@smithy/util-middleware": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -3674,19 +3621,19 @@ } }, "node_modules/@smithy/core": { - "version": "3.23.14", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.14.tgz", - "integrity": "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==", + "version": "3.23.17", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.17.tgz", + "integrity": "sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", - "@smithy/url-parser": "^4.2.13", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.13", - "@smithy/util-stream": "^4.5.22", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-stream": "^4.5.25", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" @@ -3696,16 +3643,16 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz", - "integrity": "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz", + "integrity": "sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.13", - "@smithy/property-provider": "^4.2.13", - "@smithy/types": "^4.14.0", - "@smithy/url-parser": "^4.2.13", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -3713,14 +3660,14 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.13.tgz", - "integrity": "sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", + "integrity": "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" }, @@ -3729,14 +3676,14 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.13.tgz", - "integrity": "sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.14.tgz", + "integrity": "sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/eventstream-serde-universal": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3744,13 +3691,13 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.13.tgz", - "integrity": "sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==", + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.14.tgz", + "integrity": "sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3758,14 +3705,14 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.13.tgz", - "integrity": "sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.14.tgz", + "integrity": "sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/eventstream-serde-universal": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3773,14 +3720,14 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.13.tgz", - "integrity": "sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.14.tgz", + "integrity": "sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/eventstream-codec": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3788,15 +3735,15 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz", - "integrity": "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==", + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz", + "integrity": "sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.13", - "@smithy/querystring-builder": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/querystring-builder": "^4.2.14", + "@smithy/types": "^4.14.1", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, @@ -3805,15 +3752,15 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.14.tgz", - "integrity": "sha512-rtQ5es8r/5v4rav7q5QTsfx9CtCyzrz/g7ZZZBH2xtMmd6G/KQrLOWfSHTvFOUPlVy59RQvxeBYJaLRoybMEyA==", + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.15.tgz", + "integrity": "sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", "@smithy/chunked-blob-reader-native": "^4.2.3", - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3821,13 +3768,13 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.13.tgz", - "integrity": "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.14.tgz", + "integrity": "sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -3837,13 +3784,13 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.13.tgz", - "integrity": "sha512-WdQ7HwUjINXETeh6dqUeob1UHIYx8kAn9PSp1HhM2WWegiZBYVy2WXIs1lB07SZLan/udys9SBnQGt9MQbDpdg==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.14.tgz", + "integrity": "sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -3852,13 +3799,13 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz", - "integrity": "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz", + "integrity": "sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3879,13 +3826,13 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.13.tgz", - "integrity": "sha512-cNm7I9NXolFxtS20ojROddOEpSAeI1Obq6pd1Kj5HtHws3s9Fkk8DdHDfQSs5KuxCewZuVK6UqrJnfJmiMzDuQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.14.tgz", + "integrity": "sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -3894,14 +3841,14 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz", - "integrity": "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz", + "integrity": "sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3909,19 +3856,19 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.29", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz", - "integrity": "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==", + "version": "4.4.32", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.32.tgz", + "integrity": "sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.14", - "@smithy/middleware-serde": "^4.2.17", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", - "@smithy/url-parser": "^4.2.13", - "@smithy/util-middleware": "^4.2.13", + "@smithy/core": "^3.23.17", + "@smithy/middleware-serde": "^4.2.20", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-middleware": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -3929,20 +3876,20 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.1.tgz", - "integrity": "sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.5.tgz", + "integrity": "sha512-wnYOpB5vATFKWrY2Z9Alb0KhjZI6AbzU6Fbz3Hq2GnURdRYWB4q+qWivQtSTwXcmWUA3MZ6krfwL6Cq5MAbxsA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.14", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/service-error-classification": "^4.2.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", - "@smithy/util-middleware": "^4.2.13", - "@smithy/util-retry": "^4.3.1", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/service-error-classification": "^4.3.0", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.4", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, @@ -3951,15 +3898,15 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz", - "integrity": "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.20.tgz", + "integrity": "sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.14", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@smithy/core": "^3.23.17", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3967,13 +3914,13 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz", - "integrity": "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.14.tgz", + "integrity": "sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3981,15 +3928,15 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.13", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz", - "integrity": "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==", + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.14.tgz", + "integrity": "sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.13", - "@smithy/shared-ini-file-loader": "^4.4.8", - "@smithy/types": "^4.14.0", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -3997,15 +3944,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz", - "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz", + "integrity": "sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.13", - "@smithy/querystring-builder": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/querystring-builder": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4013,13 +3960,13 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.13.tgz", - "integrity": "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.14.tgz", + "integrity": "sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4027,13 +3974,13 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.13", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", - "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.14.tgz", + "integrity": "sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4041,13 +3988,13 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz", - "integrity": "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz", + "integrity": "sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" }, @@ -4056,13 +4003,13 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz", - "integrity": "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz", + "integrity": "sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4070,26 +4017,26 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz", - "integrity": "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.3.0.tgz", + "integrity": "sha512-9jKsBYQRPR0xBLgc2415RsA5PIcP2sis4oBdN9s0D13cg1B1284mNTjx9Yc+BEERXzuPm5ObktI96OxsKh8E9A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0" + "@smithy/types": "^4.14.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz", - "integrity": "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.9.tgz", + "integrity": "sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4097,17 +4044,17 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.13", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz", - "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.14.tgz", + "integrity": "sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.13", + "@smithy/util-middleware": "^4.2.14", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -4117,18 +4064,18 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.12.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.9.tgz", - "integrity": "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==", + "version": "4.12.13", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.13.tgz", + "integrity": "sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.14", - "@smithy/middleware-endpoint": "^4.4.29", - "@smithy/middleware-stack": "^4.2.13", - "@smithy/protocol-http": "^5.3.13", - "@smithy/types": "^4.14.0", - "@smithy/util-stream": "^4.5.22", + "@smithy/core": "^3.23.17", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-stack": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-stream": "^4.5.25", "tslib": "^2.6.2" }, "engines": { @@ -4136,9 +4083,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.0.tgz", - "integrity": "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", + "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4149,14 +4096,14 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.13.tgz", - "integrity": "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.14.tgz", + "integrity": "sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/querystring-parser": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4232,15 +4179,15 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.45", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz", - "integrity": "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==", + "version": "4.3.49", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.49.tgz", + "integrity": "sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", + "@smithy/property-provider": "^4.2.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4248,18 +4195,18 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.50", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.50.tgz", - "integrity": "sha512-xpjncL5XozFA3No7WypTsPU1du0fFS8flIyO+Wh2nhCy7bpEapvU7BR55Bg+wrfw+1cRA+8G8UsTjaxgzrMzXg==", + "version": "4.2.54", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.54.tgz", + "integrity": "sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.15", - "@smithy/credential-provider-imds": "^4.2.13", - "@smithy/node-config-provider": "^4.3.13", - "@smithy/property-provider": "^4.2.13", - "@smithy/smithy-client": "^4.12.9", - "@smithy/types": "^4.14.0", + "@smithy/config-resolver": "^4.4.17", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4267,14 +4214,14 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.0.tgz", - "integrity": "sha512-QQHGPKkw6NPcU6TJ1rNEEa201srPtZiX4k61xL163vvs9sTqW/XKz+UEuJ00uvPqoN+5Rs4Ka1UJ7+Mp03IXJw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.2.tgz", + "integrity": "sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.13", - "@smithy/types": "^4.14.0", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4295,13 +4242,13 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.13.tgz", - "integrity": "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.14.tgz", + "integrity": "sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4309,14 +4256,14 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.1.tgz", - "integrity": "sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.4.tgz", + "integrity": "sha512-FY1UQQ1VFmMwiYp1GVS4MeaGD5O0blLNYK0xCRHU+mJgeoH/hSY8Ld8sJWKQ6uznkh14HveRGQJncgPyNl9J+A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.13", - "@smithy/types": "^4.14.0", + "@smithy/service-error-classification": "^4.3.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4324,15 +4271,15 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.22", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.22.tgz", - "integrity": "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==", + "version": "4.5.25", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.25.tgz", + "integrity": "sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.16", - "@smithy/node-http-handler": "^4.5.2", - "@smithy/types": "^4.14.0", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/types": "^4.14.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", @@ -4371,13 +4318,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.2.15", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.15.tgz", - "integrity": "sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg==", + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.16.tgz", + "integrity": "sha512-GtclrKoZ3Lt7jPQ7aTIYKfjY92OgceScftVnkTsG8e1KV8rkvZgN+ny6YSRhd9hxB8rZtwVbmln7NTvE5O3GmQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.14.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -4527,6 +4474,14 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -4647,17 +4602,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz", - "integrity": "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/type-utils": "8.58.2", - "@typescript-eslint/utils": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/type-utils": "8.59.0", + "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -4670,7 +4625,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.2", + "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -4686,16 +4641,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.2.tgz", - "integrity": "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", + "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "engines": { @@ -4711,14 +4666,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", - "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.2", - "@typescript-eslint/types": "^8.58.2", + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "engines": { @@ -4733,14 +4688,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", - "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2" + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4751,9 +4706,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", - "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", "dev": true, "license": "MIT", "engines": { @@ -4768,15 +4723,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.2.tgz", - "integrity": "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/utils": "8.58.2", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -4793,9 +4748,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", - "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -4807,16 +4762,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", - "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.2", - "@typescript-eslint/tsconfig-utils": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -4835,16 +4790,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz", - "integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2" + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4859,13 +4814,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", - "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -5226,9 +5181,9 @@ } }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -5593,9 +5548,9 @@ } }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -5633,9 +5588,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz", - "integrity": "sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==", + "version": "2.10.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", + "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5979,9 +5934,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001788", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", - "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "dev": true, "funding": [ { @@ -6238,13 +6193,10 @@ } }, "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "license": "ISC", - "engines": { - "node": ">= 10" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" }, "node_modules/cliui": { "version": "7.0.4", @@ -6906,9 +6858,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.336", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.336.tgz", - "integrity": "sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==", + "version": "1.5.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", "dev": true, "license": "ISC" }, @@ -6925,14 +6877,14 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -7207,9 +7159,9 @@ } }, "node_modules/eslint-config-oclif": { - "version": "6.0.157", - "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-6.0.157.tgz", - "integrity": "sha512-Kt4MBzjWY4FLJgVeMsG4oZwmWbkQuqQioKtnXp9RDb6LR472Isr9yAfuLEsNTZMXfYEv5lsTv2zyg619HkL19Q==", + "version": "6.0.160", + "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-6.0.160.tgz", + "integrity": "sha512-ObWYOTSLk60UdQkJNTDzh7vVQpPtysz8O4Wwf6Ui7+DJErVjCdaYB0F5qAaOoUr2Jq3hnukO0Hh0PY6rAfG9yw==", "dev": true, "license": "MIT", "dependencies": { @@ -7229,12 +7181,26 @@ "eslint-plugin-n": "^17.24.0", "eslint-plugin-perfectionist": "^4", "eslint-plugin-unicorn": "^56.0.1", - "typescript-eslint": "^8.58.1" + "typescript-eslint": "^8.59.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/eslint-config-oclif/node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, "node_modules/eslint-config-oclif/node_modules/@eslint/eslintrc": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", @@ -7253,10 +7219,23 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-oclif/node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/eslint-config-oclif/node_modules/@eslint/js": { @@ -7273,9 +7252,9 @@ } }, "node_modules/eslint-config-oclif/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -7306,34 +7285,31 @@ } }, "node_modules/eslint-config-oclif/node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", - "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -7343,8 +7319,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -7352,7 +7327,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -7441,6 +7416,19 @@ "eslint": ">=8.44.0" } }, + "node_modules/eslint-config-oclif/node_modules/eslint-config-oclif/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-config-oclif/node_modules/eslint-config-xo": { "version": "0.49.0", "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.49.0.tgz", @@ -7485,6 +7473,19 @@ "eslint": "^9.0.0 || ^10.0.0" } }, + "node_modules/eslint-config-oclif/node_modules/eslint-config-xo/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-config-oclif/node_modules/eslint-config-xo/node_modules/globals": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", @@ -7499,31 +7500,53 @@ } }, "node_modules/eslint-config-oclif/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-oclif/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-oclif/node_modules/eslint/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7547,6 +7570,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-oclif/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-config-oclif/node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -7596,19 +7632,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint-config-oclif/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-config-oclif/node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -8141,9 +8164,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -8348,9 +8371,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", + "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", "dev": true, "funding": [ { @@ -8364,9 +8387,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.8", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz", - "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.1.tgz", + "integrity": "sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==", "dev": true, "funding": [ { @@ -8376,9 +8399,10 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.0", - "strnum": "^2.2.0" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -9187,9 +9211,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -9408,29 +9432,29 @@ "license": "ISC" }, "node_modules/inquirer": { - "version": "8.2.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", - "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", + "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", "license": "MIT", "dependencies": { - "@inquirer/external-editor": "^1.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/prompts": "^7.10.1", + "@inquirer/type": "^3.0.10", + "mute-stream": "^2.0.0", + "run-async": "^4.0.6", + "rxjs": "^7.8.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/inquirer-search-checkbox": { @@ -9501,12 +9525,6 @@ "node": ">=4" } }, - "node_modules/inquirer-search-checkbox/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" - }, "node_modules/inquirer-search-checkbox/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -9623,6 +9641,15 @@ "node": ">=4" } }, + "node_modules/inquirer-search-checkbox/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/inquirer-search-checkbox/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -9728,12 +9755,6 @@ "node": ">=4" } }, - "node_modules/inquirer-search-list/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" - }, "node_modules/inquirer-search-list/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -9850,6 +9871,15 @@ "node": ">=4" } }, + "node_modules/inquirer-search-list/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/inquirer-search-list/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -9887,6 +9917,59 @@ "node": ">=4" } }, + "node_modules/inquirer/node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/inquirer/node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/inquirer/node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -9896,6 +9979,18 @@ "tslib": "^2.1.0" } }, + "node_modules/inquirer/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/inquirer/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -11276,10 +11371,13 @@ "license": "MIT" }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/napi-postinstall": { "version": "0.3.4", @@ -11397,9 +11495,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "dev": true, "license": "MIT" }, @@ -12794,31 +12892,35 @@ } }, "node_modules/recheck": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/recheck/-/recheck-4.4.5.tgz", - "integrity": "sha512-J80Ykhr+xxWtvWrfZfPpOR/iw2ijvb4WY8d9AVoN8oHsPP07JT1rCAalUSACMGxM1cvSocb6jppWFjVS6eTTrA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck/-/recheck-4.5.0.tgz", + "integrity": "sha512-kPnbOV6Zfx9a25AZ++28fI1q78L/UVRQmmuazwVRPfiiqpMs+WbOU69Shx820XgfKWfak0JH75PUvZMFtRGSsw==", "license": "MIT", + "dependencies": { + "synckit": "0.9.2" + }, "engines": { - "node": ">=14" + "node": ">=20" }, "optionalDependencies": { - "recheck-jar": "4.4.5", - "recheck-linux-x64": "4.4.5", - "recheck-macos-x64": "4.4.5", - "recheck-windows-x64": "4.4.5" + "recheck-jar": "4.5.0", + "recheck-linux-x64": "4.5.0", + "recheck-macos-arm64": "4.5.0", + "recheck-macos-x64": "4.5.0", + "recheck-windows-x64": "4.5.0" } }, "node_modules/recheck-jar": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/recheck-jar/-/recheck-jar-4.4.5.tgz", - "integrity": "sha512-a2kMzcfr+ntT0bObNLY22EUNV6Z6WeZ+DybRmPOUXVWzGcqhRcrK74tpgrYt3FdzTlSh85pqoryAPmrNkwLc0g==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck-jar/-/recheck-jar-4.5.0.tgz", + "integrity": "sha512-Ad7oCQmY8cQLzd3QVNXjzZ+S6MbImGhR4AaW2yiGzteOfMV45522rt6nSzFyt8p3mCEaMcm/4MoZrMSxUcCbrA==", "license": "MIT", "optional": true }, "node_modules/recheck-linux-x64": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/recheck-linux-x64/-/recheck-linux-x64-4.4.5.tgz", - "integrity": "sha512-s8OVPCpiSGw+tLCxH3eei7Zp2AoL22kXqLmEtWXi0AnYNwfuTjZmeLn2aQjW8qhs8ZPSkxS7uRIRTeZqR5Fv/Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck-linux-x64/-/recheck-linux-x64-4.5.0.tgz", + "integrity": "sha512-52kXsR/v+IbGIKYYFZfSZcgse/Ci9IA2HnuzrtvRRcfODkcUGe4n72ESQ8nOPwrdHFg9i4j9/YyPh1HWWgpJ6A==", "cpu": [ "x64" ], @@ -12828,10 +12930,23 @@ "linux" ] }, + "node_modules/recheck-macos-arm64": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck-macos-arm64/-/recheck-macos-arm64-4.5.0.tgz", + "integrity": "sha512-qIyK3dRuLkORQvv0b59fZZRXweSmjjWaoA4K8Kgifz0anMBH4pqsDV6plBlgjcRmW9yC12wErIRzifREaKnk2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/recheck-macos-x64": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/recheck-macos-x64/-/recheck-macos-x64-4.4.5.tgz", - "integrity": "sha512-Ouup9JwwoKCDclt3Na8+/W2pVbt8FRpzjkDuyM32qTR2TOid1NI+P1GA6/VQAKEOjvaxgGjxhcP/WqAjN+EULA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck-macos-x64/-/recheck-macos-x64-4.5.0.tgz", + "integrity": "sha512-1wp/eiLxcjC/Ex4wurlrS/LGzt8IiF4TiK5sEjldu4HVAKdNCnnmsS9a5vFpfcikDz4ZuZlLlTi1VbQTxHlwZg==", "cpu": [ "x64" ], @@ -12842,9 +12957,9 @@ ] }, "node_modules/recheck-windows-x64": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/recheck-windows-x64/-/recheck-windows-x64-4.4.5.tgz", - "integrity": "sha512-mkpzLHu9G9Ztjx8HssJh9k/Xm1d1d/4OoT7etHqFk+k1NGzISCRXBD22DqYF9w8+J4QEzTAoDf8icFt0IGhOEQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/recheck-windows-x64/-/recheck-windows-x64-4.5.0.tgz", + "integrity": "sha512-ekBKwAp0oKkMULn5zgmHEYLwSJfkfb95AbTtbDkQazNkqYw9PRD/mVyFUR6Ff2IeRyZI0gxy+N2AKBISWydhug==", "cpu": [ "x64" ], @@ -13145,9 +13260,9 @@ } }, "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -13209,14 +13324,14 @@ "license": "0BSD" }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -14031,10 +14146,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -14569,16 +14700,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.2.tgz", - "integrity": "sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", + "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.58.2", - "@typescript-eslint/parser": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/utils": "8.58.2" + "@typescript-eslint/eslint-plugin": "8.59.0", + "@typescript-eslint/parser": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0", + "@typescript-eslint/utils": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15205,7 +15336,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" diff --git a/package.json b/package.json index 1e3914f..9cd49ec 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-export-query", "description": "Contentstack CLI plugin to export content from stack", - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-cm-export": "~1.24.1", - "@contentstack/cli-command": "~1.8.0", - "@contentstack/cli-utilities": "~1.18.1", + "@contentstack/cli-cm-export": "~2.0.0-beta.14", + "@contentstack/cli-command": "~2.0.0-beta.5", + "@contentstack/cli-utilities": "~2.0.0-beta.7", "@oclif/core": "^4.10.5", "async": "^3.2.6", "big-json": "^3.2.0", diff --git a/skills/README.md b/skills/README.md index 19a19d6..7811571 100644 --- a/skills/README.md +++ b/skills/README.md @@ -1,24 +1,3 @@ -# Skills +# Skills – CLI export-query -Reusable agent guidance for **`@contentstack/cli-cm-export-query`** (query-based stack export). Use with any tool that supports file references. - -## Quick reference - -| Skill | Use when | -|-------|----------| -| **contentstack-cli** | Command, `QueryExporter`, utilities, Contentstack APIs | -| **testing** | Mocha, Chai, Sinon, TDD, coverage | -| **framework** | Config, logging, errors, shared utilities | -| **code-review** | PR / change review | - -## How to reference - -``` -Follow @skills/contentstack-cli and @skills/testing for this change. -``` - -## Project context - -- **Stack:** TypeScript, OCLIF (via `@contentstack/cli-command`), Contentstack CLI utilities, Mocha / Chai / Sinon, nyc -- **Layout:** `src/commands/` → `src/core/` (`QueryExporter`, `ModuleExporter`) → `src/utils/` -- **Tests:** `test/unit/**/*.test.ts` +Source of truth for detailed guidance. Read [AGENTS.md](../AGENTS.md) for the skill index, then open the `SKILL.md` that matches your task. Each folder contains `SKILL.md` with YAML frontmatter (`name`, `description`). diff --git a/skills/code-review/SKILL.md b/skills/code-review/SKILL.md index 160c8e7..ad0a78e 100644 --- a/skills/code-review/SKILL.md +++ b/skills/code-review/SKILL.md @@ -5,28 +5,9 @@ description: PR review checklist for this repo and similar CLI plugins. Use when # Code Review Skill -## Quick Reference +Use the **Quick checklist template** for a short PR paste. Numbered sections **1**–**7** and **Review checklist summary** below are the full deep review for **`@contentstack/cli-cm-export-query`** and related CLI work. -For comprehensive review guidelines, see: -- **[Code Review Checklist](./references/code-review-checklist.md)** - Complete PR review guidelines with severity levels and checklists - -## Review Process - -### Severity Levels -- 🔴 **Critical**: Must fix before merge (security, correctness, breaking changes) -- 🟡 **Important**: Should fix (performance, maintainability, best practices) -- 🟢 **Suggestion**: Consider improving (style, optimization, readability) - -### Quick Review Categories - -1. **Security** - No hardcoded secrets, input validation, secure error handling -2. **Correctness** - Logic validation, error scenarios, data integrity -3. **Architecture** - Code organization, design patterns, modularity -4. **Performance** - Efficiency, resource management, concurrency -5. **Testing** - Test coverage (aspirational targets), quality tests, sensible TDD when adding behavior -6. **Conventions** - TypeScript standards, code style, documentation - -## Quick Checklist Template +## Quick checklist template ```markdown ## Security Review @@ -60,6 +41,164 @@ For comprehensive review guidelines, see: - [ ] Documentation adequate ``` -## Usage - -This skill provides Cursor-specific PR review automation. Reference the universal code review checklist above for detailed guidelines, common issues, and review best practices that work with any AI agent. \ No newline at end of file +## 1. Security Review + +### Authentication & Authorization +- [ ] No hardcoded API keys, tokens, or credentials +- [ ] Sensitive data not logged to console or files +- [ ] Proper token validation and expiration handling +- [ ] Environment variables used for secrets + +### Input Validation +- [ ] All user inputs validated and sanitized +- [ ] Command flags properly validated +- [ ] File paths sanitized to prevent directory traversal +- [ ] API responses validated before processing + +### Error Handling +- [ ] Errors don't expose sensitive information +- [ ] Stack traces filtered in production +- [ ] Proper error logging without secrets + +## 2. Correctness Review + +### Logic Validation +- [ ] Business logic correctly implemented +- [ ] Edge cases handled appropriately +- [ ] Null/undefined checks in place +- [ ] Async operations properly awaited + +### Error Scenarios +- [ ] Network failures handled gracefully +- [ ] Rate limiting respected and handled +- [ ] Partial failures in batch operations managed +- [ ] Retry logic implemented correctly + +### Data Integrity +- [ ] Data transformations are reversible where needed +- [ ] Batch operations maintain consistency +- [ ] Rollback mechanisms for critical operations +- [ ] Proper validation before destructive operations + +## 3. Architecture Review + +### Code Organization +- [ ] Proper separation of concerns (Commands → Services → Utils) +- [ ] Single responsibility principle followed +- [ ] Dependencies injected, not hardcoded +- [ ] Interfaces used for abstractions + +### Design Patterns +- [ ] Consistent error handling patterns +- [ ] Proper use of async/await +- [ ] Service layer properly abstracted +- [ ] Configuration management centralized + +### Modularity +- [ ] Functions are focused and testable +- [ ] Classes have clear responsibilities +- [ ] Modules are loosely coupled +- [ ] Common functionality extracted to utilities + +## 4. Performance Review + +### Efficiency +- [ ] Unnecessary API calls eliminated +- [ ] Export/query work batched or paginated where the Management API requires it +- [ ] Proper pagination implemented when listing large result sets +- [ ] Rate limiting respected + +### Resource Management +- [ ] Memory usage optimized for large datasets +- [ ] File handles properly closed +- [ ] Network connections cleaned up +- [ ] No memory leaks in long-running operations + +### Concurrency +- [ ] Appropriate concurrency limits set +- [ ] Race conditions avoided +- [ ] Deadlocks prevented +- [ ] Resource contention minimized + +## 5. Testing Review + +### Test Coverage +- [ ] All new/modified code has tests +- [ ] Both success and failure paths tested +- [ ] Edge cases covered +- [ ] Integration tests for complex workflows + +### Test Quality +- [ ] Tests are focused and readable +- [ ] Proper mocking of external dependencies +- [ ] No real API calls in tests +- [ ] Test data is realistic and maintainable + +### TDD / test discipline +- [ ] New behavior covered by tests where practical (test-first preferred, not mandatory for refactors/docs) +- [ ] Tests fail appropriately when code is broken +- [ ] Tests are independent and can run in any order +- [ ] No test.skip or .only in committed code + +## 6. CLI-Specific Review + +### OCLIF Command Structure +- [ ] Extends appropriate base command class +- [ ] Proper flag definitions with validation +- [ ] Clear command description and examples +- [ ] Appropriate error handling with user-friendly messages + +### User Experience +- [ ] Progress indicators for long operations +- [ ] Clear success/failure messaging +- [ ] Proper use of colors and formatting +- [ ] Confirmation prompts for destructive actions + +### Command patterns +- [ ] Input validation before processing +- [ ] Heavy logic delegated to `src/core/` and `src/utils/` (not the command class) +- [ ] Proper logging for debugging +- [ ] Graceful handling of interruptions + +## 7. Contentstack Integration Review + +### API Usage +- [ ] Proper authentication using CLI utilities +- [ ] Rate limiting respected (10 req/sec for Management API) +- [ ] Appropriate error handling for API-specific errors +- [ ] Retry logic for transient failures + +### Query export behavior +- [ ] Query parsing and flags behave as documented +- [ ] Dependency / reference / asset handling respects `skip-*` flags +- [ ] Failures surface clearly to the user (no silent drops) +- [ ] Logging useful for support without leaking secrets + +### Environment Management +- [ ] Environment validation before operations +- [ ] Cross-environment operations handled safely +- [ ] Proper handling of environment-specific configurations +- [ ] Content type validation + +## Review Checklist Summary + +### Before Approving +- [ ] All critical issues resolved +- [ ] Tests pass; coverage reasonable for the change (~80% repo-wide is aspirational) +- [ ] Security concerns addressed +- [ ] Performance implications considered +- [ ] Documentation updated if needed +- [ ] Breaking changes properly communicated + +### Review Quality +- [ ] Code thoroughly examined, not just skimmed +- [ ] Constructive feedback provided +- [ ] Questions asked for unclear implementations +- [ ] Best practices enforced consistently +- [ ] Knowledge shared through comments + +### Post-Review +- [ ] Appropriate merge strategy selected +- [ ] Deployment considerations discussed +- [ ] Team notified of significant changes +- [ ] Follow-up tasks created if needed \ No newline at end of file diff --git a/skills/code-review/references/code-review-checklist.md b/skills/code-review/references/code-review-checklist.md deleted file mode 100644 index bb30248..0000000 --- a/skills/code-review/references/code-review-checklist.md +++ /dev/null @@ -1,172 +0,0 @@ -# Code Review Checklist - -Comprehensive PR review guidelines for **`@contentstack/cli-cm-export-query`** and related CLI work. - -## Review Process - -### Severity Levels -- 🔴 **Critical**: Must fix before merge (security, correctness, breaking changes) -- 🟡 **Important**: Should fix (performance, maintainability, best practices) -- 🟢 **Suggestion**: Consider improving (style, optimization, readability) - -## 1. Security Review - -### Authentication & Authorization -- [ ] No hardcoded API keys, tokens, or credentials -- [ ] Sensitive data not logged to console or files -- [ ] Proper token validation and expiration handling -- [ ] Environment variables used for secrets - -### Input Validation -- [ ] All user inputs validated and sanitized -- [ ] Command flags properly validated -- [ ] File paths sanitized to prevent directory traversal -- [ ] API responses validated before processing - -### Error Handling -- [ ] Errors don't expose sensitive information -- [ ] Stack traces filtered in production -- [ ] Proper error logging without secrets - -## 2. Correctness Review - -### Logic Validation -- [ ] Business logic correctly implemented -- [ ] Edge cases handled appropriately -- [ ] Null/undefined checks in place -- [ ] Async operations properly awaited - -### Error Scenarios -- [ ] Network failures handled gracefully -- [ ] Rate limiting respected and handled -- [ ] Partial failures in batch operations managed -- [ ] Retry logic implemented correctly - -### Data Integrity -- [ ] Data transformations are reversible where needed -- [ ] Batch operations maintain consistency -- [ ] Rollback mechanisms for critical operations -- [ ] Proper validation before destructive operations - -## 3. Architecture Review - -### Code Organization -- [ ] Proper separation of concerns (Commands → Services → Utils) -- [ ] Single responsibility principle followed -- [ ] Dependencies injected, not hardcoded -- [ ] Interfaces used for abstractions - -### Design Patterns -- [ ] Consistent error handling patterns -- [ ] Proper use of async/await -- [ ] Service layer properly abstracted -- [ ] Configuration management centralized - -### Modularity -- [ ] Functions are focused and testable -- [ ] Classes have clear responsibilities -- [ ] Modules are loosely coupled -- [ ] Common functionality extracted to utilities - -## 4. Performance Review - -### Efficiency -- [ ] Unnecessary API calls eliminated -- [ ] Export/query work batched or paginated where the Management API requires it -- [ ] Proper pagination implemented when listing large result sets -- [ ] Rate limiting respected - -### Resource Management -- [ ] Memory usage optimized for large datasets -- [ ] File handles properly closed -- [ ] Network connections cleaned up -- [ ] No memory leaks in long-running operations - -### Concurrency -- [ ] Appropriate concurrency limits set -- [ ] Race conditions avoided -- [ ] Deadlocks prevented -- [ ] Resource contention minimized - -## 5. Testing Review - -### Test Coverage -- [ ] All new/modified code has tests -- [ ] Both success and failure paths tested -- [ ] Edge cases covered -- [ ] Integration tests for complex workflows - -### Test Quality -- [ ] Tests are focused and readable -- [ ] Proper mocking of external dependencies -- [ ] No real API calls in tests -- [ ] Test data is realistic and maintainable - -### TDD / test discipline -- [ ] New behavior covered by tests where practical (test-first preferred, not mandatory for refactors/docs) -- [ ] Tests fail appropriately when code is broken -- [ ] Tests are independent and can run in any order -- [ ] No test.skip or .only in committed code - -## 6. CLI-Specific Review - -### OCLIF Command Structure -- [ ] Extends appropriate base command class -- [ ] Proper flag definitions with validation -- [ ] Clear command description and examples -- [ ] Appropriate error handling with user-friendly messages - -### User Experience -- [ ] Progress indicators for long operations -- [ ] Clear success/failure messaging -- [ ] Proper use of colors and formatting -- [ ] Confirmation prompts for destructive actions - -### Command patterns -- [ ] Input validation before processing -- [ ] Heavy logic delegated to `src/core/` and `src/utils/` (not the command class) -- [ ] Proper logging for debugging -- [ ] Graceful handling of interruptions - -## 7. Contentstack Integration Review - -### API Usage -- [ ] Proper authentication using CLI utilities -- [ ] Rate limiting respected (10 req/sec for Management API) -- [ ] Appropriate error handling for API-specific errors -- [ ] Retry logic for transient failures - -### Query export behavior -- [ ] Query parsing and flags behave as documented -- [ ] Dependency / reference / asset handling respects `skip-*` flags -- [ ] Failures surface clearly to the user (no silent drops) -- [ ] Logging useful for support without leaking secrets - -### Environment Management -- [ ] Environment validation before operations -- [ ] Cross-environment operations handled safely -- [ ] Proper handling of environment-specific configurations -- [ ] Content type validation - -## Review Checklist Summary - -### Before Approving -- [ ] All critical issues resolved -- [ ] Tests pass; coverage reasonable for the change (~80% repo-wide is aspirational) -- [ ] Security concerns addressed -- [ ] Performance implications considered -- [ ] Documentation updated if needed -- [ ] Breaking changes properly communicated - -### Review Quality -- [ ] Code thoroughly examined, not just skimmed -- [ ] Constructive feedback provided -- [ ] Questions asked for unclear implementations -- [ ] Best practices enforced consistently -- [ ] Knowledge shared through comments - -### Post-Review -- [ ] Appropriate merge strategy selected -- [ ] Deployment considerations discussed -- [ ] Team notified of significant changes -- [ ] Follow-up tasks created if needed \ No newline at end of file diff --git a/skills/contentstack-cli/SKILL.md b/skills/contentstack-cli/SKILL.md index 33442d9..f78d3ee 100644 --- a/skills/contentstack-cli/SKILL.md +++ b/skills/contentstack-cli/SKILL.md @@ -5,10 +5,7 @@ description: Contentstack CLI query-export plugin — OCLIF command, QueryExport # Contentstack CLI — query export -## Quick reference - -- **[Contentstack patterns](references/contentstack-patterns.md)** — Command shape, export pipeline, API habits -- **[Framework patterns](../framework/references/framework-patterns.md)** — Config, logging, errors +Guidance for **`@contentstack/cli-cm-export-query`**: query-driven export with dependency and asset handling. ## This package @@ -24,6 +21,101 @@ description: Contentstack CLI query-export plugin — OCLIF command, QueryExport - Respect rate limits and handle **429** / transient errors when adding API calls. - Tests: mock SDK and file I/O; no real stack access in unit tests. -## Usage +## Repository layout + +| Area | Role | +|------|------| +| `src/commands/cm/stacks/export-query.ts` | CLI entry: flags, config setup, `QueryExporter` | +| `src/core/query-executor.ts` | `QueryExporter` — main export pipeline | +| `src/core/module-exporter.ts` | `ModuleExporter` — module export details | +| `src/utils/` | Query parser, config, branches, dependencies, assets, files, logger | +| `src/types/index.ts` | Shared types (e.g. `QueryExportConfig`, `Modules`) | +| `src/config/` | Defaults (copied to `lib/` on build) | + +There is **no** `src/services/` directory in this repo. + +## Command pattern + +Use **`@contentstack/cli-command`** and **`@contentstack/cli-utilities`**: + +```typescript +import { Command } from '@contentstack/cli-command'; +import { + flags, + FlagInput, + managementSDKClient, + log, + handleAndLogError, +} from '@contentstack/cli-utilities'; +import { QueryExporter } from '../../../core/query-executor'; + +export default class ExportQueryCommand extends Command { + static description = 'Export content from a stack using query-based filtering'; + + static flags: FlagInput = { + query: flags.string({ + required: true, + description: 'Query as JSON string or file path', + }), + alias: flags.string({ char: 'a', description: 'Management token alias' }), + // ...see export-query.ts for full flags + }; + + async run(): Promise { + const { flags } = await this.parse(ExportQueryCommand); + // setupQueryExportConfig(flags), managementSDKClient(...), then: + // const exporter = new QueryExporter(client, exportQueryConfig); + // await exporter.execute(); + } +} +``` + +### Conventions + +- Validate required inputs early (`query`, stack credentials). +- Use **`log`** with export **context** objects for structured messages. +- Use **`handleAndLogError`** for consistent error reporting where the codebase already does. + +## Export pipeline (conceptual) + +1. **Parse** query via **`QueryParser`** (JSON string or path to JSON file). +2. **Export** general and queried modules (aligned with **`@contentstack/cli-cm-export`**). +3. **Resolve** content types, references, and assets unless disabled (`skip-references`, `skip-dependencies`, `secured-assets`). + +When extending behavior, prefer new methods on **`QueryExporter`** / **`ModuleExporter`** or focused utils under **`src/utils/`**. + +## Authentication and secrets + +- Resolve tokens through CLI utilities and command flags; do not print management tokens or API keys. +- Do not write secrets into export directories. + +## API and rate limits + +- Contentstack APIs are rate-limited; use delays or backoff on **429** when introducing new call patterns. +- In tests, stub **`managementSDKClient`**, stack client methods, and **`fsUtil`** as the existing unit tests do. + +--- + +## Other CLI plugins (context) + +Other Contentstack CLI packages sometimes use **`BaseBulkCommand`**, batch processors, or JSON logs under `bulk-operation/`. **This query-export plugin does not use those patterns.** + +### Rate limit sketch (generic) + +```typescript +class RateLimiter { + private lastRequest = 0; + private readonly minIntervalMs = 100; // order-of-magnitude; tune per API guidance + + async wait(): Promise { + const now = Date.now(); + const elapsed = now - this.lastRequest; + if (elapsed < this.minIntervalMs) { + await new Promise((r) => setTimeout(r, this.minIntervalMs - elapsed)); + } + this.lastRequest = Date.now(); + } +} +``` -Use this skill when changing export behavior, flags, query handling, or Contentstack API usage. Open **references/contentstack-patterns.md** for longer examples. +Adapt to whatever **`@contentstack/cli-utilities`** or **`@contentstack/cli-cm-export`** already provides before adding parallel limiters. diff --git a/skills/contentstack-cli/references/contentstack-patterns.md b/skills/contentstack-cli/references/contentstack-patterns.md deleted file mode 100644 index e65b6ec..0000000 --- a/skills/contentstack-cli/references/contentstack-patterns.md +++ /dev/null @@ -1,102 +0,0 @@ -# Contentstack patterns — query export plugin - -Guidance for **`@contentstack/cli-cm-export-query`**: query-driven export with dependency and asset handling. - -## Repository layout - -| Area | Role | -|------|------| -| `src/commands/cm/stacks/export-query.ts` | CLI entry: flags, config setup, `QueryExporter` | -| `src/core/query-executor.ts` | `QueryExporter` — main export pipeline | -| `src/core/module-exporter.ts` | `ModuleExporter` — module export details | -| `src/utils/` | Query parser, config, branches, dependencies, assets, files, logger | -| `src/types/index.ts` | Shared types (e.g. `QueryExportConfig`, `Modules`) | -| `src/config/` | Defaults (copied to `lib/` on build) | - -There is **no** `src/services/` directory in this repo. - -## Command pattern - -Use **`@contentstack/cli-command`** and **`@contentstack/cli-utilities`**: - -```typescript -import { Command } from '@contentstack/cli-command'; -import { - flags, - FlagInput, - managementSDKClient, - log, - handleAndLogError, -} from '@contentstack/cli-utilities'; -import { QueryExporter } from '../../../core/query-executor'; - -export default class ExportQueryCommand extends Command { - static description = 'Export content from a stack using query-based filtering'; - - static flags: FlagInput = { - query: flags.string({ - required: true, - description: 'Query as JSON string or file path', - }), - alias: flags.string({ char: 'a', description: 'Management token alias' }), - // ...see export-query.ts for full flags - }; - - async run(): Promise { - const { flags } = await this.parse(ExportQueryCommand); - // setupQueryExportConfig(flags), managementSDKClient(...), then: - // const exporter = new QueryExporter(client, exportQueryConfig); - // await exporter.execute(); - } -} -``` - -### Conventions - -- Validate required inputs early (`query`, stack credentials). -- Use **`log`** with export **context** objects for structured messages. -- Use **`handleAndLogError`** for consistent error reporting where the codebase already does. - -## Export pipeline (conceptual) - -1. **Parse** query via **`QueryParser`** (JSON string or path to JSON file). -2. **Export** general and queried modules (aligned with **`@contentstack/cli-cm-export`**). -3. **Resolve** content types, references, and assets unless disabled (`skip-references`, `skip-dependencies`, `secured-assets`). - -When extending behavior, prefer new methods on **`QueryExporter`** / **`ModuleExporter`** or focused utils under **`src/utils/`**. - -## Authentication and secrets - -- Resolve tokens through CLI utilities and command flags; do not print management tokens or API keys. -- Do not write secrets into export directories. - -## API and rate limits - -- Contentstack APIs are rate-limited; use delays or backoff on **429** when introducing new call patterns. -- In tests, stub **`managementSDKClient`**, stack client methods, and **`fsUtil`** as the existing unit tests do. - ---- - -## Other CLI plugins (context) - -Other Contentstack CLI packages sometimes use **`BaseBulkCommand`**, batch processors, or JSON logs under `bulk-operation/`. **This query-export plugin does not use those patterns.** - -### Rate limit sketch (generic) - -```typescript -class RateLimiter { - private lastRequest = 0; - private readonly minIntervalMs = 100; // order-of-magnitude; tune per API guidance - - async wait(): Promise { - const now = Date.now(); - const elapsed = now - this.lastRequest; - if (elapsed < this.minIntervalMs) { - await new Promise((r) => setTimeout(r, this.minIntervalMs - elapsed)); - } - this.lastRequest = Date.now(); - } -} -``` - -Adapt to whatever **`@contentstack/cli-utilities`** or **`@contentstack/cli-cm-export`** already provides before adding parallel limiters. diff --git a/skills/dev-workflow/SKILL.md b/skills/dev-workflow/SKILL.md new file mode 100644 index 0000000..2845935 --- /dev/null +++ b/skills/dev-workflow/SKILL.md @@ -0,0 +1,35 @@ +--- +name: dev-workflow +description: CI, Husky hooks, branch and PR expectations for the cli-cm-export-query plugin repo. +--- + +# Development workflow – CLI export-query + +## When to use + +- Running builds/tests before a PR +- Understanding which GitHub Actions run on this package +- Husky / pre-commit expectations + +## Commands + +| Command | Purpose | +| --- | --- | +| `npm run build` | Clean, install, compile, copy `src/config` → `lib/` | +| `npm test` | `pretest` compiles tests; nyc + mocha `test/**/*.test.ts` | +| `npm run test:unit` | Mocha `test/unit/**/*.test.ts` only | +| `npm run lint` | ESLint `src/**/*.ts` | +| `npm run prepack` | Compile + OCLIF manifest/readme + config copy (release path) | + +## CI + +Workflows under [`.github/workflows/`](../../../.github/workflows/): e.g. `unit-test.yml`, `release.yml`, `sca-scan.yml`, `policy-scan.yml`. + +## Git hooks + +- `prepare` runs Husky setup (see `package.json`); hooks live under [`.husky/`](../../../.husky/) when configured. + +## PR expectations + +- Tests and lint pass; no `describe.only` / `it.only` (`--forbid-only` in test scripts). +- Coordinate with [testing](../testing/SKILL.md) and [code-review](../code-review/SKILL.md). diff --git a/skills/framework/SKILL.md b/skills/framework/SKILL.md index c6799aa..6c75b92 100644 --- a/skills/framework/SKILL.md +++ b/skills/framework/SKILL.md @@ -3,70 +3,193 @@ name: framework description: Utilities, configuration, logging, and error patterns for @contentstack/cli-cm-export-query. Use when working in src/utils/, config, or shared helpers — align with @contentstack/cli-utilities where possible. --- -# Framework Patterns Skill +# Framework Patterns -## Quick Reference +Core utilities, configuration, logging, and error-handling patterns for **`@contentstack/cli-cm-export-query`** (and similar CLI plugins). Prefer matching patterns already in **`src/utils/`** and **`@contentstack/cli-utilities`** before introducing new abstractions. -For comprehensive framework guidance, see: -- **[Framework Patterns](references/framework-patterns.md)** - Complete utilities, configuration, logging, and framework patterns +## Configuration Management -## Core Framework Components +```typescript +export interface AppConfig { + contentstack: { apiKey: string; authToken: string; region: string; }; + batch: { defaultSize: number; maxConcurrency: number; retryAttempts: number; }; + logging: { level: string; format: string; }; +} -### Configuration Management -- Centralized configuration with environment-specific overrides -- Validation of required configuration values -- Type-safe configuration interfaces +export class ConfigBuilder { + static build(): AppConfig { + return { + contentstack: { apiKey: process.env.CONTENTSTACK_API_KEY!, authToken: process.env.CONTENTSTACK_AUTH_TOKEN!, region: process.env.CONTENTSTACK_REGION || 'us' }, + batch: { defaultSize: parseInt(process.env.BATCH_SIZE || '10'), maxConcurrency: parseInt(process.env.MAX_CONCURRENCY || '3'), retryAttempts: parseInt(process.env.RETRY_ATTEMPTS || '3') }, + logging: { level: process.env.LOG_LEVEL || 'info', format: process.env.LOG_FORMAT || 'json' } + }; + } + static validate(config: AppConfig): void { + if (!config.contentstack.apiKey) throw new Error('CONTENTSTACK_API_KEY is required'); + if (!config.contentstack.authToken) throw new Error('CONTENTSTACK_AUTH_TOKEN is required'); + } +} +``` -### Logging Framework -- Structured logging with different levels (debug, info, warn, error) -- Consistent log formatting and metadata -- Context-aware logging for debugging +## Logging Framework -### Error Handling Framework -- Consistent error handling with context and categorization -- Custom error classes for different error types -- Proper error propagation and logging +```typescript +export interface Logger { debug(message: string, meta?: object): void; info(message: string, meta?: object): void; warn(message: string, meta?: object): void; error(message: string, meta?: object): void; } -### Utility Classes -- Rate limiter for API throttling -- Retry strategy with exponential backoff -- Batch or chunked processing when exporting large module sets (if introduced) -- File system utilities with error handling +export class ConsoleLogger implements Logger { + constructor(private level: string = 'info') {} + debug(message: string, meta?: object): void { if (this.shouldLog('debug')) console.debug(this.format('DEBUG', message, meta)); } + info(message: string, meta?: object): void { if (this.shouldLog('info')) console.info(this.format('INFO', message, meta)); } + warn(message: string, meta?: object): void { if (this.shouldLog('warn')) console.warn(this.format('WARN', message, meta)); } + error(message: string, meta?: object): void { if (this.shouldLog('error')) console.error(this.format('ERROR', message, meta)); } -## Quick Patterns + private shouldLog(level: string): boolean { const levels = ['debug', 'info', 'warn', 'error']; return levels.indexOf(level) >= levels.indexOf(this.level); } + private format(level: string, message: string, meta?: object): string { return JSON.stringify({ timestamp: new Date().toISOString(), level, message, ...meta }); } +} +``` + +## Error Handling Framework -### Configuration Builder ```typescript -export class ConfigBuilder { - static build(): AppConfig { - return { - contentstack: { - apiKey: process.env.CONTENTSTACK_API_KEY!, - authToken: process.env.CONTENTSTACK_AUTH_TOKEN! - }, - batch: { - defaultSize: parseInt(process.env.BATCH_SIZE || '10'), - maxConcurrency: parseInt(process.env.MAX_CONCURRENCY || '3') +export abstract class BaseError extends Error { + abstract readonly code: string; abstract readonly category: 'validation' | 'api' | 'system' | 'user'; + constructor(message: string, public readonly context?: Record, public readonly cause?: Error) { super(message); this.name = this.constructor.name; } +} + +export class ValidationError extends BaseError { readonly code = 'VALIDATION_ERROR'; readonly category = 'validation' as const; } + +export class ApiError extends BaseError { + readonly code = 'API_ERROR'; readonly category = 'api' as const; + constructor(message: string, public readonly status?: number, context?: Record, cause?: Error) { super(message, { ...context, status }, cause); } +} + +export class ContentstackApiError extends ApiError { + readonly code = 'CONTENTSTACK_API_ERROR'; + static fromResponse(response: any, context?: Record): ContentstackApiError { + return new ContentstackApiError(response.error_message || 'API request failed', response.error_code, { ...context, errorCode: response.error_code, details: response.errors }); + } +} +``` + +## Utility Classes + +### Rate Limiter +```typescript +export class RateLimiter { + private queue: Array<() => void> = []; private running = 0; private lastRequest = 0; + constructor(private maxConcurrent: number = 1, private minInterval: number = 100) {} + + async execute(operation: () => Promise): Promise { + return new Promise((resolve, reject) => { + this.queue.push(async () => { + try { await this.waitForInterval(); this.running++; const result = await operation(); resolve(result); } + catch (error) { reject(error); } finally { this.running--; this.processQueue(); } + }); + this.processQueue(); + }); + } + + private processQueue(): void { if (this.running < this.maxConcurrent && this.queue.length > 0) this.queue.shift()!(); } + private async waitForInterval(): Promise { + const now = Date.now(); const elapsed = now - this.lastRequest; + if (elapsed < this.minInterval) await new Promise(resolve => setTimeout(resolve, this.minInterval - elapsed)); + this.lastRequest = Date.now(); + } +} +``` + +### Retry Strategy +```typescript +export interface RetryOptions { maxAttempts: number; initialDelay: number; maxDelay: number; backoffFactor: number; retryCondition?: (error: any) => boolean; } + +export class RetryStrategy { + constructor(private options: RetryOptions) {} + async execute(operation: () => Promise): Promise { + let lastError: any; let delay = this.options.initialDelay; + for (let attempt = 1; attempt <= this.options.maxAttempts; attempt++) { + try { return await operation(); } + catch (error) { + lastError = error; if (this.options.retryCondition && !this.options.retryCondition(error)) throw error; + if (attempt === this.options.maxAttempts) break; await new Promise(resolve => setTimeout(resolve, delay)); + delay = Math.min(delay * this.options.backoffFactor, this.options.maxDelay); } - }; + } + throw lastError; + } + + static forContentstack(): RetryStrategy { + return new RetryStrategy({ maxAttempts: 3, initialDelay: 1000, maxDelay: 10000, backoffFactor: 2, retryCondition: (error) => error.status === 429 || (error.status >= 500 && error.status < 600) }); } } ``` -### Error Handling +### Batch Processor ```typescript -export class ValidationError extends BaseError { - readonly code = 'VALIDATION_ERROR'; - readonly category = 'validation' as const; +export interface BatchOptions { batchSize: number; concurrency: number; processor: (item: T) => Promise; onProgress?: (completed: number, total: number) => void; } + +export class BatchProcessor { + static async process(items: T[], options: BatchOptions): Promise { + const batches = this.chunk(items, options.batchSize); const allResults: any[] = []; let completed = 0; + const processBatch = async (batch: T[]): Promise => { + const results = await Promise.allSettled(batch.map(options.processor)); allResults.push(...results); completed += batch.length; options.onProgress?.(completed, items.length); + }; + const semaphore = new Semaphore(options.concurrency); await Promise.all(batches.map(batch => semaphore.acquire(() => processBatch(batch)))); return allResults; + } + private static chunk(array: T[], size: number): T[][] { const chunks: T[][] = []; for (let i = 0; i < array.length; i += size) chunks.push(array.slice(i, i + size)); return chunks; } +} + +class Semaphore { + private permits: number; private waiting: Array<() => void> = []; + constructor(permits: number) { this.permits = permits; } + async acquire(task: () => Promise): Promise { + return new Promise((resolve, reject) => { + const tryAcquire = () => { + if (this.permits > 0) { this.permits--; task().then(resolve).catch(reject).finally(() => { this.permits++; if (this.waiting.length > 0) this.waiting.shift()!(); }); } + else this.waiting.push(tryAcquire); + }; + tryAcquire(); + }); + } } ``` -### Rate Limiter +## File System & Validation Utilities + ```typescript -const rateLimiter = new RateLimiter(3, 100); // 3 concurrent, 100ms interval -await rateLimiter.execute(() => apiCall()); +export class FileUtil { + static async writeJson(filePath: string, data: any): Promise { + try { const dir = path.dirname(filePath); await fs.mkdir(dir, { recursive: true }); await fs.writeFile(filePath, JSON.stringify(data, null, 2)); } + catch (error) { throw new Error(`Failed to write file ${filePath}: ${error.message}`); } + } + static async readJson(filePath: string): Promise { + try { const content = await fs.readFile(filePath, 'utf-8'); return JSON.parse(content); } + catch (error) { if (error.code === 'ENOENT') throw new Error(`File not found: ${filePath}`); throw new Error(`Failed to read file ${filePath}: ${error.message}`); } + } + static async exists(filePath: string): Promise { try { await fs.access(filePath); return true; } catch { return false; } } +} + +export class Validator { + static required(value: any, fieldName: string): void { if (value === null || value === undefined || value === '') throw new ValidationError(`${fieldName} is required`); } + static isArray(value: any, fieldName: string): void { if (!Array.isArray(value)) throw new ValidationError(`${fieldName} must be an array`); } + static isString(value: any, fieldName: string): void { if (typeof value !== 'string') throw new ValidationError(`${fieldName} must be a string`); } + static validateEnvironment(env: string): void { this.required(env, 'environment'); this.isString(env, 'environment'); } + static validateBatchSize(size: number): void { this.required(size, 'batchSize'); if (size < 1 || size > 100) throw new ValidationError('batchSize must be between 1 and 100'); } +} ``` -## Usage +## Dependency Injection -This skill provides Cursor-specific framework integration. Reference the universal framework patterns above for detailed implementations of configuration, logging, error handling, utilities, and dependency injection patterns that work with any AI agent. \ No newline at end of file +```typescript +export class Container { + private services = new Map(); private factories = new Map any>(); + register(name: string, factory: () => T): void { this.factories.set(name, factory); } + get(name: string): T { + if (this.services.has(name)) return this.services.get(name); const factory = this.factories.get(name); if (!factory) throw new Error(`Service not registered: ${name}`); + const instance = factory(); this.services.set(name, instance); return instance; + } + static setup(): Container { + const container = new Container(); container.register('config', () => ConfigBuilder.build()); container.register('logger', () => new ConsoleLogger()); + container.register('rateLimiter', () => new RateLimiter(3, 100)); container.register('retryStrategy', () => RetryStrategy.forContentstack()); return container; + } +} +``` \ No newline at end of file diff --git a/skills/framework/references/framework-patterns.md b/skills/framework/references/framework-patterns.md deleted file mode 100644 index e3131e2..0000000 --- a/skills/framework/references/framework-patterns.md +++ /dev/null @@ -1,190 +0,0 @@ -# Framework Patterns - -Core utilities, configuration, logging, and error-handling patterns for **`@contentstack/cli-cm-export-query`** (and similar CLI plugins). Prefer matching patterns already in **`src/utils/`** and **`@contentstack/cli-utilities`** before introducing new abstractions. - -## Configuration Management - -```typescript -export interface AppConfig { - contentstack: { apiKey: string; authToken: string; region: string; }; - batch: { defaultSize: number; maxConcurrency: number; retryAttempts: number; }; - logging: { level: string; format: string; }; -} - -export class ConfigBuilder { - static build(): AppConfig { - return { - contentstack: { apiKey: process.env.CONTENTSTACK_API_KEY!, authToken: process.env.CONTENTSTACK_AUTH_TOKEN!, region: process.env.CONTENTSTACK_REGION || 'us' }, - batch: { defaultSize: parseInt(process.env.BATCH_SIZE || '10'), maxConcurrency: parseInt(process.env.MAX_CONCURRENCY || '3'), retryAttempts: parseInt(process.env.RETRY_ATTEMPTS || '3') }, - logging: { level: process.env.LOG_LEVEL || 'info', format: process.env.LOG_FORMAT || 'json' } - }; - } - static validate(config: AppConfig): void { - if (!config.contentstack.apiKey) throw new Error('CONTENTSTACK_API_KEY is required'); - if (!config.contentstack.authToken) throw new Error('CONTENTSTACK_AUTH_TOKEN is required'); - } -} -``` - -## Logging Framework - -```typescript -export interface Logger { debug(message: string, meta?: object): void; info(message: string, meta?: object): void; warn(message: string, meta?: object): void; error(message: string, meta?: object): void; } - -export class ConsoleLogger implements Logger { - constructor(private level: string = 'info') {} - debug(message: string, meta?: object): void { if (this.shouldLog('debug')) console.debug(this.format('DEBUG', message, meta)); } - info(message: string, meta?: object): void { if (this.shouldLog('info')) console.info(this.format('INFO', message, meta)); } - warn(message: string, meta?: object): void { if (this.shouldLog('warn')) console.warn(this.format('WARN', message, meta)); } - error(message: string, meta?: object): void { if (this.shouldLog('error')) console.error(this.format('ERROR', message, meta)); } - - private shouldLog(level: string): boolean { const levels = ['debug', 'info', 'warn', 'error']; return levels.indexOf(level) >= levels.indexOf(this.level); } - private format(level: string, message: string, meta?: object): string { return JSON.stringify({ timestamp: new Date().toISOString(), level, message, ...meta }); } -} -``` - -## Error Handling Framework - -```typescript -export abstract class BaseError extends Error { - abstract readonly code: string; abstract readonly category: 'validation' | 'api' | 'system' | 'user'; - constructor(message: string, public readonly context?: Record, public readonly cause?: Error) { super(message); this.name = this.constructor.name; } -} - -export class ValidationError extends BaseError { readonly code = 'VALIDATION_ERROR'; readonly category = 'validation' as const; } - -export class ApiError extends BaseError { - readonly code = 'API_ERROR'; readonly category = 'api' as const; - constructor(message: string, public readonly status?: number, context?: Record, cause?: Error) { super(message, { ...context, status }, cause); } -} - -export class ContentstackApiError extends ApiError { - readonly code = 'CONTENTSTACK_API_ERROR'; - static fromResponse(response: any, context?: Record): ContentstackApiError { - return new ContentstackApiError(response.error_message || 'API request failed', response.error_code, { ...context, errorCode: response.error_code, details: response.errors }); - } -} -``` - -## Utility Classes - -### Rate Limiter -```typescript -export class RateLimiter { - private queue: Array<() => void> = []; private running = 0; private lastRequest = 0; - constructor(private maxConcurrent: number = 1, private minInterval: number = 100) {} - - async execute(operation: () => Promise): Promise { - return new Promise((resolve, reject) => { - this.queue.push(async () => { - try { await this.waitForInterval(); this.running++; const result = await operation(); resolve(result); } - catch (error) { reject(error); } finally { this.running--; this.processQueue(); } - }); - this.processQueue(); - }); - } - - private processQueue(): void { if (this.running < this.maxConcurrent && this.queue.length > 0) this.queue.shift()!(); } - private async waitForInterval(): Promise { - const now = Date.now(); const elapsed = now - this.lastRequest; - if (elapsed < this.minInterval) await new Promise(resolve => setTimeout(resolve, this.minInterval - elapsed)); - this.lastRequest = Date.now(); - } -} -``` - -### Retry Strategy -```typescript -export interface RetryOptions { maxAttempts: number; initialDelay: number; maxDelay: number; backoffFactor: number; retryCondition?: (error: any) => boolean; } - -export class RetryStrategy { - constructor(private options: RetryOptions) {} - async execute(operation: () => Promise): Promise { - let lastError: any; let delay = this.options.initialDelay; - for (let attempt = 1; attempt <= this.options.maxAttempts; attempt++) { - try { return await operation(); } - catch (error) { - lastError = error; if (this.options.retryCondition && !this.options.retryCondition(error)) throw error; - if (attempt === this.options.maxAttempts) break; await new Promise(resolve => setTimeout(resolve, delay)); - delay = Math.min(delay * this.options.backoffFactor, this.options.maxDelay); - } - } - throw lastError; - } - - static forContentstack(): RetryStrategy { - return new RetryStrategy({ maxAttempts: 3, initialDelay: 1000, maxDelay: 10000, backoffFactor: 2, retryCondition: (error) => error.status === 429 || (error.status >= 500 && error.status < 600) }); - } -} -``` - -### Batch Processor -```typescript -export interface BatchOptions { batchSize: number; concurrency: number; processor: (item: T) => Promise; onProgress?: (completed: number, total: number) => void; } - -export class BatchProcessor { - static async process(items: T[], options: BatchOptions): Promise { - const batches = this.chunk(items, options.batchSize); const allResults: any[] = []; let completed = 0; - const processBatch = async (batch: T[]): Promise => { - const results = await Promise.allSettled(batch.map(options.processor)); allResults.push(...results); completed += batch.length; options.onProgress?.(completed, items.length); - }; - const semaphore = new Semaphore(options.concurrency); await Promise.all(batches.map(batch => semaphore.acquire(() => processBatch(batch)))); return allResults; - } - private static chunk(array: T[], size: number): T[][] { const chunks: T[][] = []; for (let i = 0; i < array.length; i += size) chunks.push(array.slice(i, i + size)); return chunks; } -} - -class Semaphore { - private permits: number; private waiting: Array<() => void> = []; - constructor(permits: number) { this.permits = permits; } - async acquire(task: () => Promise): Promise { - return new Promise((resolve, reject) => { - const tryAcquire = () => { - if (this.permits > 0) { this.permits--; task().then(resolve).catch(reject).finally(() => { this.permits++; if (this.waiting.length > 0) this.waiting.shift()!(); }); } - else this.waiting.push(tryAcquire); - }; - tryAcquire(); - }); - } -} -``` - -## File System & Validation Utilities - -```typescript -export class FileUtil { - static async writeJson(filePath: string, data: any): Promise { - try { const dir = path.dirname(filePath); await fs.mkdir(dir, { recursive: true }); await fs.writeFile(filePath, JSON.stringify(data, null, 2)); } - catch (error) { throw new Error(`Failed to write file ${filePath}: ${error.message}`); } - } - static async readJson(filePath: string): Promise { - try { const content = await fs.readFile(filePath, 'utf-8'); return JSON.parse(content); } - catch (error) { if (error.code === 'ENOENT') throw new Error(`File not found: ${filePath}`); throw new Error(`Failed to read file ${filePath}: ${error.message}`); } - } - static async exists(filePath: string): Promise { try { await fs.access(filePath); return true; } catch { return false; } } -} - -export class Validator { - static required(value: any, fieldName: string): void { if (value === null || value === undefined || value === '') throw new ValidationError(`${fieldName} is required`); } - static isArray(value: any, fieldName: string): void { if (!Array.isArray(value)) throw new ValidationError(`${fieldName} must be an array`); } - static isString(value: any, fieldName: string): void { if (typeof value !== 'string') throw new ValidationError(`${fieldName} must be a string`); } - static validateEnvironment(env: string): void { this.required(env, 'environment'); this.isString(env, 'environment'); } - static validateBatchSize(size: number): void { this.required(size, 'batchSize'); if (size < 1 || size > 100) throw new ValidationError('batchSize must be between 1 and 100'); } -} -``` - -## Dependency Injection - -```typescript -export class Container { - private services = new Map(); private factories = new Map any>(); - register(name: string, factory: () => T): void { this.factories.set(name, factory); } - get(name: string): T { - if (this.services.has(name)) return this.services.get(name); const factory = this.factories.get(name); if (!factory) throw new Error(`Service not registered: ${name}`); - const instance = factory(); this.services.set(name, instance); return instance; - } - static setup(): Container { - const container = new Container(); container.register('config', () => ConfigBuilder.build()); container.register('logger', () => new ConsoleLogger()); - container.register('rateLimiter', () => new RateLimiter(3, 100)); container.register('retryStrategy', () => RetryStrategy.forContentstack()); return container; - } -} -``` \ No newline at end of file diff --git a/skills/testing/SKILL.md b/skills/testing/SKILL.md index b7b859a..35b660a 100644 --- a/skills/testing/SKILL.md +++ b/skills/testing/SKILL.md @@ -5,30 +5,17 @@ description: Mocha/Chai/Sinon testing and TDD for @contentstack/cli-cm-export-qu # Testing Patterns -## Quick Reference - -For comprehensive testing guidance, see: -- **[Testing Patterns](./references/testing-patterns.md)** - Complete testing best practices and TDD workflow -- **[Development Workflow](./references/development-workflow.md)** - TDD process and validation requirements - -## TDD workflow summary +Testing best practices and TDD workflow for **`@contentstack/cli-cm-export-query`**. **RED → GREEN → REFACTOR** for behavior changes; pure refactors / docs-only may skip new tests when behavior is unchanged. -## Key testing rules - -- **~80% coverage** (lines, branches, functions) is **aspirational**, not a hard CI gate here -- **Use sinon** for API responses and mocking -- **Never make real API calls** in tests -- **Mock at service boundaries**, not implementation details -- **Test both success and failure paths** -- **Use descriptive test names**: "should [behavior] when [condition]" - -## Quick Test Template +## Test Structure Standards +### Basic Test Template ```typescript describe('[ComponentName]', () => { beforeEach(() => { + // Setup mocks and test data sinon.stub(ExternalService.prototype, 'method').resolves(mockData); }); @@ -37,24 +24,266 @@ describe('[ComponentName]', () => { }); it('should [expected behavior] when [condition]', () => { - // Arrange, Act, Assert + // Arrange + const input = { /* test data */ }; + + // Act + const result = component.method(input); + + // Assert + expect(result).to.equal(expectedOutput); }); }); ``` +### Command testing example +```typescript +describe('ExportQueryCommand', () => { + beforeEach(() => { + sinon.stub(ContentstackClient.prototype, 'stack').returns(mockStack); + }); + + it('should run export when query and auth are valid', async () => { + // Stub parse, setupQueryExportConfig, QueryExporter.prototype.execute, etc. + }); +}); +``` + +## Key Testing Rules + +### Coverage +- **~80%** (lines, branches, functions) is **aspirational**, not a hard gate +- Test both success and failure paths +- Include edge cases and error scenarios + +### Mocking Standards +- **Use sinon** for API responses and external dependencies +- **Never make real API calls** in tests +- **Mock at module boundaries** (SDK, `fsUtil`), not irrelevant internals +- Restore mocks in `afterEach()` to prevent test pollution + +### Test Patterns +- Use descriptive test names: "should [behavior] when [condition]" +- Keep test setup minimal and focused +- Prefer synchronous patterns when possible +- Group related tests in `describe` blocks + ## Common Mock Patterns +### API Mocking ```typescript // Mock Contentstack API sinon.stub(ContentstackClient.prototype, 'fetch').resolves(mockData); +// Mock with specific responses +sinon.stub(client, 'getEntry') + .withArgs('entry1').resolves(mockEntry1) + .withArgs('entry2').resolves(mockEntry2); +``` + +### Service Mocking +```typescript // Mock rate limiter sinon.stub(RateLimiter.prototype, 'wait').resolves(); // Mock file operations sinon.stub(fsUtil, 'writeFile').returns(true); +sinon.stub(fsUtil, 'readFile').resolves(JSON.stringify(mockData)); +``` + +### Error Simulation +```typescript +// Mock API errors +const apiError = new Error('API Error'); +apiError.status = 500; +sinon.stub(client, 'fetch').rejects(apiError); + +// Mock rate limiting +const rateLimitError = new Error('Rate limited'); +rateLimitError.status = 429; +sinon.stub(client, 'fetch').rejects(rateLimitError); +``` + +## Error Testing Patterns + +### Rate Limit Handling +```typescript +it('should handle rate limit errors', () => { + const error = new Error('Rate limited'); + error.status = 429; + + sinon.stub(client, 'fetch').rejects(error); + + expect(service.performOperation()).to.eventually.be.fulfilled; +}); +``` + +### Validation Error Testing +```typescript +it('should throw validation error for invalid input', () => { + const invalidInput = { /* invalid data */ }; + + expect(() => service.validate(invalidInput)) + .to.throw('Validation failed'); +}); +``` + +### Async Error Handling +```typescript +it('should handle async operation failures', async () => { + sinon.stub(service, 'performAsync').rejects(new Error('Operation failed')); + + try { + await service.execute(); + expect.fail('Should have thrown error'); + } catch (error) { + expect(error.message).to.include('Operation failed'); + } +}); +``` + +## Test Organization + +### File Structure +- Mirror modules under `test/unit/`: e.g. `test/unit/query-executor.test.ts`, `test/unit/query-parser-simple.test.ts` +- Use consistent naming: `[module-name].test.ts` +- Group integration tests: `test/integration/` + +### Test Data Management +- Create mock data factories: `test/fixtures/mock-factory.ts` +- Use realistic test data that matches API responses +- Share common mocks across test files + +### Test Configuration +```javascript +// .mocharc.json +{ + "require": ["ts-node/register"], + "extensions": ["ts"], + "spec": "test/**/*.test.ts", + "timeout": 5000, + "forbid-only": true +} +``` + +## Coverage and Quality + +### Coverage Enforcement +```json +// package.json nyc configuration +"nyc": { + "check-coverage": true, + "lines": 80, + "functions": 80, + "branches": 80, + "statements": 80 +} ``` -## Usage +### Quality Checklist +- [ ] All public methods tested +- [ ] Error paths covered +- [ ] Edge cases included +- [ ] Mocks properly restored +- [ ] No real API calls +- [ ] Descriptive test names +- [ ] Minimal test setup +- [ ] Fast execution (< 5s per test) + +## Development workflow + +### TDD workflow (recommended) + +For **new behavior or bug fixes**, prefer: + +1. **RED** → Failing test (or extended test) +2. **GREEN** → Minimal code to pass +3. **REFACTOR** → Improve while tests stay green + +**Exceptions:** pure refactors, documentation-only edits, and trivial non-behavior changes may skip new tests. + +## Guidelines + +- Prefer **clear tests** over async-heavy setup when you can +- **NO test.skip or .only** in commits +- **~80% coverage** (lines, branches, functions) is **aspirational**, not a CI gate +- **TypeScript** — explicit return types where practical; avoid `any` + +## File structure (this repo) + +- **Commands**: `src/commands/cm/stacks/` +- **Core**: `src/core/` (`QueryExporter`, `ModuleExporter`, …) +- **Utils**: `src/utils/` +- **Tests**: `test/unit/` — `*.test.ts` per module (e.g. `query-executor.test.ts`) + +## Naming conventions + +- **Files**: `kebab-case.ts` / `kebab-case.test.ts` +- **Classes**: `PascalCase` +- **Functions/Variables**: `camelCase` +- **Constants**: `SCREAMING_SNAKE_CASE` +- **Test descriptions**: "should [behavior] when [condition]" + +## Code quality standards + +### TypeScript +- Explicit return types for all functions +- No `any` type usage +- Strict null checks enabled +- No unused variables or imports + +### Error handling +- Use custom error classes where the codebase already does +- Include error context and cause +- Never swallow errors silently + +### Import organization +1. Node.js built-ins +2. External libraries +3. Internal modules (relative imports last) + +## Testing + +### Coverage +- Aim high; **~80%** is a guideline +- Test success and failure paths for behavior you touch +- Mock external dependencies (SDK, `fsUtil`, etc.) + +### Test structure +```typescript +describe('[ComponentName]', () => { + beforeEach(() => { + sinon.stub(ExternalService.prototype, 'method').resolves(mockData); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should [expected behavior] when [condition]', () => { + const input = { /* test data */ }; + const result = component.method(input); + expect(result).to.equal(expectedOutput); + }); +}); +``` + +### Mocking standards +- Use sinon for API response mocking +- Never make real API calls in tests +- Mock at module boundaries (SDK, `fsUtil`, etc.), not irrelevant internals + +## Commit suggestions + +- Conventional commits are optional: `feat(scope): description` +- Include tests when you change behavior +- Run lint and tests before pushing +- No debugging code (`console.log`, `debugger`) left in + +## Development process -Reference the universal testing patterns above for detailed test structures, mocking strategies, error testing patterns, and coverage requirements. This skill provides Cursor-specific integration while the universal docs work with any AI agent. \ No newline at end of file +1. **Understand** → Read relevant patterns before coding +2. **Plan** → Break down into testable units +3. **Test first** → When adding behavior, prefer failing test then implementation +4. **Validate** → `npm run lint`, `npm run test`, `npm run test:report` if you need LCOV +5. **Review** → Self-review against the code review checklist diff --git a/skills/testing/references/development-workflow.md b/skills/testing/references/development-workflow.md deleted file mode 100644 index 312dc2e..0000000 --- a/skills/testing/references/development-workflow.md +++ /dev/null @@ -1,99 +0,0 @@ -# Development Workflow - -Core development rules and Test-Driven Development (TDD) workflow for **`@contentstack/cli-cm-export-query`**. - -## TDD workflow (recommended) - -For **new behavior or bug fixes**, prefer: - -1. **RED** → Failing test (or extended test) -2. **GREEN** → Minimal code to pass -3. **REFACTOR** → Improve while tests stay green - -**Exceptions:** pure refactors, documentation-only edits, and trivial non-behavior changes may skip new tests. - -## Guidelines - -- Prefer **clear tests** over async-heavy setup when you can -- **NO test.skip or .only** in commits -- **~80% coverage** (lines, branches, functions) is **aspirational**, not a CI gate -- **TypeScript** — explicit return types where practical; avoid `any` - -## File structure (this repo) - -- **Commands**: `src/commands/cm/stacks/` -- **Core**: `src/core/` (`QueryExporter`, `ModuleExporter`, …) -- **Utils**: `src/utils/` -- **Tests**: `test/unit/` — `*.test.ts` per module (e.g. `query-executor.test.ts`) - -## Naming conventions - -- **Files**: `kebab-case.ts` / `kebab-case.test.ts` -- **Classes**: `PascalCase` -- **Functions/Variables**: `camelCase` -- **Constants**: `SCREAMING_SNAKE_CASE` -- **Test descriptions**: "should [behavior] when [condition]" - -## Code quality standards - -### TypeScript -- Explicit return types for all functions -- No `any` type usage -- Strict null checks enabled -- No unused variables or imports - -### Error handling -- Use custom error classes where the codebase already does -- Include error context and cause -- Never swallow errors silently - -### Import organization -1. Node.js built-ins -2. External libraries -3. Internal modules (relative imports last) - -## Testing - -### Coverage -- Aim high; **~80%** is a guideline -- Test success and failure paths for behavior you touch -- Mock external dependencies (SDK, `fsUtil`, etc.) - -### Test structure -```typescript -describe('[ComponentName]', () => { - beforeEach(() => { - sinon.stub(ExternalService.prototype, 'method').resolves(mockData); - }); - - afterEach(() => { - sinon.restore(); - }); - - it('should [expected behavior] when [condition]', () => { - const input = { /* test data */ }; - const result = component.method(input); - expect(result).to.equal(expectedOutput); - }); -}); -``` - -### Mocking standards -- Use sinon for API response mocking -- Never make real API calls in tests -- Mock at module boundaries (SDK, `fsUtil`, etc.), not irrelevant internals - -## Commit suggestions - -- Conventional commits are optional: `feat(scope): description` -- Include tests when you change behavior -- Run lint and tests before pushing -- No debugging code (`console.log`, `debugger`) left in - -## Development process - -1. **Understand** → Read relevant patterns before coding -2. **Plan** → Break down into testable units -3. **Test first** → When adding behavior, prefer failing test then implementation -4. **Validate** → `npm run lint`, `npm run test`, `npm run test:report` if you need LCOV -5. **Review** → Self-review against the code review checklist diff --git a/skills/testing/references/testing-patterns.md b/skills/testing/references/testing-patterns.md deleted file mode 100644 index 40c6a27..0000000 --- a/skills/testing/references/testing-patterns.md +++ /dev/null @@ -1,188 +0,0 @@ -# Testing Patterns - -Testing best practices and TDD workflow for **`@contentstack/cli-cm-export-query`**. - -## TDD workflow - -**RED → GREEN → REFACTOR** for behavior changes. Pure refactors / docs-only may skip new tests when behavior is unchanged. - -## Test Structure Standards - -### Basic Test Template -```typescript -describe('[ComponentName]', () => { - beforeEach(() => { - // Setup mocks and test data - sinon.stub(ExternalService.prototype, 'method').resolves(mockData); - }); - - afterEach(() => { - sinon.restore(); - }); - - it('should [expected behavior] when [condition]', () => { - // Arrange - const input = { /* test data */ }; - - // Act - const result = component.method(input); - - // Assert - expect(result).to.equal(expectedOutput); - }); -}); -``` - -### Command testing example -```typescript -describe('ExportQueryCommand', () => { - beforeEach(() => { - sinon.stub(ContentstackClient.prototype, 'stack').returns(mockStack); - }); - - it('should run export when query and auth are valid', async () => { - // Stub parse, setupQueryExportConfig, QueryExporter.prototype.execute, etc. - }); -}); -``` - -## Key Testing Rules - -### Coverage -- **~80%** (lines, branches, functions) is **aspirational**, not a hard gate -- Test both success and failure paths -- Include edge cases and error scenarios - -### Mocking Standards -- **Use sinon** for API responses and external dependencies -- **Never make real API calls** in tests -- **Mock at module boundaries** (SDK, `fsUtil`), not irrelevant internals -- Restore mocks in `afterEach()` to prevent test pollution - -### Test Patterns -- Use descriptive test names: "should [behavior] when [condition]" -- Keep test setup minimal and focused -- Prefer synchronous patterns when possible -- Group related tests in `describe` blocks - -## Common Mock Patterns - -### API Mocking -```typescript -// Mock Contentstack API -sinon.stub(ContentstackClient.prototype, 'fetch').resolves(mockData); - -// Mock with specific responses -sinon.stub(client, 'getEntry') - .withArgs('entry1').resolves(mockEntry1) - .withArgs('entry2').resolves(mockEntry2); -``` - -### Service Mocking -```typescript -// Mock rate limiter -sinon.stub(RateLimiter.prototype, 'wait').resolves(); - -// Mock file operations -sinon.stub(fsUtil, 'writeFile').returns(true); -sinon.stub(fsUtil, 'readFile').resolves(JSON.stringify(mockData)); -``` - -### Error Simulation -```typescript -// Mock API errors -const apiError = new Error('API Error'); -apiError.status = 500; -sinon.stub(client, 'fetch').rejects(apiError); - -// Mock rate limiting -const rateLimitError = new Error('Rate limited'); -rateLimitError.status = 429; -sinon.stub(client, 'fetch').rejects(rateLimitError); -``` - -## Error Testing Patterns - -### Rate Limit Handling -```typescript -it('should handle rate limit errors', () => { - const error = new Error('Rate limited'); - error.status = 429; - - sinon.stub(client, 'fetch').rejects(error); - - expect(service.performOperation()).to.eventually.be.fulfilled; -}); -``` - -### Validation Error Testing -```typescript -it('should throw validation error for invalid input', () => { - const invalidInput = { /* invalid data */ }; - - expect(() => service.validate(invalidInput)) - .to.throw('Validation failed'); -}); -``` - -### Async Error Handling -```typescript -it('should handle async operation failures', async () => { - sinon.stub(service, 'performAsync').rejects(new Error('Operation failed')); - - try { - await service.execute(); - expect.fail('Should have thrown error'); - } catch (error) { - expect(error.message).to.include('Operation failed'); - } -}); -``` - -## Test Organization - -### File Structure -- Mirror modules under `test/unit/`: e.g. `test/unit/query-executor.test.ts`, `test/unit/query-parser-simple.test.ts` -- Use consistent naming: `[module-name].test.ts` -- Group integration tests: `test/integration/` - -### Test Data Management -- Create mock data factories: `test/fixtures/mock-factory.ts` -- Use realistic test data that matches API responses -- Share common mocks across test files - -### Test Configuration -```javascript -// .mocharc.json -{ - "require": ["ts-node/register"], - "extensions": ["ts"], - "spec": "test/**/*.test.ts", - "timeout": 5000, - "forbid-only": true -} -``` - -## Coverage and Quality - -### Coverage Enforcement -```json -// package.json nyc configuration -"nyc": { - "check-coverage": true, - "lines": 80, - "functions": 80, - "branches": 80, - "statements": 80 -} -``` - -### Quality Checklist -- [ ] All public methods tested -- [ ] Error paths covered -- [ ] Edge cases included -- [ ] Mocks properly restored -- [ ] No real API calls -- [ ] Descriptive test names -- [ ] Minimal test setup -- [ ] Fast execution (< 5s per test) \ No newline at end of file diff --git a/src/commands/cm/stacks/export-query.ts b/src/commands/cm/stacks/export-query.ts index 06f9ba0..e70e6c2 100644 --- a/src/commands/cm/stacks/export-query.ts +++ b/src/commands/cm/stacks/export-query.ts @@ -7,6 +7,8 @@ import { ContentstackClient, log, handleAndLogError, + messageHandler, + loadChalk, } from '@contentstack/cli-utilities'; import { QueryExporter } from '../../../core/query-executor'; import { QueryExportConfig } from '../../../types'; @@ -70,8 +72,10 @@ export default class ExportQueryCommand extends Command { }; async run(): Promise { + await loadChalk(); try { const { flags } = await this.parse(ExportQueryCommand); + this.initializeMessageHandler(); // Setup export configuration const exportQueryConfig = await setupQueryExportConfig(flags); @@ -112,4 +116,8 @@ export default class ExportQueryCommand extends Command { handleAndLogError(error); } } + + initializeMessageHandler(): void { + messageHandler.init(this.context); + } } diff --git a/src/core/module-exporter.ts b/src/core/module-exporter.ts index 982c44b..ac21ae9 100644 --- a/src/core/module-exporter.ts +++ b/src/core/module-exporter.ts @@ -2,7 +2,6 @@ import { log, handleAndLogError } from '@contentstack/cli-utilities'; import ExportCommand from '@contentstack/cli-cm-export'; import { QueryExportConfig, Modules, ExportOptions } from '../types'; - export class ModuleExporter { private exportQueryConfig: QueryExportConfig; private exportedModules: string[] = []; @@ -60,9 +59,11 @@ export class ModuleExporter { // Module cmd.push('--module', moduleName); - // Alias (management token) + // Alias or management token (mutually exclusive for the export CLI) if (options.alias) { cmd.push('-a', options.alias); + } else if (this.exportQueryConfig.managementToken) { + cmd.push('-a', this.exportQueryConfig.managementToken); } // Branch diff --git a/src/core/query-executor.ts b/src/core/query-executor.ts index 345a8c0..dd48183 100644 --- a/src/core/query-executor.ts +++ b/src/core/query-executor.ts @@ -1,4 +1,11 @@ -import { ContentstackClient, sanitizePath, log, handleAndLogError } from '@contentstack/cli-utilities'; +import { + ContentstackClient, + sanitizePath, + log, + handleAndLogError, + readContentTypeSchemas, +} from '@contentstack/cli-utilities'; +import * as fs from 'fs'; import * as path from 'path'; import { QueryExportConfig, Modules } from '../types'; import { QueryParser } from '../utils/query-parser'; @@ -40,25 +47,10 @@ export class QueryExporter { // Step 4: Export queried modules await this.exportQueriedModule(parsedQuery); - // Step 1: Read initial content types and mark them as exported - const contentTypesFilePath = path.join( - sanitizePath(this.exportQueryConfig.exportDir), - sanitizePath(this.exportQueryConfig.branchName || ''), - 'content_types', - 'schema.json', - ); - const contentTypes: any = fsUtil.readFile(sanitizePath(contentTypesFilePath)) || []; - if (contentTypes.length === 0) { - log.info('No content types found, skipping export', this.exportQueryConfig.context); - process.exit(0); - } - - // Step 5: export other content types which are referenced in previous step - log.debug('Starting referenced content types export', this.exportQueryConfig.context); - await this.exportReferencedContentTypes(); - // Step 6: export dependent modules global fields, extensions, taxonomies - log.debug('Starting dependent modules export', this.exportQueryConfig.context); - await this.exportDependentModules(); + // Step 5+6: resolve the full transitive closure of referenced content types, + // global fields, extensions, taxonomies, and marketplace apps. + log.debug('Starting schema closure expansion', this.exportQueryConfig.context); + await this.expandSchemaClosure(); // Step 7: export content modules entries, assets log.debug('Starting content modules export', this.exportQueryConfig.context); await this.exportContentModules(); @@ -93,162 +85,144 @@ export class QueryExporter { log.debug('Queried module export completed', this.exportQueryConfig.context); } - private async exportReferencedContentTypes(): Promise { - log.info('Starting export of referenced content types...', this.exportQueryConfig.context); + /** + * Iteratively expand the set of exported content types, global fields, extensions, + * taxonomies, and marketplace apps until no new items are discovered (fixpoint). + * + * Each iteration scans the combined set of CT and GF documents that currently exist on + * disk. Any newly discovered referenced content types or global fields are exported and + * the loop restarts so that their schemas can be scanned in turn. Leaf dependencies + * (extensions, taxonomies, marketplace apps) are collected and exported in the same pass + * without triggering an extra iteration, since they do not themselves produce new schemas. + * + * Personalize is exported exactly once, after the closure stabilises. + */ + private async expandSchemaClosure(): Promise { + log.info('Starting export of referenced content types and dependent modules...', this.exportQueryConfig.context); try { - const referencedHandler = new ReferencedContentTypesHandler(this.exportQueryConfig); - const exportedContentTypeUIDs: Set = new Set(); - - // Step 1: Read initial content types and mark them as exported - const contentTypesFilePath = path.join( + const ctPath = path.join( sanitizePath(this.exportQueryConfig.exportDir), sanitizePath(this.exportQueryConfig.branchName || ''), 'content_types', - 'schema.json', ); - const contentTypes: any = fsUtil.readFile(sanitizePath(contentTypesFilePath)) || []; - if (contentTypes.length === 0) { - log.info('No content types found, skipping referenced content types export', this.exportQueryConfig.context); - return; - } + const gfPath = path.join( + sanitizePath(this.exportQueryConfig.exportDir), + sanitizePath(this.exportQueryConfig.branchName || ''), + 'global_fields', + ); - // Step 2: Start with initial batch (all currently exported content types) - let currentBatch = [...contentTypes]; + const referencedHandler = new ReferencedContentTypesHandler(this.exportQueryConfig); + const dependenciesHandler = new ContentTypeDependenciesHandler(this.stackAPIClient, this.exportQueryConfig); - log.info(`Starting with ${currentBatch.length} initial content types`, this.exportQueryConfig.context); + const exportedCTUIDs = new Set(); + const exportedGFUIDs = new Set(); + const exportedExtUIDs = new Set(); + const exportedTaxUIDs = new Set(); + const exportedMarketplaceUIDs = new Set(); - // track reference depth let iterationCount = 0; - // Step 3: Process batches until no new references are found - while (currentBatch.length > 0 && iterationCount < this.exportQueryConfig.maxCTReferenceDepth) { - iterationCount++; - log.debug(`Processing referenced content types iteration ${iterationCount}`, this.exportQueryConfig.context); - currentBatch.forEach((ct: any) => exportedContentTypeUIDs.add(ct.uid)); - // Extract referenced content types from current batch - const referencedUIDs = await referencedHandler.extractReferencedContentTypes(currentBatch); - - // Filter out already exported content types - const newReferencedUIDs = referencedUIDs.filter((uid: string) => !exportedContentTypeUIDs.has(uid)); - - if (newReferencedUIDs.length > 0) { - log.info( - `Found ${newReferencedUIDs.length} new referenced content types to fetch`, - this.exportQueryConfig.context, - ); - - // // Add to exported set to avoid duplicates in future iterations - // newReferencedUIDs.forEach((uid) => exportedContentTypeUIDs.add(uid)); - // Step 4: Fetch new content types using moduleExporter - const query = { - modules: { - 'content-types': { - uid: { - $in: newReferencedUIDs, - }, - }, - }, - }; + while (iterationCount < this.exportQueryConfig.maxCTReferenceDepth) { + iterationCount++; + log.debug(`Schema closure iteration ${iterationCount}`, this.exportQueryConfig.context); - await this.moduleExporter.exportModule('content-types', { query }); + const allCTs = readContentTypeSchemas(ctPath); + const allGFs = readContentTypeSchemas(gfPath); - const newContentTypes = fsUtil.readFile(sanitizePath(contentTypesFilePath)) as any[]; - currentBatch = [...newContentTypes]; + // Record everything currently on disk so we never re-export it. + allCTs.forEach((ct: any) => exportedCTUIDs.add(ct.uid)); + allGFs.forEach((gf: any) => exportedGFUIDs.add(gf.uid)); - // Push new content types to main array - contentTypes.push(...newContentTypes); + const allSchemas = [...allCTs, ...allGFs]; - log.info(`Fetched ${currentBatch.length} new content types for next iteration`, this.exportQueryConfig.context); - } else { - log.info('No new referenced content types found, stopping recursion', this.exportQueryConfig.context); + if (allSchemas.length === 0) { + log.info('No schemas found on disk, stopping closure', this.exportQueryConfig.context); break; } - } - - fsUtil.writeFile(sanitizePath(contentTypesFilePath), contentTypes); - log.success('Referenced content types export completed successfully', this.exportQueryConfig.context); - } catch (error) { - handleAndLogError(error, this.exportQueryConfig.context, 'Error exporting referenced content types'); - throw error; - } - } - - private async exportDependentModules(): Promise { - log.info('Starting export of dependent modules...', this.exportQueryConfig.context); - - try { - const dependenciesHandler = new ContentTypeDependenciesHandler(this.stackAPIClient, this.exportQueryConfig); - - // Extract dependencies from all exported content types - const dependencies = await dependenciesHandler.extractDependencies(); - log.debug('Dependencies extracted successfully', this.exportQueryConfig.context); - // Export Global Fields - if (dependencies.globalFields.size > 0) { - const globalFieldUIDs = Array.from(dependencies.globalFields); - log.info(`Exporting ${globalFieldUIDs.length} global fields...`, this.exportQueryConfig.context); + let foundNewCTs = false; + let foundNewGFs = false; + + // Step A: find and export referenced content types from the combined schema set. + if (!this.exportQueryConfig.skipReferences) { + const referencedUIDs = await referencedHandler.extractReferencedContentTypes(allSchemas); + const newCTUIDs = referencedUIDs.filter((uid: string) => !exportedCTUIDs.has(uid)); + + if (newCTUIDs.length > 0) { + log.info( + `Found ${newCTUIDs.length} new referenced content type(s) to fetch`, + this.exportQueryConfig.context, + ); + await this.moduleExporter.exportModule('content-types', { + query: { modules: { 'content-types': { uid: { $in: newCTUIDs } } } }, + }); + // Track immediately so the dedup filter works even if the disk reader + // hasn't picked up the newly written files yet. + newCTUIDs.forEach((uid: string) => exportedCTUIDs.add(uid)); + foundNewCTs = true; + } + } - const query = { - modules: { - 'global-fields': { - uid: { $in: globalFieldUIDs }, - }, - }, - }; - await this.moduleExporter.exportModule('global-fields', { query }); - } + // Step B: find and export dependent modules from the combined schema set. + if (!this.exportQueryConfig.skipDependencies) { + const deps = await dependenciesHandler.extractDependencies(allSchemas); - // Export Extensions - if (dependencies.extensions.size > 0) { - const extensionUIDs = Array.from(dependencies.extensions); - log.info(`Exporting ${extensionUIDs.length} extensions...`, this.exportQueryConfig.context); + const newGFUIDs = [...deps.globalFields].filter((uid: string) => !exportedGFUIDs.has(uid)); + if (newGFUIDs.length > 0) { + log.info(`Found ${newGFUIDs.length} new global field(s)`, this.exportQueryConfig.context); + await this.moduleExporter.exportModule('global-fields', { + query: { modules: { 'global-fields': { uid: { $in: newGFUIDs } } } }, + }); + // Track immediately for the same reason as CTs above. + newGFUIDs.forEach((uid: string) => exportedGFUIDs.add(uid)); + foundNewGFs = true; + } - const query = { - modules: { - extensions: { - uid: { $in: extensionUIDs }, - }, - }, - }; - await this.moduleExporter.exportModule('extensions', { query }); - } + // Extensions, taxonomies, and marketplace apps are leaf nodes: they do not + // produce new schemas, so exporting them never requires an extra iteration. + const newExtUIDs = [...deps.extensions].filter((uid: string) => !exportedExtUIDs.has(uid)); + if (newExtUIDs.length > 0) { + log.info(`Found ${newExtUIDs.length} new extension(s)`, this.exportQueryConfig.context); + await this.moduleExporter.exportModule('extensions', { + query: { modules: { extensions: { uid: { $in: newExtUIDs } } } }, + }); + newExtUIDs.forEach((uid: string) => exportedExtUIDs.add(uid)); + } - // export marketplace apps - if (dependencies.marketplaceApps.size > 0) { - const marketplaceAppInstallationUIDs = Array.from(dependencies.marketplaceApps); - log.info(`Exporting ${marketplaceAppInstallationUIDs.length} marketplace apps...`, this.exportQueryConfig.context); - const query = { - modules: { - 'marketplace-apps': { - installation_uid: { $in: marketplaceAppInstallationUIDs }, - }, - }, - }; - await this.moduleExporter.exportModule('marketplace-apps', { query }); - } + const newMarketplaceUIDs = [...deps.marketplaceApps].filter( + (uid: string) => !exportedMarketplaceUIDs.has(uid), + ); + if (newMarketplaceUIDs.length > 0) { + log.info(`Found ${newMarketplaceUIDs.length} new marketplace app(s)`, this.exportQueryConfig.context); + await this.moduleExporter.exportModule('marketplace-apps', { + query: { modules: { 'marketplace-apps': { installation_uid: { $in: newMarketplaceUIDs } } } }, + }); + newMarketplaceUIDs.forEach((uid: string) => exportedMarketplaceUIDs.add(uid)); + } - // Export Taxonomies - if (dependencies.taxonomies.size > 0) { - const taxonomyUIDs = Array.from(dependencies.taxonomies); - log.info(`Exporting ${taxonomyUIDs.length} taxonomies...`, this.exportQueryConfig.context); + const newTaxUIDs = [...deps.taxonomies].filter((uid: string) => !exportedTaxUIDs.has(uid)); + if (newTaxUIDs.length > 0) { + log.info(`Found ${newTaxUIDs.length} new taxonom(ies)`, this.exportQueryConfig.context); + await this.moduleExporter.exportModule('taxonomies', { + query: { modules: { taxonomies: { uid: { $in: newTaxUIDs } } } }, + }); + newTaxUIDs.forEach((uid: string) => exportedTaxUIDs.add(uid)); + } + } - const query = { - modules: { - taxonomies: { - uid: { $in: taxonomyUIDs }, - }, - }, - }; - await this.moduleExporter.exportModule('taxonomies', { query }); + if (!foundNewCTs && !foundNewGFs) { + log.info('Schema closure complete, no new content types or global fields found', this.exportQueryConfig.context); + break; + } } - // export personalize + // Personalize is a single global module exported once after the closure stabilises. await this.moduleExporter.exportModule('personalize'); - log.success('Dependent modules export completed successfully', this.exportQueryConfig.context); + log.success('Referenced content types and dependent modules exported successfully', this.exportQueryConfig.context); } catch (error) { - handleAndLogError(error, this.exportQueryConfig.context, 'Error exporting dependent modules'); + handleAndLogError(error, this.exportQueryConfig.context, 'Error during schema closure expansion'); throw error; } } @@ -314,21 +288,11 @@ export class QueryExporter { if (assetUIDs.length > 0) { log.info(`Found ${assetUIDs.length} referenced assets to export`, this.exportQueryConfig.context); + fs.mkdirSync(assetsDir, { recursive: true }); + // Define batch size - can be configurable through exportQueryConfig const batchSize = this.exportQueryConfig.assetBatchSize || 100; - if (assetUIDs.length <= batchSize) { - const query = { - modules: { - assets: { - uid: { $in: assetUIDs }, - }, - }, - }; - - await this.moduleExporter.exportModule('assets', { query }); - } - // if asset size is bigger than batch size, then we need to export in batches // Calculate number of batches const totalBatches = Math.ceil(assetUIDs.length / batchSize); diff --git a/src/utils/content-type-helper.ts b/src/utils/content-type-helper.ts index ebb326f..376be7f 100644 --- a/src/utils/content-type-helper.ts +++ b/src/utils/content-type-helper.ts @@ -47,12 +47,18 @@ export class ReferencedContentTypesHandler { const traverseSchema = (schemaArray: any[]) => { for (const field of schemaArray) { if (field.data_type === 'group' || field.data_type === 'global_field') { - // Recursively traverse group and global field schemas - traverseSchema(field.schema); + // Recursively traverse group and global field schemas. + // field.schema may be absent when a global_field is represented only by + // its reference_to UID (stub form in a content type's inline schema). + if (Array.isArray(field.schema) && field.schema.length > 0) { + traverseSchema(field.schema); + } } else if (field.data_type === 'blocks') { // Traverse each block's schema for (const blockKey in field.blocks) { - traverseSchema(field.blocks[blockKey].schema); + if (field.blocks[blockKey]?.schema) { + traverseSchema(field.blocks[blockKey].schema); + } } } else if (field.data_type === 'reference' && field.reference_to) { // Add reference field targets diff --git a/src/utils/dependency-resolver.ts b/src/utils/dependency-resolver.ts index 47c9572..c0c6374 100644 --- a/src/utils/dependency-resolver.ts +++ b/src/utils/dependency-resolver.ts @@ -1,7 +1,14 @@ import * as path from 'path'; import { QueryExportConfig } from '../types'; import { fsUtil } from './index'; -import { ContentstackClient, sanitizePath, log, formatError, handleAndLogError } from '@contentstack/cli-utilities'; +import { + ContentstackClient, + sanitizePath, + log, + formatError, + handleAndLogError, + readContentTypeSchemas, +} from '@contentstack/cli-utilities'; export class ContentTypeDependenciesHandler { private exportQueryConfig: QueryExportConfig; @@ -12,21 +19,36 @@ export class ContentTypeDependenciesHandler { this.stackAPIClient = stackAPIClient; } - async extractDependencies(): Promise<{ + /** + * Extract all dependencies (global fields, extensions, taxonomies, marketplace apps) from the + * provided schema documents. When `schemas` is omitted the method falls back to reading content + * type schemas from disk — kept for backward compatibility with callers that do not supply + * already-loaded documents. + * + * Pass the combined set of content-type AND global-field documents so that transitive + * dependencies inside global fields are discovered in the same pass. + */ + async extractDependencies(schemas?: any[]): Promise<{ globalFields: Set; extensions: Set; taxonomies: Set; marketplaceApps: Set; }> { - const contentTypesFilePath = path.join( - sanitizePath(this.exportQueryConfig.exportDir), - sanitizePath(this.exportQueryConfig.branchName || ''), - 'content_types', - 'schema.json', - ); - const allContentTypes = (fsUtil.readFile(sanitizePath(contentTypesFilePath)) as any[]) || []; - if (allContentTypes.length === 0) { - log.info('No content types found, skipping dependency extraction', this.exportQueryConfig.context); + let allSchemas: any[]; + + if (schemas !== undefined) { + allSchemas = schemas; + } else { + const contentTypesFilePath = path.join( + sanitizePath(this.exportQueryConfig.exportDir), + sanitizePath(this.exportQueryConfig.branchName || ''), + 'content_types', + ); + allSchemas = readContentTypeSchemas(contentTypesFilePath); + } + + if (allSchemas.length === 0) { + log.info('No schemas found, skipping dependency extraction', this.exportQueryConfig.context); return { globalFields: new Set(), extensions: new Set(), @@ -35,7 +57,7 @@ export class ContentTypeDependenciesHandler { }; } - log.info(`Extracting dependencies from ${allContentTypes.length} content types`, this.exportQueryConfig.context); + log.info(`Extracting dependencies from ${allSchemas.length} schema(s)`, this.exportQueryConfig.context); const dependencies = { globalFields: new Set(), @@ -44,9 +66,9 @@ export class ContentTypeDependenciesHandler { marketplaceApps: new Set(), }; - for (const contentType of allContentTypes) { - if (contentType.schema) { - this.traverseSchemaForDependencies(contentType.schema, dependencies); + for (const doc of allSchemas) { + if (doc.schema) { + this.traverseSchemaForDependencies(doc.schema, dependencies); } } @@ -152,7 +174,7 @@ export class ContentTypeDependenciesHandler { } // Recursive traversal for nested structures - if (field.data_type === 'group' && field.schema) { + if ((field.data_type === 'group' || field.data_type === 'global_field') && field.schema) { this.traverseSchemaForDependencies(field.schema, dependencies); } diff --git a/src/utils/query-parser.ts b/src/utils/query-parser.ts index bdd1c5b..752a7fb 100644 --- a/src/utils/query-parser.ts +++ b/src/utils/query-parser.ts @@ -37,6 +37,7 @@ export class QueryParser { return JSON.parse(queryString); } catch (error) { handleAndLogError(error, this.config.context, 'Invalid JSON query'); + throw new CLIError('Invalid JSON query'); } } diff --git a/test-export/main/assets/assets.json b/test-export/main/assets/assets.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/test-export/main/assets/assets.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test-export/main/assets/metadata.json b/test-export/main/assets/metadata.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/test-export/main/assets/metadata.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/unit/config-handler.test.ts b/test/unit/config-handler.test.ts index f91e1a0..bb4cb45 100644 --- a/test/unit/config-handler.test.ts +++ b/test/unit/config-handler.test.ts @@ -175,8 +175,8 @@ describe('Config Handler', () => { const config = await setupQueryExportConfig(flags); expect(config.stackApiKey).to.be.a('string'); } catch (error) { - // Expected behavior for missing API key - should fail with login error, not prompt - expect(error.message).to.include('login'); + // Expected when not authenticated: explicit error, not an interactive prompt + expect(error.message).to.include('Log in'); } }); }); diff --git a/test/unit/content-type-helper.test.ts b/test/unit/content-type-helper.test.ts index 71fe023..60606f4 100644 --- a/test/unit/content-type-helper.test.ts +++ b/test/unit/content-type-helper.test.ts @@ -444,4 +444,59 @@ describe('Content Type Helper Utilities', () => { expect(result).to.deep.equal([]); }); }); + + describe('extractReferencedContentTypes — global field and guard behaviour', () => { + it('should not throw when a global_field has no schema property (stub form)', async () => { + const batch = [ + { + uid: 'page', + schema: [ + { + uid: 'seo', + data_type: 'global_field', + reference_to: 'seo_gf', + // no schema array — this is the "stub" representation in a CT's inline schema + }, + ], + }, + ]; + + logStub = stub(logger, 'log'); + const result = await handler.extractReferencedContentTypes(batch); + expect(result).to.deep.equal([]); + }); + + it('should find CT references inside a global field document passed directly', async () => { + // The caller passes both the CT doc and the GF doc in the same batch. + const batch = [ + { + uid: 'page', + schema: [{ uid: 'seo', data_type: 'global_field', reference_to: 'seo_gf' }], + }, + { + uid: 'seo_gf', + schema: [{ uid: 'author_ref', data_type: 'reference', reference_to: ['author'] }], + }, + ]; + + logStub = stub(logger, 'log'); + const result = await handler.extractReferencedContentTypes(batch); + expect(result).to.include('author'); + }); + + it('should not recurse into global_field stub when schema is an empty array', async () => { + const batch = [ + { + uid: 'page', + schema: [ + { uid: 'seo', data_type: 'global_field', reference_to: 'seo_gf', schema: [] as any[] }, + ], + }, + ]; + + logStub = stub(logger, 'log'); + const result = await handler.extractReferencedContentTypes(batch); + expect(result).to.deep.equal([]); + }); + }); }); diff --git a/test/unit/dependency-resolver.test.ts b/test/unit/dependency-resolver.test.ts index 497d8d9..678127a 100644 --- a/test/unit/dependency-resolver.test.ts +++ b/test/unit/dependency-resolver.test.ts @@ -368,5 +368,233 @@ describe('Dependency Resolver Utilities', () => { expect(dependencies.extensions.size).to.equal(0); expect(dependencies.taxonomies.size).to.equal(0); }); + + it('should collect nested global field inside a global field schema', () => { + const schema = [ + { + uid: 'outer_global', + data_type: 'global_field', + reference_to: 'outer_gf_uid', + schema: [ + { + uid: 'inner_global', + data_type: 'global_field', + reference_to: 'inner_gf_uid', + }, + ], + }, + ]; + + const dependencies = { + globalFields: new Set(), + extensions: new Set(), + taxonomies: new Set(), + }; + + (handler as any).traverseSchemaForDependencies(schema, dependencies); + + expect(dependencies.globalFields.has('outer_gf_uid')).to.be.true; + expect(dependencies.globalFields.has('inner_gf_uid')).to.be.true; + expect(dependencies.globalFields.size).to.equal(2); + }); + + it('should collect extension nested inside a global field schema', () => { + const schema = [ + { + uid: 'seo_block', + data_type: 'global_field', + reference_to: 'seo_gf', + schema: [ + { + uid: 'rich_editor', + data_type: 'text', + extension_uid: 'nested_editor_ext', + }, + ], + }, + ]; + + const dependencies = { + globalFields: new Set(), + extensions: new Set(), + taxonomies: new Set(), + }; + + (handler as any).traverseSchemaForDependencies(schema, dependencies); + + expect(dependencies.globalFields.has('seo_gf')).to.be.true; + expect(dependencies.extensions.has('nested_editor_ext')).to.be.true; + }); + + it('should collect taxonomy nested inside a global field schema', () => { + const schema = [ + { + uid: 'tags_block', + data_type: 'global_field', + reference_to: 'tags_gf', + schema: [ + { + uid: 'categories', + data_type: 'taxonomy', + taxonomies: [{ taxonomy_uid: 'nested_taxonomy_uid' }], + }, + ], + }, + ]; + + const dependencies = { + globalFields: new Set(), + extensions: new Set(), + taxonomies: new Set(), + }; + + (handler as any).traverseSchemaForDependencies(schema, dependencies); + + expect(dependencies.globalFields.has('tags_gf')).to.be.true; + expect(dependencies.taxonomies.has('nested_taxonomy_uid')).to.be.true; + }); + + it('should collect deeply nested global field inside a global field inside a group', () => { + const schema = [ + { + uid: 'content_section', + data_type: 'group', + schema: [ + { + uid: 'outer_gf', + data_type: 'global_field', + reference_to: 'outer_gf_uid', + schema: [ + { + uid: 'inner_gf', + data_type: 'global_field', + reference_to: 'inner_gf_uid', + schema: [ + { + uid: 'deepest_gf', + data_type: 'global_field', + reference_to: 'deepest_gf_uid', + }, + ], + }, + ], + }, + ], + }, + ]; + + const dependencies = { + globalFields: new Set(), + extensions: new Set(), + taxonomies: new Set(), + }; + + (handler as any).traverseSchemaForDependencies(schema, dependencies); + + expect(dependencies.globalFields.has('outer_gf_uid')).to.be.true; + expect(dependencies.globalFields.has('inner_gf_uid')).to.be.true; + expect(dependencies.globalFields.has('deepest_gf_uid')).to.be.true; + expect(dependencies.globalFields.size).to.equal(3); + }); + }); + + describe('extractDependencies — explicit schemas parameter', () => { + let extensionQueryStub: sinon.SinonStub; + + beforeEach(() => { + extensionQueryStub = sinon.stub().returns({ find: sinon.stub().resolves({ items: [] }) }); + mockStackAPIClient.extension = sinon.stub().returns({ query: extensionQueryStub }); + handler = new ContentTypeDependenciesHandler(mockStackAPIClient, mockConfig); + }); + + it('should collect global field deps from provided CT schemas', async () => { + const schemas = [ + { uid: 'page', schema: [{ uid: 'seo', data_type: 'global_field', reference_to: 'seo_gf' }] }, + ]; + + const deps = await handler.extractDependencies(schemas); + + expect(deps.globalFields.has('seo_gf')).to.be.true; + }); + + it('should collect global field deps from provided GF schemas (transitive case)', async () => { + // GF A's schema contains a reference to GF B — simulates what happens when + // the caller passes the combined [CT doc, GF A doc] list. + const schemas = [ + { uid: 'page', schema: [{ uid: 'gf_a_field', data_type: 'global_field', reference_to: 'gf_a' }] }, + { + uid: 'gf_a', + schema: [{ uid: 'gf_b_field', data_type: 'global_field', reference_to: 'gf_b' }], + }, + ]; + + const deps = await handler.extractDependencies(schemas); + + expect(deps.globalFields.has('gf_a')).to.be.true; + expect(deps.globalFields.has('gf_b')).to.be.true; + }); + + it('should collect extension deps from GF schemas', async () => { + // Return the extension as a regular extension from the API so it ends up in deps.extensions. + extensionQueryStub = sinon.stub().returns({ + find: sinon.stub().resolves({ items: [{ uid: 'color_picker_ext' }] }), + }); + mockStackAPIClient.extension = sinon.stub().returns({ query: extensionQueryStub }); + handler = new ContentTypeDependenciesHandler(mockStackAPIClient, mockConfig); + + const schemas = [ + { uid: 'page', schema: [{ uid: 'gf_a_field', data_type: 'global_field', reference_to: 'gf_a' }] }, + { + uid: 'gf_a', + schema: [{ uid: 'bg_color', data_type: 'text', extension_uid: 'color_picker_ext' }], + }, + ]; + + const deps = await handler.extractDependencies(schemas); + + expect(deps.globalFields.has('gf_a')).to.be.true; + expect(deps.extensions.has('color_picker_ext')).to.be.true; + }); + + it('should collect taxonomy deps from GF schemas', async () => { + const schemas = [ + { uid: 'page', schema: [{ uid: 'gf_a_field', data_type: 'global_field', reference_to: 'gf_a' }] }, + { + uid: 'gf_a', + schema: [ + { + uid: 'tags', + data_type: 'taxonomy', + taxonomies: [{ taxonomy_uid: 'product_taxonomy' }], + }, + ], + }, + ]; + + const deps = await handler.extractDependencies(schemas); + + expect(deps.taxonomies.has('product_taxonomy')).to.be.true; + }); + + it('should return empty sets when schemas array is empty', async () => { + const deps = await handler.extractDependencies([]); + + expect(deps.globalFields.size).to.equal(0); + expect(deps.extensions.size).to.equal(0); + expect(deps.taxonomies.size).to.equal(0); + expect(deps.marketplaceApps.size).to.equal(0); + }); + + it('should skip docs that have no schema array', async () => { + const schemas = [ + { uid: 'page' }, // no schema property + { uid: 'blog', schema: [{ uid: 'seo', data_type: 'global_field', reference_to: 'seo_gf' }] }, + ]; + + const deps = await handler.extractDependencies(schemas); + + expect(deps.globalFields.has('seo_gf')).to.be.true; + expect(deps.globalFields.size).to.equal(1); + }); }); }); diff --git a/test/unit/module-exporter.test.ts b/test/unit/module-exporter.test.ts index 4d2b47c..3b7142c 100644 --- a/test/unit/module-exporter.test.ts +++ b/test/unit/module-exporter.test.ts @@ -55,7 +55,7 @@ describe('ModuleExporter', () => { expect(cmd).to.include('-k', 'test-stack-api-key'); expect(cmd).to.include('-d', './test-export'); expect(cmd).to.include('--module', 'entries'); - expect(cmd).to.include('-A', 'test-management-token'); + expect(cmd).to.include('-a', 'test-management-token'); expect(cmd).to.include('-y'); }); @@ -108,7 +108,7 @@ describe('ModuleExporter', () => { }); expect(cmd).to.include('-a', 'production-stack'); - expect(cmd).to.not.include('-A'); + expect(cmd).to.not.include('test-management-token'); }); it('should include external config path when specified', () => { @@ -145,7 +145,7 @@ describe('ModuleExporter', () => { expect(cmd).to.include('-d', './test-export'); expect(cmd).to.not.include('--branch'); expect(cmd).to.not.include('--config'); - expect(cmd).to.not.include('-A'); + expect(cmd).to.not.include('-a'); }); }); diff --git a/test/unit/query-executor.test.ts b/test/unit/query-executor.test.ts index 7ee316e..a3cfd4b 100644 --- a/test/unit/query-executor.test.ts +++ b/test/unit/query-executor.test.ts @@ -10,6 +10,7 @@ import { AssetReferenceHandler, fsUtil, } from '../../src/utils'; +import * as contentTypeUtils from '@contentstack/cli-utilities/lib/content-type-utils'; describe('QueryExporter', () => { let sandbox: sinon.SinonSandbox; @@ -38,6 +39,7 @@ describe('QueryExporter', () => { branchName: 'main', securedAssets: false, externalConfigPath: './config/export-config.json', + maxCTReferenceDepth: 20, }; // Stub logger to prevent console output during tests @@ -73,8 +75,7 @@ describe('QueryExporter', () => { let queryParserStub: sinon.SinonStub; let exportGeneralModulesStub: sinon.SinonStub; let exportQueriedModuleStub: sinon.SinonStub; - let exportReferencedContentTypesStub: sinon.SinonStub; - let exportDependentModulesStub: sinon.SinonStub; + let expandSchemaClosureStub: sinon.SinonStub; let exportContentModulesStub: sinon.SinonStub; beforeEach(() => { @@ -83,8 +84,7 @@ describe('QueryExporter', () => { }); exportGeneralModulesStub = sandbox.stub(queryExporter as any, 'exportGeneralModules').resolves(); exportQueriedModuleStub = sandbox.stub(queryExporter as any, 'exportQueriedModule').resolves(); - exportReferencedContentTypesStub = sandbox.stub(queryExporter as any, 'exportReferencedContentTypes').resolves(); - exportDependentModulesStub = sandbox.stub(queryExporter as any, 'exportDependentModules').resolves(); + expandSchemaClosureStub = sandbox.stub(queryExporter as any, 'expandSchemaClosure').resolves(); exportContentModulesStub = sandbox.stub(queryExporter as any, 'exportContentModules').resolves(); }); @@ -94,8 +94,7 @@ describe('QueryExporter', () => { expect(queryParserStub.calledOnce).to.be.true; expect(exportGeneralModulesStub.calledOnce).to.be.true; expect(exportQueriedModuleStub.calledOnce).to.be.true; - expect(exportReferencedContentTypesStub.calledOnce).to.be.true; - expect(exportDependentModulesStub.calledOnce).to.be.true; + expect(expandSchemaClosureStub.calledOnce).to.be.true; expect(exportContentModulesStub.calledOnce).to.be.true; }); @@ -106,8 +105,7 @@ describe('QueryExporter', () => { queryParserStub, exportGeneralModulesStub, exportQueriedModuleStub, - exportReferencedContentTypesStub, - exportDependentModulesStub, + expandSchemaClosureStub, exportContentModulesStub, ); }); @@ -235,146 +233,249 @@ describe('QueryExporter', () => { }); }); - describe('exportReferencedContentTypes', () => { + describe('expandSchemaClosure', () => { let moduleExporterStub: sinon.SinonStub; - let fsUtilStub: sinon.SinonStub; + let readContentTypeSchemasStub: sinon.SinonStub; let referencedHandlerStub: any; + let dependenciesHandlerStub: any; + + const mockCTs = [{ uid: 'page', title: 'Page', schema: [] as any[] }]; + const emptyDeps = { + globalFields: new Set(), + extensions: new Set(), + taxonomies: new Set(), + marketplaceApps: new Set(), + }; beforeEach(() => { moduleExporterStub = sandbox.stub((queryExporter as any).moduleExporter, 'exportModule').resolves(); - fsUtilStub = sandbox.stub(fsUtil, 'readFile'); - - // Mock file system responses - const mockContentTypes = [ - { uid: 'page', title: 'Page' }, - { uid: 'blog', title: 'Blog' }, - ]; - fsUtilStub.returns(mockContentTypes); - sandbox.stub(fsUtil, 'writeFile').returns(undefined); - - // Mock ReferencedContentTypesHandler - referencedHandlerStub = { - extractReferencedContentTypes: sandbox.stub().resolves(['referenced_type_1', 'referenced_type_2']), - }; + + // Default: CT path returns mockCTs, GF path returns empty. + readContentTypeSchemasStub = sandbox + .stub(contentTypeUtils, 'readContentTypeSchemas') + .callsFake((dirPath: string) => (dirPath.includes('global_fields') ? [] : mockCTs)); + + referencedHandlerStub = { extractReferencedContentTypes: sandbox.stub().resolves([]) }; sandbox .stub(ReferencedContentTypesHandler.prototype, 'extractReferencedContentTypes') .callsFake(referencedHandlerStub.extractReferencedContentTypes); + + dependenciesHandlerStub = { extractDependencies: sandbox.stub().resolves(emptyDeps) }; + sandbox + .stub(ContentTypeDependenciesHandler.prototype, 'extractDependencies') + .callsFake(dependenciesHandlerStub.extractDependencies); }); - it('should handle no referenced content types found', async () => { - referencedHandlerStub.extractReferencedContentTypes.resolves([]); + it('should export personalize exactly once when no new items are found', async () => { + await (queryExporter as any).expandSchemaClosure(); - await (queryExporter as any).exportReferencedContentTypes(); + const personalizeCalls = moduleExporterStub.getCalls().filter((c) => c.args[0] === 'personalize'); + expect(personalizeCalls).to.have.lengthOf(1); + // No CT or GF export should have happened + expect(moduleExporterStub.getCalls().filter((c) => c.args[0] === 'content-types')).to.have.lengthOf(0); + expect(moduleExporterStub.getCalls().filter((c) => c.args[0] === 'global-fields')).to.have.lengthOf(0); + }); - expect(moduleExporterStub.called).to.be.false; + it('should pass combined CT and GF schemas to extractReferencedContentTypes', async () => { + const mockGFs = [{ uid: 'seo_gf', schema: [] as any[] }]; + readContentTypeSchemasStub.callsFake((dirPath: string) => + dirPath.includes('global_fields') ? mockGFs : mockCTs, + ); + + await (queryExporter as any).expandSchemaClosure(); + + const callArgs = referencedHandlerStub.extractReferencedContentTypes.getCall(0).args[0]; + expect(callArgs).to.deep.include({ uid: 'page', title: 'Page', schema: [] as any[] }); + expect(callArgs).to.deep.include({ uid: 'seo_gf', schema: [] as any[] }); + }); + + it('should pass combined CT and GF schemas to extractDependencies', async () => { + const mockGFs = [{ uid: 'seo_gf', schema: [] as any[] }]; + readContentTypeSchemasStub.callsFake((dirPath: string) => + dirPath.includes('global_fields') ? mockGFs : mockCTs, + ); + + await (queryExporter as any).expandSchemaClosure(); + + const callArgs = dependenciesHandlerStub.extractDependencies.getCall(0).args[0]; + expect(callArgs).to.deep.include({ uid: 'page', title: 'Page', schema: [] as any[] }); + expect(callArgs).to.deep.include({ uid: 'seo_gf', schema: [] as any[] }); }); - it('should export new referenced content types', async () => { - // First call returns references, second call returns empty (no more references) + it('should export new referenced content types found in CT schemas', async () => { referencedHandlerStub.extractReferencedContentTypes .onFirstCall() - .resolves(['new_type_1', 'new_type_2']) - .onSecondCall() + .resolves(['new_ct']) .resolves([]); - await (queryExporter as any).exportReferencedContentTypes(); + await (queryExporter as any).expandSchemaClosure(); - expect(moduleExporterStub.calledOnce).to.be.true; - const exportCall = moduleExporterStub.getCall(0); - expect(exportCall.args[0]).to.equal('content-types'); - expect(exportCall.args[1].query.modules['content-types'].uid.$in).to.deep.equal(['new_type_1', 'new_type_2']); + const ctCall = moduleExporterStub.getCalls().find((c) => c.args[0] === 'content-types'); + expect(ctCall).to.exist; + expect(ctCall!.args[1].query.modules['content-types'].uid.$in).to.deep.equal(['new_ct']); }); - it('should handle file system errors gracefully', async () => { - fsUtilStub.throws(new Error('File not found')); + it('should export new global fields discovered from CT schemas', async () => { + dependenciesHandlerStub.extractDependencies + .onFirstCall() + .resolves({ globalFields: new Set(['gf_a']), extensions: new Set(), taxonomies: new Set(), marketplaceApps: new Set() }) + .resolves(emptyDeps); - try { - await (queryExporter as any).exportReferencedContentTypes(); - expect.fail('Should have thrown error'); - } catch (error) { - expect(error.message).to.equal('File not found'); - } + await (queryExporter as any).expandSchemaClosure(); + + const gfCall = moduleExporterStub.getCalls().find((c) => c.args[0] === 'global-fields'); + expect(gfCall).to.exist; + expect(gfCall!.args[1].query.modules['global-fields'].uid.$in).to.deep.equal(['gf_a']); }); - }); - describe('exportDependentModules', () => { - let moduleExporterStub: sinon.SinonStub; - let dependenciesHandlerStub: any; + it('should iterate to find CT references inside global field schemas', async () => { + // Iter 1: GF A is newly discovered from CT deps. GF A is not yet on disk. + // Iter 2: GF A is now on disk; its schema exposes a reference to CT B. + const gfADoc = [{ uid: 'gf_a', schema: [] as any[] }]; - beforeEach(() => { - moduleExporterStub = sandbox.stub((queryExporter as any).moduleExporter, 'exportModule').resolves(); + readContentTypeSchemasStub.callsFake((dirPath: string) => { + if (dirPath.includes('global_fields')) { + return dependenciesHandlerStub.extractDependencies.callCount > 1 ? gfADoc : []; + } + return mockCTs; + }); - // Mock ContentTypeDependenciesHandler - dependenciesHandlerStub = { - extractDependencies: sandbox.stub().returns({ - globalFields: new Set(['global_field_1', 'global_field_2']), - extensions: new Set(['extension_1']), - taxonomies: new Set(['taxonomy_1', 'taxonomy_2']), - }), - }; - sandbox - .stub(ContentTypeDependenciesHandler.prototype, 'extractDependencies') - .callsFake(dependenciesHandlerStub.extractDependencies); + dependenciesHandlerStub.extractDependencies + .onFirstCall() + .resolves({ globalFields: new Set(['gf_a']), extensions: new Set(), taxonomies: new Set(), marketplaceApps: new Set() }) + .resolves(emptyDeps); + + referencedHandlerStub.extractReferencedContentTypes + .onFirstCall().resolves([]) // iter 1: only CTs on disk, no CT refs + .onSecondCall().resolves(['ct_b']) // iter 2: GF A adds a CT ref to ct_b + .resolves([]); + + await (queryExporter as any).expandSchemaClosure(); + + const ctCall = moduleExporterStub.getCalls().find((c) => c.args[0] === 'content-types'); + expect(ctCall).to.exist; + expect(ctCall!.args[1].query.modules['content-types'].uid.$in).to.include('ct_b'); + + const gfCall = moduleExporterStub.getCalls().find((c) => c.args[0] === 'global-fields'); + expect(gfCall).to.exist; + expect(gfCall!.args[1].query.modules['global-fields'].uid.$in).to.include('gf_a'); }); - it('should export all dependency types when found', async () => { - await (queryExporter as any).exportDependentModules(); + it('should not re-export already exported global fields across iterations', async () => { + // gf_a is returned by extractDependencies on every call, but should only be exported once. + dependenciesHandlerStub.extractDependencies.resolves({ + globalFields: new Set(['gf_a']), + extensions: new Set(), + taxonomies: new Set(), + marketplaceApps: new Set(), + }); - expect(moduleExporterStub.callCount).to.equal(3); + // Trigger a second iteration via a new CT reference so we can verify gf_a is not re-exported. + referencedHandlerStub.extractReferencedContentTypes + .onFirstCall().resolves(['new_ct']) + .resolves([]); + + await (queryExporter as any).expandSchemaClosure(); - // Check global fields export - const globalFieldsCall = moduleExporterStub.getCall(0); - expect(globalFieldsCall.args[0]).to.equal('global-fields'); - expect(globalFieldsCall.args[1].query.modules['global-fields'].uid.$in).to.deep.equal([ - 'global_field_1', - 'global_field_2', - ]); + const gfCalls = moduleExporterStub.getCalls().filter((c) => c.args[0] === 'global-fields'); + expect(gfCalls).to.have.lengthOf(1); + }); - // Check extensions export - const extensionsCall = moduleExporterStub.getCall(1); - expect(extensionsCall.args[0]).to.equal('extensions'); - expect(extensionsCall.args[1].query.modules.extensions.uid.$in).to.deep.equal(['extension_1']); + it('should not re-export already exported content types across iterations', async () => { + // new_ct returned on first AND second call — should only be exported once. + referencedHandlerStub.extractReferencedContentTypes + .onFirstCall().resolves(['new_ct']) + .onSecondCall().resolves(['new_ct']) // already exported — should be filtered + .resolves([]); - // Check taxonomies export - const taxonomiesCall = moduleExporterStub.getCall(2); - expect(taxonomiesCall.args[0]).to.equal('taxonomies'); - expect(taxonomiesCall.args[1].query.modules.taxonomies.uid.$in).to.deep.equal(['taxonomy_1', 'taxonomy_2']); + // Trigger a second iteration via a new GF dep. + dependenciesHandlerStub.extractDependencies + .onFirstCall().resolves({ globalFields: new Set(['gf_a']), extensions: new Set(), taxonomies: new Set(), marketplaceApps: new Set() }) + .resolves(emptyDeps); + + await (queryExporter as any).expandSchemaClosure(); + + const ctCalls = moduleExporterStub.getCalls().filter((c) => c.args[0] === 'content-types'); + expect(ctCalls).to.have.lengthOf(1); }); - it('should skip empty dependency sets', async () => { - dependenciesHandlerStub.extractDependencies.returns({ + it('should export extensions, taxonomies, and marketplace apps as leaf deps', async () => { + dependenciesHandlerStub.extractDependencies.resolves({ globalFields: new Set(), - extensions: new Set(), - taxonomies: new Set(), + extensions: new Set(['ext_1']), + taxonomies: new Set(['tax_1']), + marketplaceApps: new Set(['mp_app_1']), }); - await (queryExporter as any).exportDependentModules(); + await (queryExporter as any).expandSchemaClosure(); - expect(moduleExporterStub.called).to.be.false; + expect(moduleExporterStub.getCalls().some((c) => c.args[0] === 'extensions')).to.be.true; + expect(moduleExporterStub.getCalls().some((c) => c.args[0] === 'taxonomies')).to.be.true; + expect(moduleExporterStub.getCalls().some((c) => c.args[0] === 'marketplace-apps')).to.be.true; }); - it('should handle partial dependencies', async () => { - dependenciesHandlerStub.extractDependencies.returns({ - globalFields: new Set(['global_field_1']), - extensions: new Set(), - taxonomies: new Set(['taxonomy_1']), + it('should skip CT reference extraction when skipReferences is true', async () => { + mockConfig.skipReferences = true; + const localExporter = new QueryExporter(mockManagementClient, mockConfig); + const localModuleStub = sandbox.stub((localExporter as any).moduleExporter, 'exportModule').resolves(); + + await (localExporter as any).expandSchemaClosure(); + + expect(referencedHandlerStub.extractReferencedContentTypes.called).to.be.false; + expect(localModuleStub.getCalls().filter((c) => c.args[0] === 'content-types')).to.have.lengthOf(0); + }); + + it('should skip dependency extraction when skipDependencies is true', async () => { + mockConfig.skipDependencies = true; + const localExporter = new QueryExporter(mockManagementClient, mockConfig); + const localModuleStub = sandbox.stub((localExporter as any).moduleExporter, 'exportModule').resolves(); + + await (localExporter as any).expandSchemaClosure(); + + expect(dependenciesHandlerStub.extractDependencies.called).to.be.false; + expect(localModuleStub.getCalls().filter((c) => c.args[0] === 'global-fields')).to.have.lengthOf(0); + }); + + it('should stop after maxCTReferenceDepth iterations', async () => { + mockConfig.maxCTReferenceDepth = 2; + const localExporter = new QueryExporter(mockManagementClient, mockConfig); + sandbox.stub((localExporter as any).moduleExporter, 'exportModule').resolves(); + + // Always report new GFs so the loop never naturally terminates. + let callN = 0; + dependenciesHandlerStub.extractDependencies.callsFake(() => { + callN++; + return Promise.resolve({ + globalFields: new Set([`gf_${callN}`]), + extensions: new Set(), + taxonomies: new Set(), + marketplaceApps: new Set(), + }); }); - await (queryExporter as any).exportDependentModules(); + await (localExporter as any).expandSchemaClosure(); - expect(moduleExporterStub.callCount).to.equal(2); - expect(moduleExporterStub.calledWith('global-fields')).to.be.true; - expect(moduleExporterStub.calledWith('taxonomies')).to.be.true; - expect(moduleExporterStub.calledWith('extensions')).to.be.false; + expect(dependenciesHandlerStub.extractDependencies.callCount).to.be.at.most(2); }); - it('should handle dependencies extraction errors', async () => { - dependenciesHandlerStub.extractDependencies.throws(new Error('Dependencies extraction failed')); + it('should propagate errors from extractReferencedContentTypes', async () => { + referencedHandlerStub.extractReferencedContentTypes.rejects(new Error('Handler failed')); try { - await (queryExporter as any).exportDependentModules(); + await (queryExporter as any).expandSchemaClosure(); expect.fail('Should have thrown error'); - } catch (error) { + } catch (error: any) { + expect(error.message).to.equal('Handler failed'); + } + }); + + it('should propagate errors from extractDependencies', async () => { + dependenciesHandlerStub.extractDependencies.rejects(new Error('Dependencies extraction failed')); + + try { + await (queryExporter as any).expandSchemaClosure(); + expect.fail('Should have thrown error'); + } catch (error: any) { expect(error.message).to.equal('Dependencies extraction failed'); } }); @@ -408,7 +509,7 @@ describe('QueryExporter', () => { await (queryExporter as any).exportContentModules(); expect(setTimeoutStub.calledOnce).to.be.true; - expect(setTimeoutStub.calledWith(sinon.match.func, 10000)).to.be.true; + expect(setTimeoutStub.calledWith(sinon.match.func, 5000)).to.be.true; }); it('should handle entries export errors', async () => { diff --git a/test/unit/query-parser-simple.test.ts b/test/unit/query-parser-simple.test.ts index 8d3eaa6..297259b 100644 --- a/test/unit/query-parser-simple.test.ts +++ b/test/unit/query-parser-simple.test.ts @@ -79,7 +79,7 @@ describe('Query Parser Simple Tests', () => { expect.fail('Expected validation error'); } catch (error) { expect(error).to.be.instanceOf(CLIError); - expect(error.message).to.equal('Query must contain a "modules" object'); + expect(error.message).to.equal('The query must contain a "modules" object.'); } }); @@ -91,7 +91,7 @@ describe('Query Parser Simple Tests', () => { expect.fail('Expected validation error'); } catch (error) { expect(error).to.be.instanceOf(CLIError); - expect(error.message).to.equal('Query must contain at least one module'); + expect(error.message).to.equal('The query must contain at least one module.'); } }); @@ -139,7 +139,7 @@ describe('Query Parser Simple Tests', () => { expect.fail('Expected validation error'); } catch (error) { expect(error).to.be.instanceOf(CLIError); - expect(error.message).to.equal('Query must be a valid JSON object'); + expect(error.message).to.equal('The query must be a valid JSON object.'); } }); @@ -149,7 +149,7 @@ describe('Query Parser Simple Tests', () => { expect.fail('Expected validation error'); } catch (error) { expect(error).to.be.instanceOf(CLIError); - expect(error.message).to.equal('Query must be a valid JSON object'); + expect(error.message).to.equal('The query must be a valid JSON object.'); } }); });