diff --git a/.cursor/rules/README.md b/.cursor/rules/README.md index 198feca..d8f3545 100644 --- a/.cursor/rules/README.md +++ b/.cursor/rules/README.md @@ -1,20 +1,5 @@ -# Cursor rules for `@contentstack/datasync-manager` +# Cursor (optional) -Rules live in this folder as `.mdc` (and `dev-workflow.md`) with YAML frontmatter. Use them so changes stay aligned with DataSync, the Sync API, and this repo’s TypeScript/Jest setup. +*Cursor* users: start at *[AGENTS.md](../../AGENTS.md)*. All conventions live in **skills/*/SKILL.md**. -## How to reference rules - -In Cursor chat, you can **@** mention a rule file (e.g. `@dev-workflow`, `@typescript`, `@contentstack-datasync-sync-api`, `@testing`, `@code-review`) to pull it into context when working on matching files or tasks. - -| File | `alwaysApply` | `globs` | When it applies | -|------|---------------|---------|-----------------| -| [dev-workflow.md](./dev-workflow.md) | no | *(none)* | Branching, CI/versioning, how to run lint/tests, PR expectations. | -| [typescript.mdc](./typescript.mdc) | no | `src/**/*.ts` | TypeScript layout, logging (`debug`), style notes (TSLint/ESLint, `tsconfig`). | -| [contentstack-datasync-sync-api.mdc](./contentstack-datasync-sync-api.mdc) | no | `src/api.ts`, `src/config.ts`, `src/core/**/*.ts` | Sync API usage: delivery token, host/branch, retries, `https` client behavior — **not** CMA. | -| [testing.mdc](./testing.mdc) | no | `test/**/*.ts`, `jest.config.js` | Jest, nock, `PLUGIN_PATH`, dummy config paths. | -| [code-review.mdc](./code-review.mdc) | **yes** | *(global)* | PR checklist: API docs, compatibility, errors, security, tests, DataSync terminology. | - -## Related docs - -- [AGENTS.md](../../AGENTS.md) — single entry point for the repo. -- [skills/README.md](../../skills/README.md) — expanded checklists and how-tos. +This folder only points contributors to *AGENTS.md* so editor-specific config does not duplicate the canonical docs. diff --git a/.cursor/rules/code-review.mdc b/.cursor/rules/code-review.mdc deleted file mode 100644 index 9683482..0000000 --- a/.cursor/rules/code-review.mdc +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: PR review checklist for DataSync Manager (Sync API, TypeScript, Jest) -alwaysApply: true ---- - -# Code review checklist - -## Product and API - -- **Terminology**: This repo is **DataSync Manager** + **Sync API** + **delivery token**. Do not describe it as the **CMA** (Management API) SDK unless the change truly involves management APIs (rare here). -- **Public API**: Exported functions/types in `src/index.ts` (and any new entry points) need accurate **JSDoc** where the project already documents behavior. - -## Behavior and compatibility - -- **Backward compatibility**: Avoid breaking changes to `start`, `setConfig`, store interfaces, queue behavior, and on-disk token/checkpoint files without a major version and migration notes. -- **Errors**: Rejections and thrown errors should remain actionable; Sync API **error 141** recovery and retry paths in `src/api.ts` must not regress into infinite loops. -- **Null / undefined**: Keep defensive checks consistent with `src/util/validations.ts` patterns. - -## Security and dependencies - -- **SSRF / URL handling**: Changes to request path construction must preserve sanitization (`URL` + `sanitize-url`) in `src/api.ts`. -- **Dependencies / SCA**: New packages need justification; align with Snyk pre-commit expectations. - -## Tests - -- **Unit / integration**: Exercise new logic with Jest + nock where HTTP is involved; mirror patterns in `test/`. -- **Coverage**: Meaningful branches for retries, errors, and core sync paths. - -## Severity (optional labels) - -- **Blocker**: Security regression, data loss risk, infinite retry loops, broken public API contract. -- **Major**: Incorrect Sync API behavior, missing tests for critical paths, breaking change without version strategy. -- **Minor**: Style, logging, non-user-facing refactors, doc-only gaps. diff --git a/.cursor/rules/contentstack-datasync-sync-api.mdc b/.cursor/rules/contentstack-datasync-sync-api.mdc deleted file mode 100644 index ca41f30..0000000 --- a/.cursor/rules/contentstack-datasync-sync-api.mdc +++ /dev/null @@ -1,31 +0,0 @@ ---- -description: Contentstack DataSync Sync API patterns (delivery token, retries, HTTPS) -globs: "{src/api.ts,src/config.ts,src/core/**/*.ts}" -alwaysApply: false ---- - -# DataSync Manager ↔ Sync API (not CMA) - -This package is **not** the Content Management API (CMA) client. It synchronizes stack data using the **Sync API** with a **delivery token** and stack metadata. - -## Configuration (`src/config.ts` / runtime `contentstack` object) - -- **Host / protocol / port**: Defaults include `host: 'cdn.contentstack.io'`, `protocol: 'https:'`, `port: 443`. -- **Endpoints**: e.g. `apis.sync: '/v3/stacks/sync'`, `apis.content_types: '/v3/content_types/'`. -- **Auth headers** (set in `src/api.ts` `init`): `api_key`, `access_token` (delivery token), optional `branch`, `X-User-Agent` (`datasync-manager/v`). -- **Retries / timing**: `MAX_RETRY_LIMIT`, `RETRY_DELAY_BASE`, `TIMEOUT` — overridable from user config. - -## HTTP client behavior (`src/api.ts`) - -- Uses Node **`https.request`**; paths are built from config and query strings; **SSRF** mitigation uses `URL` + `@braintree/sanitize-url` on path/query. -- **429** and **5xx**: Retries with backoff (`Math.pow(Math.SQRT2, RETRY) * RETRY_DELAY_BASE`). -- **Error 141** (invalid `sync_token`): Clears tokens, sets `init: true`, single recovery attempt to avoid loops. -- **Network errors** (`ECONNRESET`, `ETIMEDOUT`, etc.): Retries up to `MAX_RETRY_LIMIT`. - -## Core sync (`src/core/`) - -- Queue, plugin pipeline, token persistence (`.tokens`, `.checkpoint`, `.ledger` — see `npm run clean`), and webhook/fallback behavior tie back to Sync API semantics — preserve on-disk contract when changing persistence. - -## Wording - -- Say **Sync API**, **delivery token**, **DataSync** — not “CMA” for this module’s primary behavior. diff --git a/.cursor/rules/dev-workflow.md b/.cursor/rules/dev-workflow.md deleted file mode 100644 index 9bed592..0000000 --- a/.cursor/rules/dev-workflow.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -description: Branches, lint/tests, PR expectations, versioning for DataSync Manager -alwaysApply: false ---- - -# Development workflow - -## Branches - -- Use **feature branches** for new work; open pull requests against **`development`** to integrate changes. -- For a **release**, open a pull request from **`development`** into **`master`**. Releases to npm are driven from **`master`**. - -## Running checks locally - -| Task | Command | -|------|---------| -| Compile | `npm run compile` or `npm run build-ts` | -| Tests | `npm test` (sets `PLUGIN_PATH=./test/dummy`; Jest + coverage) | -| ESLint | `npm run lint` — pass paths if your ESLint config expects them (project may rely on default CLI behavior until an explicit config is added). | -| TSLint | `npm run tslint` — legacy; still targets `src/**/*.ts`. | - -## Pre-commit - -- `.husky/pre-commit` runs **Talisman** (secrets) and **Snyk** (`snyk test --all-projects --fail-on=all`). Both must pass unless `SKIP_HOOK=1` is set intentionally. - -## PR expectations - -- Keep changes scoped; match existing patterns in `src/` and `test/`. -- Run **`npm test`** before pushing when touching runtime logic. -- If you add or change **secrets or tokens**, ensure Talisman allowlists (e.g. `.talismanrc`) are updated only with team approval. - -## Versioning - -- `package.json` version must advance for releases; a PR check (`.github/workflows/check-version-bump.yml`) may enforce bumps when certain files change — **note:** that workflow’s path filters may still reflect a boilerplate layout; confirm with maintainers whether `src/` changes are included in “code changed” for your PR. diff --git a/.cursor/rules/testing.mdc b/.cursor/rules/testing.mdc deleted file mode 100644 index 8749521..0000000 --- a/.cursor/rules/testing.mdc +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: Jest tests, nock mocks, PLUGIN_PATH, dummy fixtures -globs: "{test/**/*.ts,jest.config.js}" -alwaysApply: false ---- - -# Testing - -## Runner and config - -- **Jest** with **ts-jest** (`jest.config.js`): Node environment, `test/**/*.ts` + `test/**/*.js`, verbose, coverage to `coverage/`, HTML reporter. -- **`test/dummy/`** is **ignored** as test paths (`testPathIgnorePatterns`) — holds plugins, API response fixtures, `config.ts`, connector mocks. - -## Running tests - -- **`npm test`** runs: `PLUGIN_PATH=./test/dummy jest --colors --coverage --verbose` - - `PLUGIN_PATH` points at dummy plugins under `test/dummy/plugins/`. - -## Structure - -- **`test/index.ts`**, **`test/api.ts`**, **`test/core/*.ts`** — suites exercising sync flows with **nock** against a fake host (e.g. `https://api.localhost.io` from dummy config). -- **`test/util/`** — shared test helpers. -- **`test/dummy/api-responses/`** — canned JSON-like payloads for publish/unpublish/delete, references, markdown, etc. - -## Live stack / env - -- Default tests do **not** require real Contentstack credentials; they use dummy `apiKey` / `deliveryToken` in `test/dummy/config.ts`. -- If you add true integration tests later, document required env vars (e.g. stack token, host) in the test file and in `skills/testing/SKILL.md`. - -## Naming - -- No strict `*.spec.ts` convention — files are descriptive (`sync.ts`, `token-management.ts`, etc.) under `test/`. diff --git a/.cursor/rules/typescript.mdc b/.cursor/rules/typescript.mdc deleted file mode 100644 index 398d4a7..0000000 --- a/.cursor/rules/typescript.mdc +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: TypeScript source conventions for DataSync Manager -globs: src/**/*.ts -alwaysApply: false ---- - -# TypeScript (`src/`) - -## Layout - -- **`src/index.ts`** — public API surface (stores, listener, `start`, queue helpers, notifications). -- **`src/api.ts`** — Sync API HTTP client (Node `https`); see `contentstack-datasync-sync-api` rule. -- **`src/core/`** — sync orchestration, queue, plugins, token handling, inet pinger. -- **`src/util/`** — logger (`debug`-backed), validation, paths, small helpers. -- **`src/plugins/`** — JavaScript plugins (allowJs in `tsconfig`). - -## Compiler / style - -- **`tsconfig.json`**: `target` ES6, `module` CommonJS, `strict` checks via `alwaysStrict`, `noImplicitReturns`, unused locals/parameters, etc. -- **Logging**: Prefer the `debug` package with stable namespaces (e.g. `Debug('sm:index')`, `Debug('api')`); avoid raw `console` in library code where `logger` or `debug` is used elsewhere. -- **Lint**: ESLint is listed in `package.json`; TSLint is legacy (`tslint.json`, max line length 120, 2-space indent). New code should satisfy existing TSLint/ESLint expectations when run. - -## Dependencies - -- Do not add HTTP clients unless there is a strong reason — **`https`** is the standard for Contentstack requests here. diff --git a/.github/workflows/issues-jira.yml b/.github/workflows/issues-jira.yml deleted file mode 100644 index 7bf0469..0000000 --- a/.github/workflows/issues-jira.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Create Jira Ticket for Github Issue - -on: - issues: - types: [opened] - -jobs: - issue-jira: - runs-on: ubuntu-latest - steps: - - - name: Login to Jira - uses: atlassian/gajira-login@master - env: - JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} - JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} - JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} - - - name: Create Jira Issue - id: create_jira - uses: atlassian/gajira-create@master - with: - project: ${{ secrets.JIRA_PROJECT }} - issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} - summary: Github | Issue | ${{ github.event.repository.name }} | ${{ github.event.issue.title }} - description: | - *GitHub Issue:* ${{ github.event.issue.html_url }} - - *Description:* - ${{ github.event.issue.body }} - fields: "${{ secrets.ISSUES_JIRA_FIELDS }}" \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..bf17200 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,57 @@ +name: Release + +on: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + # Checkout the repository + - name: Checkout repository + uses: actions/checkout@v4 + + # Setup Node.js environment + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22.x" + + # Install dependencies + - name: Install dependencies + run: npm install + + # Build (dist/ is published per package.json "files") + - name: Build + run: npm run build-ts + + # Fetch package details (name and version) + - name: Get package details + id: package + uses: codex-team/action-nodejs-package-info@v1.1 + + # Pack the package into a .tgz archive (@contentstack/datasync-manager → contentstack-datasync-manager-.tgz) + - name: Pack the npm package + run: npm pack + + # Publish the package to npm + - name: Publish to npm + id: publish_npm + uses: JS-DevTools/npm-publish@v3 + with: + token: ${{ secrets.NPM_TOKEN }} + # access: public # Uncomment if you need to publish a scoped package as public for the first time + + # Upload the packaged .tgz to the release that triggered this workflow + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: "./contentstack-datasync-manager-${{ steps.package.outputs.version }}.tgz" + asset_name: "contentstack-datasync-manager-${{ steps.package.outputs.version }}.tgz" + asset_content_type: application/tgz diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index 2307d48..79b6557 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -5,6 +5,9 @@ on: jobs: security-sca: runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write steps: - uses: actions/checkout@master - name: Run Snyk to check for vulnerabilities diff --git a/.talismanrc b/.talismanrc index 0dbc96a..8f0d67b 100644 --- a/.talismanrc +++ b/.talismanrc @@ -4,9 +4,10 @@ fileignoreconfig: - filecontent - filename: .github/workflows/check-version-bump.yml ignore_detectors: - - filecontent -- filename: package-lock.json - checksum: 1525b038bc7500db7a4b489db28529cd0b2ada15afc7110d818fe13657303612 -- filename: .husky/pre-commit - checksum: 1b9367d219802de2e3a8af9c5c698e0c255c00af89339d73bdbb8acf5275079f -version: "" +- filename: skills/dev-workflow/SKILL.md + checksum: c9fa42c57463f3d00aa34ab6c8b4e58b984cd6a3a5878d25596e6e66abb4a129 +- filename: skills/contentstack-datasync/SKILL.md + checksum: 62cf62a46c4dcdd9603b1e6ef910e0d77dfa39d2350db992a6a45d3a2791eaee +- filename: skills/testing/SKILL.md + checksum: ab1f82b284189e2779570d4fd5edcde93494c1ee01110da9f0be6f1f5cf5177b +version: "1.0" diff --git a/AGENTS.md b/AGENTS.md index a544ae8..da24e28 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,61 +1,47 @@ -# @contentstack/datasync-manager +# @contentstack/datasync-manager – Agent guide -## What this package is +*Universal entry point* for contributors and AI agents. Detailed conventions live in **skills/*/SKILL.md**. -**Contentstack DataSync Manager** — the primary Node.js module for [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync). It runs on your server, coordinates **content stores**, **asset stores**, and a **listener** (webhooks), and pulls stack changes via the **Contentstack Sync API** using a **delivery token** (read/sync path). +## What this repo is -This is **not** the general-purpose Content Delivery API (CDA) or Content Management API (CMA) SDK packages. It is purpose-built for **synchronization** (`/v3/stacks/sync`, tokens, plugins, queues). Terminology in reviews and docs should say **DataSync** / **Sync API**, not “CMA” unless you are discussing something that truly uses Management APIs (this codebase does not). +| Field | Detail | +|-------|--------| +| *Name:* | [`@contentstack/datasync-manager`](https://github.com/contentstack/datasync-manager) | +| *Purpose:* | Primary Node.js module for [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync): coordinates content stores, asset stores, and a listener (webhooks), and pulls stack changes via the **Contentstack Sync API** with a **delivery token**. | +| *Out of scope (if any):* | Not the standalone CDA or CMA client SDKs; not a generic HTTP client library—sync orchestration and Node **`https`** to the Sync API only. Say **DataSync** / **Sync API**, not “CMA”, for this package’s main behavior. | -- **Repository:** https://github.com/contentstack/datasync-manager -- **Homepage / product docs:** https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync - -## Tech stack +## Tech stack (at a glance) | Area | Details | |------|---------| -| Language | TypeScript **4.9.x** (compiles to ES6, CommonJS) | -| Runtime | Node.js **>= 8** (`engines` in `package.json`) | -| Build | `tsc` → `dist/`; types path `typings` (see `package.json` `types`) | -| Tests | **Jest** **29** + **ts-jest**; **nock** for HTTP mocking | -| HTTP client | Node **`https`** (no axios/fetch dependency) | -| Logging | **`debug`** (namespaces such as `sm:index`, `api`) + pluggable logger via `util/logger` | -| Other libs | `lodash`, `marked`, `@braintree/sanitize-url`, `write-file-atomic`, etc. (see `package.json`) | - -## Public entry points and layout - -| Role | Path | -|------|------| -| Package main | `dist/index.js` (built from `src/index.ts`) | -| Sync HTTP API wrapper | `src/api.ts` | -| Default config (Sync API paths, host, retries) | `src/config.ts` | -| Core sync loop, queue, plugins | `src/core/` | -| Utilities (logger, validation, paths) | `src/util/` | -| Built-in plugins (JS) | `src/plugins/` | -| Example consumer | `example/` | -| Tests + dummy stack config / mocks | `test/` (`test/dummy/` is fixtures; ignored as tests by Jest `testPathIgnorePatterns`) | - -Exports from `src/index.ts` include `start`, `setConfig`, `getConfig`, `setContentStore`, `setAssetStore`, `setListener`, `push` / `unshift` / `pop`, `notifications`, etc. - -## Common commands - -| Command | Purpose | -|---------|---------| -| `npm run compile` | TypeScript compile to `dist/` | -| `npm run build-ts` | Clean + full compile (`clean` + `tsc`) | -| `npm test` | Jest with coverage and verbose output; sets `PLUGIN_PATH=./test/dummy` | -| `npm run lint` | ESLint (ensure project config exists or use defaults) | -| `npm run tslint` | TSLint on `src/**/*.ts` (legacy; still in `package.json`) | - -Tests are **unit/integration-style** against **nock**-mocked HTTP and dummy connectors; there is no separate “live stack” test suite in-repo by default. - -## Credentials and environment - -- **Live / integration** tests against a real stack are **not** wired in this repo’s default `npm test`. -- Dummy config uses **delivery token** + **api key** in `test/dummy/config.ts` (mock values). -- Real deployments need stack **delivery token**, **api key**, optional **branch**, **environment**, sync tokens, and host/protocol as your app supplies via config (see `src/config.ts` and `src/api.ts` `init`). -- Pre-commit may run **Talisman** and **Snyk** (see `.husky/pre-commit`); use `SKIP_HOOK=1` only when appropriate. - -## Agent guidance index - -- **Cursor rules (overview):** [.cursor/rules/README.md](.cursor/rules/README.md) -- **Skills (deep dives):** [skills/README.md](skills/README.md) +| Language | TypeScript **4.9.x** → ES6, CommonJS (`tsconfig.json`); Node **>= 8** (`package.json` `engines`) | +| Build | `tsc` → `dist/`; `types` → `typings` (`package.json`) | +| Tests | **Jest** **29** + **ts-jest**; patterns in `jest.config.js`; tests under `test/**/*.ts` | +| Lint / coverage | **ESLint** (`npm run lint`); legacy **TSLint** (`tslint.json`, `npm run tslint`); Jest coverage to `coverage/` | +| Other | HTTP via Node **`https`**; logging via **`debug`** + `src/util/logger`; pre-commit **Talisman** + **Snyk** (`.husky/pre-commit`) | + +## Commands (quick reference) + +| Command type | Command | +|--------------|---------| +| Build | `npm run compile` or `npm run build-ts` (`clean` + `tsc`) | +| Test | `npm test` (`PLUGIN_PATH=./test/dummy` + Jest, coverage, verbose) | +| Lint | `npm run lint` / `npm run tslint` | + +CI: [.github/workflows/check-version-bump.yml](.github/workflows/check-version-bump.yml) (version bump checks on PRs when applicable). + +## Where the documentation lives: skills + +| Skill | Path | What it covers | +|-------|------|----------------| +| Development workflow | [skills/dev-workflow/SKILL.md](skills/dev-workflow/SKILL.md) | Branches (`development` / `master`), release flow, build/test/lint, PR expectations, versioning | +| TypeScript conventions | [skills/typescript/SKILL.md](skills/typescript/SKILL.md) | `src/` layout, compiler settings, logging, lint | +| DataSync & Sync API | [skills/contentstack-datasync/SKILL.md](skills/contentstack-datasync/SKILL.md) | Public API, config, HTTP client, retries, tokens, core sync—**not** CMA | +| Testing | [skills/testing/SKILL.md](skills/testing/SKILL.md) | Jest, nock, `PLUGIN_PATH`, fixtures, credentials policy | +| Code review | [skills/code-review/SKILL.md](skills/code-review/SKILL.md) | PR checklist, severity (Blocker / Major / Minor) | + +An index with “when to use” hints is in [skills/README.md](skills/README.md). + +## 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/package-lock.json b/package-lock.json index 9d3bac2..0d51aaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/datasync-manager", - "version": "2.4.0-beta.2", + "version": "2.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/datasync-manager", - "version": "2.4.0-beta.2", + "version": "2.3.1", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.1.2", @@ -48,13 +48,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -63,9 +63,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -73,21 +73,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -114,14 +114,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -131,14 +131,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -158,9 +158,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -168,29 +168,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -200,9 +200,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -210,9 +210,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -220,9 +220,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -230,9 +230,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -240,27 +240,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -325,13 +325,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -367,13 +367,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -493,13 +493,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -509,33 +509,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -543,14 +543,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -581,9 +581,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -723,9 +723,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -789,9 +789,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1209,17 +1209,17 @@ } }, "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.7.tgz", + "integrity": "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==", "dev": true, "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/graphql": "^9.0.4", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, @@ -1228,13 +1228,13 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.4.tgz", + "integrity": "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1242,14 +1242,14 @@ } }, "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz", + "integrity": "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -1257,9 +1257,9 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", "dev": true, "license": "MIT" }, @@ -1297,14 +1297,14 @@ } }, "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.1.tgz", + "integrity": "sha512-VCVvZ/R1+u3WuiBWpNavZ0mY4aaJNAsENrpBP9aLSR2QyOpQgd7DhM5j4AW7z4MQpnJYgwBPf0XqPQoNBRdQwg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -1315,13 +1315,13 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.5.tgz", + "integrity": "sha512-LIdrkrUv+DWbKeg/49rGuFJ3SU0d3hUS+B4MhNZLepBoNUFXms8Ic9edJjrlx+zycqJHjrMRudVpVb/bAXM2Lw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -1332,16 +1332,16 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", - "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.13.tgz", + "integrity": "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A==", "dev": true, "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", + "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, @@ -1350,26 +1350,26 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz", + "integrity": "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^27.0.0" + "@octokit/openapi-types": "^28.0.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -1403,9 +1403,9 @@ "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", "dev": true, "license": "MIT", "dependencies": { @@ -1864,9 +1864,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", "dev": true, "license": "MIT" }, @@ -2131,16 +2131,16 @@ "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "dev": true, "license": "ISC" }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -2185,9 +2185,9 @@ } }, "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": { @@ -2452,9 +2452,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz", - "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2479,9 +2479,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2503,9 +2503,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -2523,10 +2523,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -2577,15 +2577,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -2665,9 +2665,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001784", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz", - "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -2822,9 +2822,9 @@ } }, "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, "license": "MIT", "dependencies": { @@ -2945,6 +2945,20 @@ "proto-list": "~1.2.1" } }, + "node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/conventional-changelog-angular": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", @@ -3056,9 +3070,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { @@ -3443,9 +3457,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.331", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", - "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "version": "1.5.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.401.tgz", + "integrity": "sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==", "dev": true, "license": "ISC" }, @@ -3688,9 +3702,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -3938,23 +3952,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4118,9 +4115,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -4136,9 +4133,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "dev": true, "license": "MIT", "dependencies": { @@ -4503,9 +4500,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.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -4818,13 +4815,13 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -5035,9 +5032,9 @@ "license": "ISC" }, "node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", + "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", "dev": true, "license": "MIT", "dependencies": { @@ -5768,10 +5765,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5836,9 +5843,9 @@ "license": "ISC" }, "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", "dev": true, "license": "MIT" }, @@ -5856,9 +5863,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6179,9 +6186,9 @@ } }, "node_modules/marked": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.5.tgz", - "integrity": "sha512-6hLvc0/JEbRjRgzI6wnT2P1XuM1/RrrDEX0kPt0N7jGm1133g6X7DlxFasUIx+72aKAr904GTxhSLDrd5DIlZg==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", + "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -6482,11 +6489,14 @@ } }, "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.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.52.tgz", + "integrity": "sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -6528,9 +6538,9 @@ } }, "node_modules/npm": { - "version": "10.9.8", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.8.tgz", - "integrity": "sha512-fYwb6ODSmHkqrJQQaCxY3M2lPf/mpgC7ik0HSzzIwG5CGtabRp4bNqikatvCoT42b5INQSqudVH0R7yVmC9hVg==", + "version": "10.9.9", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.9.tgz", + "integrity": "sha512-1g+6jLQvaIuB4zwvHL7yrXuXcWZwDsCtBX8bbWDqbvJSSr9nPiDDWTHNgwXR27iIcTTW7v3A57hDW9RYv2W4Yg==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -6672,7 +6682,7 @@ "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", - "tar": "^7.5.11", + "tar": "^7.5.22", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", @@ -8771,7 +8781,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.11", + "version": "7.5.22", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -9243,9 +9253,9 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, "license": "MIT", "engines": { @@ -9742,13 +9752,14 @@ } }, "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -10153,12 +10164,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -10350,9 +10362,9 @@ } }, "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.0.tgz", - "integrity": "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", + "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", "dev": true, "license": "MIT", "dependencies": { @@ -10361,9 +10373,7 @@ "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", - "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, @@ -10374,19 +10384,6 @@ "semantic-release": ">=20.1.0" } }, - "node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/semantic-release/node_modules/aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", @@ -10615,23 +10612,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/into-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", - "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/semantic-release/node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -10806,9 +10786,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -10913,15 +10893,15 @@ "license": "MIT" }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -10933,14 +10913,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -11592,14 +11572,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -11627,9 +11607,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -11683,9 +11663,9 @@ } }, "node_modules/ts-jest": { - "version": "29.4.9", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", - "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", + "version": "29.4.12", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.12.tgz", + "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", "dev": true, "license": "MIT", "dependencies": { @@ -11695,7 +11675,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.4", + "semver": "^7.8.5", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -11872,9 +11852,9 @@ } }, "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -12116,6 +12096,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -12285,9 +12266,9 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { @@ -12337,9 +12318,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index e1b45c5..a2d5e01 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/datasync-manager", "author": "Contentstack LLC ", - "version": "2.4.0-beta.2", + "version": "2.3.1", "description": "The primary module of Contentstack DataSync. Syncs Contentstack data with your server using Contentstack Sync API", "main": "dist/index.js", "dependencies": { diff --git a/skills/README.md b/skills/README.md index 8eb69d8..9ea503e 100644 --- a/skills/README.md +++ b/skills/README.md @@ -1,11 +1,15 @@ -# Agent skills for `@contentstack/datasync-manager` +# Skills – @contentstack/datasync-manager -Short index of `skills/*/SKILL.md` files. Use them when you need more detail than [.cursor/rules/README.md](../.cursor/rules/README.md). +Source of truth for detailed guidance. Read [AGENTS.md](../AGENTS.md) first, then open the skill that matches your task. -| Skill | When to use | -|-------|-------------| -| [code-review](code-review/SKILL.md) | Preparing or reviewing a PR: compatibility, Sync API semantics, security, tests, severity labels. | -| [testing](testing/SKILL.md) | Running Jest, understanding `PLUGIN_PATH`, nock, dummy fixtures, and where to add tests. | -| [contentstack-datasync](contentstack-datasync/SKILL.md) | Mental model of DataSync Manager: modules, config, Sync API vs CMA, where to change sync behavior. | +## When to use which skill -There is no separate **framework** skill: HTTP and retry logic live primarily in `src/api.ts` and config, not a standalone framework layer. +| Skill folder | Use when | +|--------------|----------| +| [dev-workflow](dev-workflow/SKILL.md) | Branching, releases, local build/test/lint, PR expectations, semantic-release | +| [typescript](typescript/SKILL.md) | Editing `src/**/*.ts`—layout, `tsconfig`, `debug`/logger, ESLint/TSLint | +| [contentstack-datasync](contentstack-datasync/SKILL.md) | Sync API, delivery token, `src/api.ts` / `src/config.ts` / `src/core/`, public API | +| [testing](testing/SKILL.md) | Jest, nock, `test/dummy`, adding or debugging tests | +| [code-review](code-review/SKILL.md) | Reviewing or preparing a PR—terminology, security, tests, severity | + +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 9e15af5..1dfcc96 100644 --- a/skills/code-review/SKILL.md +++ b/skills/code-review/SKILL.md @@ -1,43 +1,56 @@ --- name: code-review -description: PR review checklist for Contentstack DataSync Manager (Sync API, TypeScript, Jest, security) +description: PR review checklist for DataSync Manager—Sync API terminology, security, tests, optional severity labels --- -# Code review (expanded) +# Code review – @contentstack/datasync-manager -Use this alongside [.cursor/rules/code-review.mdc](../../.cursor/rules/code-review.mdc). +## When to use -## Scope and naming +- Reviewing a pull request or preparing one for review. +- You need a consistent checklist for **DataSync** / **Sync API** changes (not CMA). -- **DataSync Manager** syncs content via the **Contentstack Sync API** using a **delivery token**. It is **not** the CMA SDK; avoid calling it “management” or “CMA” unless the code path actually uses Management APIs (this codebase generally does not). +## Instructions -## Public surface +### Scope and naming -- **`src/index.ts`**: Document new or changed exports (JSDoc style matching existing blocks). -- **Config**: Document new `contentstack` / `syncManager` options in code comments or consumer-facing docs when behavior is user-visible. +- **DataSync Manager** uses the **Contentstack Sync API** and a **delivery token**. It is **not** the CMA SDK; do not describe it as “management” or “CMA” unless the code path actually uses Management APIs (rare here). -## Correctness +### Public surface -- **Queues and notifications**: `push`/`unshift`/`pop` and `notifications` events (`publish`, `unpublish`, `delete`, `error`) must stay consistent for integrators. -- **Token lifecycle**: `.tokens`, `.ledger`, `.checkpoint` behavior and Error **141** recovery in `src/api.ts` are sensitive — verify edge cases. -- **Webhook + fallback polling**: Changes in `src/index.ts` monitoring should not leak timers or duplicate `poke()` calls. +- **`src/index.ts`**: JSDoc for new or changed exports, matching existing style. +- **Config**: Document new `contentstack` / `syncManager` options when behavior is user-visible. -## Security +### Correctness -- Path and query handling for HTTPS requests must remain safe from SSRF (see `src/api.ts`). -- No secrets in logs; Talisman/Snyk expectations remain satisfied. +- **Queues and notifications**: `push` / `unshift` / `pop` and `notifications` events (`publish`, `unpublish`, `delete`, `error`) must stay consistent for integrators. +- **Token lifecycle**: `.tokens`, `.ledger`, `.checkpoint` and **Error 141** recovery in `src/api.ts`—verify edge cases and no infinite loops. +- **Webhook + fallback polling** (`src/index.ts`): no timer leaks or duplicate `poke()` calls. -## Dependencies +### Security -- Prefer minimal, audited dependencies; align with `package.json` and team policy. +- HTTPS path/query handling must remain safe from SSRF (`src/api.ts`). +- No secrets in logs; **Talisman** / **Snyk** expectations stay satisfied. -## Tests +### Dependencies -- Add or update Jest tests with **nock** for HTTP; use `test/dummy` patterns. -- Run **`npm test`** locally before approving. +- Prefer minimal, audited dependencies per team policy. -## Severity +### Tests -- **Blocker**: Security, data corruption, broken sync or infinite retries. -- **Major**: Wrong API semantics, missing tests for risky changes. -- **Minor**: Style, comments, small refactors without behavior change. +- Add or update **Jest** tests with **nock** for HTTP; follow `test/dummy` patterns. +- Run **`npm test`** before approving risky changes. + +### Severity (optional labels) + +| Label | Examples | +|-------|----------| +| **Blocker** | Security regression, data loss risk, infinite retries, broken public API contract | +| **Major** | Wrong Sync API semantics, missing tests for critical paths, breaking change without version strategy | +| **Minor** | Style, logging, non-user-facing refactors, doc-only gaps | + +## References + +- [contentstack-datasync/SKILL.md](../contentstack-datasync/SKILL.md) — intended semantics. +- [testing/SKILL.md](../testing/SKILL.md) — test expectations. +- [AGENTS.md](../../AGENTS.md) — project entry point. diff --git a/skills/contentstack-datasync/SKILL.md b/skills/contentstack-datasync/SKILL.md index c9873b6..28de6b6 100644 --- a/skills/contentstack-datasync/SKILL.md +++ b/skills/contentstack-datasync/SKILL.md @@ -1,38 +1,63 @@ --- name: contentstack-datasync -description: Mental model for Contentstack DataSync Manager — Sync API, modules, and where to change behavior +description: DataSync Manager public API, Sync API (delivery token), HTTP client, config, and core sync—not CMA --- -# Contentstack DataSync Manager (TypeScript) +# DataSync & Sync API – @contentstack/datasync-manager -## What this package is +## When to use -**`@contentstack/datasync-manager`** is the Node.js **DataSync Manager**: it connects your **content store**, **asset store**, and **listener** (webhooks) to Contentstack’s **Sync API** using a **delivery token**. It is **not** a general CDA or CMA SDK; it orchestrates **synchronization** (incremental sync, webhooks, optional fallback polling). +- Changing **`src/index.ts`**, **`src/api.ts`**, **`src/config.ts`**, or **`src/core/`**. +- You need to know how this package differs from **CMA** or generic CDA clients. -Official product context: [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync). +## Instructions -## Where to change things +### What this package is + +**`@contentstack/datasync-manager`** connects **content store**, **asset store**, and **listener** (webhooks) to Contentstack’s **Sync API** using a **delivery token**. It is **not** the Content Management API (CMA) client and not a generic CDA SDK—it orchestrates **synchronization** (incremental sync, webhooks, optional fallback polling). + +Official docs: [Contentstack DataSync](https://www.contentstack.com/docs/guide/synchronization/contentstack-datasync). + +### Where to change things | Concern | Location | |---------|----------| | Public API (`start`, stores, queue, notifications) | `src/index.ts` | | HTTP to Sync API (retries, 429, error 141, headers) | `src/api.ts` | | Defaults (host, paths, retry limits, content type URLs) | `src/config.ts` | -| Sync loop, queue, plugins loader, token file handling | `src/core/` | -| Validation, logger, path builders | `src/util/` | -| Built-in JS plugins | `src/plugins/` | +| Sync loop, queue, plugins, token files | `src/core/` | +| Validation, logger, paths | `src/util/` | +| Built-in plugins | `src/plugins/` | + +### Configuration (`contentstack` object / `src/config.ts`) + +- **Host / protocol / port**: Defaults include `host: 'cdn.contentstack.io'`, `protocol: 'https:'`, `port: 443`. +- **Endpoints**: e.g. `apis.sync: '/v3/stacks/sync'`, `apis.content_types: '/v3/content_types/'`. +- **Auth headers** (`src/api.ts` `init`): `api_key`, `access_token` (delivery token), optional `branch`, `X-User-Agent` (`datasync-manager/v`). +- **Retries / timing**: `MAX_RETRY_LIMIT`, `RETRY_DELAY_BASE`, `TIMEOUT` — overridable from user config. -## Sync API mental model +### HTTP client (`src/api.ts`) -- Requests use **`api_key`**, **`access_token`** (delivery token), optional **`branch`**, and paths like **`/v3/stacks/sync`**. -- **Do not** conflate with **CMA** (create/update content, management tokens) — this stack uses **read/sync** semantics. +- Node **`https.request`**; paths from config + query; **SSRF** mitigation via `URL` + `@braintree/sanitize-url`. +- **429** and **5xx**: Retries with backoff (`Math.pow(Math.SQRT2, RETRY) * RETRY_DELAY_BASE`). +- **Error 141** (invalid `sync_token`): clear tokens, set `init: true`, one recovery attempt to avoid loops. +- **Network errors** (`ECONNRESET`, `ETIMEDOUT`, etc.): Retries up to `MAX_RETRY_LIMIT`. -## Config flow +### Core sync (`src/core/`) + +- Queue, plugin pipeline, token persistence (`.tokens`, `.checkpoint`, `.ledger` — see `npm run clean`), webhook/fallback behavior—preserve on-disk contracts when changing persistence. + +### Config flow - Consumer calls `setContentStore`, `setAssetStore`, `setListener`, optional `setConfig`, then **`start()`**. -- Internal config merges defaults from `src/config.ts` with user config; `src/api.ts` `init` runs when the core initializes the API helper. +- Internal config merges `src/config.ts` defaults with user config; `api` `init` runs when the core wires the API helper. + +### Wording + +- Use **Sync API**, **delivery token**, **DataSync**—not “CMA” for this module’s primary behavior. -## Changing behavior safely +## References -- Preserve disk artifacts (tokens, checkpoints) and plugin hook contracts when altering `src/core/`. -- Coordinate documentation updates for any new `contentstack` options or breaking changes to the listener interface. +- [typescript/SKILL.md](../typescript/SKILL.md) — `src/` conventions. +- [testing/SKILL.md](../testing/SKILL.md) — nock and Sync API tests. +- [code-review/SKILL.md](../code-review/SKILL.md) — API and security review points. diff --git a/skills/dev-workflow/SKILL.md b/skills/dev-workflow/SKILL.md new file mode 100644 index 0000000..d1dc8c5 --- /dev/null +++ b/skills/dev-workflow/SKILL.md @@ -0,0 +1,47 @@ +--- +name: dev-workflow +description: Branches, release flow, build/test/lint, PR expectations, and versioning for DataSync Manager +--- + +# Development workflow – @contentstack/datasync-manager + +## When to use + +- Setting up or merging branches, cutting a release, or running the same checks CI expects. +- You need the exact **npm** commands or pre-commit expectations before a PR. + +## Instructions + +### Branches + +- Use **feature branches** for new work; open pull requests against **`development`** to integrate changes. +- For a **release**, open a pull request from **`development`** into **`master`**. **npm** releases use **semantic-release** from **`master`** (see `.releaserc`: branches `["master"]`). + +### Local checks + +| Task | Command | +|------|---------| +| Compile | `npm run compile` or `npm run build-ts` | +| Tests | `npm test` (sets `PLUGIN_PATH=./test/dummy`; Jest + coverage) | +| ESLint | `npm run lint` — add paths or config if your CLI setup requires it | +| TSLint | `npm run tslint` — legacy; targets `src/**/*.ts` | + +### Pre-commit + +- `.husky/pre-commit` runs **Talisman** (secrets) and **Snyk** (`snyk test --all-projects --fail-on=all`). Both must pass unless `SKIP_HOOK=1` is set intentionally. + +### PR expectations + +- Keep changes scoped; match existing patterns in `src/` and `test/`. +- Run **`npm test`** before pushing when touching runtime logic. +- If you add or change **secrets or tokens**, update Talisman allowlists (e.g. `.talismanrc`) only with team approval. + +### Versioning + +- `package.json` version must advance for releases when your process requires it. A PR check in `.github/workflows/check-version-bump.yml` may enforce bumps for certain file changes — **note:** its path filters may still reflect a boilerplate layout; confirm with maintainers whether `src/` changes count as “code changed” for your PR. + +## References + +- [testing/SKILL.md](../testing/SKILL.md) — Jest and fixtures. +- [code-review/SKILL.md](../code-review/SKILL.md) — PR checklist. +- [AGENTS.md](../../AGENTS.md) — entry point and command table. diff --git a/skills/testing/SKILL.md b/skills/testing/SKILL.md index fc701a8..6f96f7d 100644 --- a/skills/testing/SKILL.md +++ b/skills/testing/SKILL.md @@ -1,42 +1,53 @@ --- name: testing -description: How to run and extend Jest tests for DataSync Manager (nock, PLUGIN_PATH, fixtures) +description: Jest setup, nock mocks, PLUGIN_PATH, test/dummy fixtures, and credentials policy for DataSync Manager --- -# Testing +# Testing – @contentstack/datasync-manager -## Commands +## When to use -- **`npm test`** — Runs Jest with coverage and verbose output. Equivalent to setting `PLUGIN_PATH=./test/dummy` so built-in plugin resolution finds `test/dummy/plugins/`. -- **`npm run compile`** — Build TypeScript before packaging or when tests import from `src/` via ts-jest (Jest compiles TS on the fly). +- Running or writing tests under **`test/`**, or debugging **Jest** / **nock** behavior. +- Adding opt-in live tests (document env vars clearly). -## Framework +## Instructions -- **Jest 29** + **ts-jest**, Node test environment (`jest.config.js`). -- **nock** mocks `https` requests to a fake host (see `test/dummy/config.ts` `contentstack.host`). +### Commands -## Layout +- **`npm test`** — Jest with coverage and verbose output; sets `PLUGIN_PATH=./test/dummy` so plugin resolution finds `test/dummy/plugins/`. +- **`npm run compile`** — Build before packaging; Jest uses ts-jest for TypeScript. + +### Runner and config + +- **Jest 29** + **ts-jest** (`jest.config.js`): Node environment, `test/**/*.ts` / `test/**/*.js`, coverage to `coverage/`, HTML reporter. +- **`test/dummy/`** is excluded from test discovery (`testPathIgnorePatterns`) — fixtures only. + +### Layout | Path | Role | |------|------| | `test/index.ts`, `test/api.ts`, `test/core/*.ts` | Main suites | | `test/dummy/config.ts` | Dummy stack config (api key, delivery token, sync_token) | -| `test/dummy/api-responses/` | Response payloads for nock | -| `test/dummy/plugins/` | Dummy plugins loaded via `PLUGIN_PATH` | +| `test/dummy/api-responses/` | Canned payloads for publish/unpublish/delete, etc. | +| `test/dummy/plugins/` | Loaded via `PLUGIN_PATH` | | `test/dummy/connector-listener-instances.ts` | Mock content store, asset store, listener | -`test/dummy/**` is excluded from Jest’s test file discovery so only top-level `test/**/*.ts` files run as tests. +### Credentials policy + +- Default tests **do not** call production Contentstack; no real credentials required. +- For **opt-in live** tests, use env vars (e.g. `CONTENTSTACK_*`) and `describe.skip` unless env is set; document in the test file. -## Environment +### Mocks -- Default tests **do not** call Contentstack production; no real credentials required. -- If you add opt-in live tests, use env vars (e.g. `CONTENTSTACK_*`) and `describe.skip` unless env is set; document in the test file. +- Use **nock** against the dummy host from `test/dummy/config.ts` (`contentstack.host`). +- Assert headers: `access_token`, `api_key`, `x-user-agent` (see `test/index.ts` `beforeEach` patterns). +- Match query params (`sync_token`, `pagination_token`, `environment`, `limit`) to what `src/api.ts` builds. -## Mocks +### Naming -- Prefer **nock** to assert headers (`access_token`, `api_key`, `x-user-agent`) like existing `beforeEach` blocks in `test/index.ts`. -- Match query params (`sync_token`, `pagination_token`, `environment`, `limit`) to the Sync API contract your code builds. +- Files by area (`sync.ts`, `token-management.ts`, …), not strictly `*.spec.ts`. -## Naming +## References -- Tests are named by area (`sync.ts`, `token-management.ts`, …), not strictly `*.spec.ts`. +- [contentstack-datasync/SKILL.md](../contentstack-datasync/SKILL.md) — Sync API behavior under test. +- [dev-workflow/SKILL.md](../dev-workflow/SKILL.md) — `npm test` in the full workflow. diff --git a/skills/typescript/SKILL.md b/skills/typescript/SKILL.md new file mode 100644 index 0000000..54c53c7 --- /dev/null +++ b/skills/typescript/SKILL.md @@ -0,0 +1,36 @@ +--- +name: typescript +description: TypeScript source layout, compiler settings, logging, and lint for DataSync Manager src/ +--- + +# TypeScript – @contentstack/datasync-manager + +## When to use + +- Editing or adding files under **`src/**/*.ts`** (or JS plugins under `src/plugins/`). +- You need to match existing **`tsconfig.json`** and logging style. + +## Instructions + +### Layout + +- **`src/index.ts`** — public API (stores, listener, `start`, queue helpers, notifications). +- **`src/api.ts`** — Sync API HTTP client (Node `https`); see [contentstack-datasync/SKILL.md](../contentstack-datasync/SKILL.md). +- **`src/core/`** — sync orchestration, queue, plugins, token handling, inet pinger. +- **`src/util/`** — logger (`debug`-backed), validation, paths, helpers. +- **`src/plugins/`** — JavaScript plugins (`allowJs` in `tsconfig`). + +### Compiler and style + +- **`tsconfig.json`**: `target` ES6, `module` CommonJS, `alwaysStrict`, `noImplicitReturns`, unused locals/parameters, etc. +- **Logging**: Prefer the **`debug`** package with stable namespaces (`Debug('sm:index')`, `Debug('api')`); avoid raw `console` where `logger` or `debug` is used elsewhere. +- **Lint**: ESLint in `package.json`; TSLint is legacy (`tslint.json`: max line length 120, 2-space indent). New code should satisfy both when run. + +### Dependencies + +- Do not add alternate HTTP clients without strong justification — **`https`** is the standard for Contentstack requests here. + +## References + +- [contentstack-datasync/SKILL.md](../contentstack-datasync/SKILL.md) — Sync API and `src/api.ts` behavior. +- [testing/SKILL.md](../testing/SKILL.md) — tests for TypeScript changes. diff --git a/src/api.ts b/src/api.ts index c6d0595..a4689fe 100644 --- a/src/api.ts +++ b/src/api.ts @@ -60,7 +60,7 @@ import { MESSAGES } from './util/messages' const debug = Debug('api') let MAX_RETRY_LIMIT let RETRY_DELAY_BASE = 200 // Default base delay in milliseconds -let TIMEOUT = 60000 // Increased from 30000 to 60000 (60 seconds) for large stack syncs +let TIMEOUT = 30000 // Default timeout in milliseconds let Contentstack /** @@ -171,51 +171,8 @@ export const get = (req, RETRY = 1) => { .catch(reject) }, timeDelay) } else { - // Enhanced error handling for Error 141 (Invalid sync_token) - try { - const errorBody = JSON.parse(body) - - // Validate error response structure and check for Error 141 - if (errorBody && typeof errorBody === 'object' && errorBody.error_code === 141 && errorBody.errors && typeof errorBody.errors === 'object' && errorBody.errors.sync_token) { - - debug('Error 141 detected: Invalid sync_token. Triggering auto-recovery with init=true') - - // Ensure req.qs exists before modifying - if (!req.qs) { - req.qs = {} - } - - // Clear the invalid token parameters and reinitialize - delete req.qs.sync_token - delete req.qs.pagination_token - req.qs.init = true - // Reset req.path so it gets rebuilt from Contentstack.apis.sync - // (req.path has the old query string baked in from line 109) - delete req.path - - // Mark this as a recovery attempt to prevent infinite loops - if (!req._error141Recovery) { - req._error141Recovery = true - debug('Retrying with init=true after Error 141') - // Use delayed retry - timeDelay = Math.pow(Math.SQRT2, RETRY) * RETRY_DELAY_BASE - debug(`Error 141 recovery: waiting ${timeDelay}ms before retry`) - - return setTimeout(() => { - return get(req, RETRY) - .then(resolve) - .catch(reject) - }, timeDelay) - } else { - debug('Error 141 recovery already attempted, failing to prevent infinite loop') - } - } - } catch (parseError) { - // Body is not JSON or parsing failed, continue with normal error handling - debug('Error response parsing failed:', parseError) - } - debug(MESSAGES.API.REQUEST_FAILED(options)) + return reject(body) } }) @@ -228,30 +185,14 @@ export const get = (req, RETRY = 1) => { reject(new Error('Request timeout')) }) - // Enhanced error handling for network and connection errors + // Enhanced error handling for socket hang ups and connection resets httpRequest.on('error', (error: any) => { debug(MESSAGES.API.REQUEST_ERROR(options.path, error?.message, error?.code)) - // List of retryable network error codes - const retryableErrors = [ - 'ECONNRESET', // Connection reset by peer - 'ETIMEDOUT', // Connection timeout - 'ECONNREFUSED', // Connection refused - 'ENOTFOUND', // DNS lookup failed - 'ENETUNREACH', // Network unreachable - 'EAI_AGAIN', // DNS lookup timeout - 'EPIPE', // Broken pipe - 'EHOSTUNREACH', // Host unreachable - ] - - // Check if error is retryable - const isRetryable = retryableErrors.includes(error?.code) || - error?.message?.includes('socket hang up') || - error?.message?.includes('ETIMEDOUT') - - if (isRetryable && RETRY <= MAX_RETRY_LIMIT) { + // Handle socket hang up and connection reset errors with retry + if ((error?.code === 'ECONNRESET' || error?.message?.includes('socket hang up')) && RETRY <= MAX_RETRY_LIMIT) { timeDelay = Math.pow(Math.SQRT2, RETRY) * RETRY_DELAY_BASE - debug(`Network error ${error?.code || error?.message}: waiting ${timeDelay}ms before retry ${RETRY}/${MAX_RETRY_LIMIT}`) + debug(MESSAGES.API.SOCKET_HANGUP_RETRY(options.path, timeDelay, RETRY, MAX_RETRY_LIMIT)) RETRY++ return setTimeout(() => { diff --git a/src/core/index.ts b/src/core/index.ts index 711a408..c59f33c 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -4,6 +4,7 @@ * MIT Licensed */ import * as fs from 'fs' +import * as path from 'path' import Debug from 'debug' import { EventEmitter } from 'events' import { cloneDeep, remove } from 'lodash' @@ -17,6 +18,7 @@ import { map } from '../util/promise.map' import { netConnectivityIssues } from './inet' import { Q as Queue } from './q' import { getToken, saveCheckpoint } from './token-management' +import { sanitizePath } from '../plugins/helper' interface IQueryString { init?: true, @@ -121,9 +123,18 @@ export const init = (contentStore, assetStore) => { const loadCheckpoint = (checkPointConfig: ICheckpoint, paths: any): void => { if (!checkPointConfig?.enabled) return; - // Read checkpoint from configured path only + // Try reading checkpoint from primary path let checkpoint = readHiddenFile(paths.checkpoint); + // Fallback to filePath in config if not found + if (!checkpoint) { + const fallbackPath = path.join( + sanitizePath(__dirname), + sanitizePath(checkPointConfig.filePath || ".checkpoint") + ); + checkpoint = readHiddenFile(fallbackPath); + } + // Set sync token if checkpoint is found if (checkpoint) { debug(MESSAGES.SYNC_CORE.TOKEN_FOUND, checkpoint); @@ -365,26 +376,10 @@ const fire = (req: IApiRequest) => { .catch(reject) }).catch((error) => { debug(MESSAGES.SYNC_CORE.ERROR_FIRE, error); - - // Check if this is an Error 141 (outdated token) - // Note: api.ts already handles recovery by retrying with init=true - try { - const parsedError = typeof error === 'string' ? JSON.parse(error) : error - if (parsedError.error_code === 141) { - logger.error(MESSAGES.SYNC_CORE.OUTDATED_SYNC_TOKEN) - logger.info(MESSAGES.SYNC_CORE.SYNC_TOKEN_RENEWAL) - // Reset flag so next webhook notification can trigger a fresh sync - flag.SQ = false - // Reset sync_token so next sync starts fresh with init=true - Contentstack.sync_token = undefined - } - } catch (parseError) { - // Not a JSON error or not Error 141, continue with normal handling - } - if (netConnectivityIssues(error)) { flag.SQ = false } + // do something return reject(error) }) diff --git a/src/plugins/helper.js b/src/plugins/helper.js index f54d679..b7e30a4 100644 --- a/src/plugins/helper.js +++ b/src/plugins/helper.js @@ -1,4 +1,5 @@ const { cloneDeep } = require('lodash') +const { getConfig } = require('../index') const fieldType = { @@ -183,9 +184,6 @@ const checkReferences = (schema, key) => { } exports.buildAssetObject = (asset, locale, entry_uid, content_type_uid) => { - // Lazy-load getConfig at runtime to avoid circular dependency - // (helper.js is loaded during plugin init before index.ts finishes exporting) - const { getConfig } = require('../index') const { contentstack } = getConfig() // add locale key to inside of asset asset.locale = locale diff --git a/src/util/messages.ts b/src/util/messages.ts index 54e87e8..8b41966 100644 --- a/src/util/messages.ts +++ b/src/util/messages.ts @@ -41,9 +41,6 @@ export const MESSAGES = { `Request error for ${path || 'unknown'}: ${message || 'Unknown error'} (${code || 'NO_CODE'})`, SOCKET_HANGUP_RETRY: (path: string, delay: number, attempt: number, max: number) => `Socket hang up detected. Retrying ${path || 'unknown'} with ${delay} ms delay (attempt ${attempt}/${max})`, - ERROR_141_DETECTED: 'Error 141: Invalid sync_token detected. Token is no longer valid.', - ERROR_141_RECOVERY: 'Attempting automatic recovery with init=true to get fresh token.', - ERROR_141_RETRY: 'Retrying sync operation with fresh initialization after Error 141.', }, // Plugin messages (plugins.ts) @@ -88,8 +85,6 @@ export const MESSAGES = { ERROR_FIRE: 'Error during fire operation.', REFIRE_CALLED: (req: any) => `Re-fire operation triggered with: ${JSON.stringify(req)}`, CHECKPOINT_LOCKDOWN: 'Checkpoint: lockdown has been invoked', - OUTDATED_SYNC_TOKEN: 'Sync token is outdated and no longer accepted by the API. Recovering...', - SYNC_TOKEN_RENEWAL: 'Renewing sync token. This typically happens after network interruptions or long inactivity.', }, // Main index messages (index.ts) diff --git a/test/dummy/config.ts b/test/dummy/config.ts index 9ed7e03..035cbac 100644 --- a/test/dummy/config.ts +++ b/test/dummy/config.ts @@ -1,5 +1,6 @@ export const config = { contentstack: { + // deepcode ignore HardcodedNonCryptoSecret: test fixture value, not a real secret apiKey: 'dummyApiKey', deliveryToken: 'dummyDeliveryToken', host: 'api.localhost.io',