diff --git a/.ai/commands/pull-request-review.md b/.ai/commands/pull-request-review.md index 5bd884d866..0177fe407e 100644 --- a/.ai/commands/pull-request-review.md +++ b/.ai/commands/pull-request-review.md @@ -182,7 +182,7 @@ standards with good test coverage. 1. **Code Style** (Style) - File: Multiple files - Issue: Inconsistent import ordering - - Recommendation: Run `yarn prettier:fix` + - Recommendation: Run `npm run prettier:fix` ## Risk Assessment diff --git a/.ai/skills/code-quality/SKILL.md b/.ai/skills/code-quality/SKILL.md index 80a251b5e8..0970d77d66 100644 --- a/.ai/skills/code-quality/SKILL.md +++ b/.ai/skills/code-quality/SKILL.md @@ -15,7 +15,7 @@ description: >- ## Critical Rules -- **ALWAYS run linter** after code changes: `yarn lint` +- **ALWAYS run linter** after code changes: `npm run lint` - Linter must pass before committing - No console.log in production code (use console.warn/error only) @@ -117,7 +117,7 @@ Also avoid: When updating npm packages (especially `@redis-ui/*` packages): -1. **Clear Vite cache** after `yarn install`: +1. **Clear Vite cache** after `npm install`: ```bash rm -rf node_modules/.vite @@ -130,7 +130,7 @@ When updating npm packages (especially `@redis-ui/*` packages): ## Pre-Commit Checklist -- [ ] `yarn lint` passes +- [ ] `npm run lint` passes - [ ] No TypeScript errors - [ ] Import order is correct - [ ] No `any` types without reason diff --git a/.ai/skills/dead-dependencies/SKILL.md b/.ai/skills/dead-dependencies/SKILL.md new file mode 100644 index 0000000000..10ab03f9e0 --- /dev/null +++ b/.ai/skills/dead-dependencies/SKILL.md @@ -0,0 +1,134 @@ +--- +name: dead-dependencies +description: >- + Find and safely remove unused ("dead") npm dependencies in RedisInsight + using a grep + leaf-check + build-gate recipe. Use when cleaning up + dependencies, investigating whether a package is still used, removing a + suspected leftover, or when the user mentions dead deps, unused + dependencies, dependency cleanup, leftover packages, or "is this safe to + remove". Complements the weekly vulnerability audit + (`scripts/dependency-audit-report.mjs`), which only reports vulnerabilities. +--- + +# Dead Dependencies + +Identify and safely remove unused npm dependencies. This is a **local, +interactive** workflow — a scheduled report can only ever guess; confirming a +dependency is dead requires grepping real usage and running the build. + +## Why manual (not knip/depcheck) + +Static tools over-report badly in this repo and must not be trusted blindly: + +- The root `package.json` is a **mega-manifest** (UI + desktop + build + test + + storybook + electron), so a tool scanning one area flags everything used + elsewhere as "unused". +- Lots of dependencies are referenced **without an `import`**: webpack loaders + and eslint/jest/babel plugins by string in config, tools invoked from + `package.json` `scripts`, runtime `-r` preloads, dynamic `require`, and + ambient `@types/*`. +- The webpack→Vite migration left **genuinely dead** build tooling behind, + mixed in with false positives. + +The reliable signal is: **grep for usage → confirm it's a leaf → remove it and +run the build gate.** That is exactly how `jsonpath` was confirmed dead and +removed (worked example at the bottom). + +## The recipe (per candidate) + +### 1. Grep the whole repo for real usage + +```bash +PKG=jsonpath # the dependency to check +grep -rn "$PKG" \ + redisinsight configs scripts tests .storybook \ + --include=*.ts --include=*.tsx --include=*.js --include=*.jsx \ + --include=*.mjs --include=*.cjs --include=*.json \ + 2>/dev/null | grep -v node_modules +``` + +Look for `import ... from '$PKG'`, `require('$PKG')`, `import('$PKG')`, and +bare references. Ignore unrelated substring hits (e.g. `nestjs-form-data` when +checking `form-data`, or a package name appearing only in tutorial/`manifest` +text). **Zero real references → candidate for the next steps.** + +### 2. Rule out no-import usage + +A clean grep is **necessary but not sufficient**. Check the ways a package is +used without an `import`: + +- **Config string references** — search the build/test config for the bare + name: `.eslintrc.js`, `configs/webpack.config.*.ts`, + `redisinsight/ui/vite.config.mjs`, `jest.config.cjs`, `babel.config.cjs`, + `electron-builder.json`, `.mocharc*`. eslint plugins, webpack loaders, and + jest/mocha reporters live here. +- **`package.json` scripts** — a tool like `concurrently`, `lint-staged`, or a + reporter is "used" if a `scripts` entry (any workspace) invokes it. +- **Runtime preloads / dynamic** — `node -r `, `require(variable)`, or a + wasm/worker loader with a computed path. + +### 3. Leaf check + +```bash +npm ls "$PKG" # in the workspace that declares it +``` + +Confirm nothing else in the tree depends on it, and note any transitive deps it +uniquely pulls (removing `jsonpath` also dropped `underscore`). + +### 4. Classify before acting + +| Situation | Action | +| --- | --- | +| Plain runtime/dev dep, zero references anywhere | **Delete** (after the gate below) | +| `@types/x` where base `x` bundles its own types (`node_modules/x/package.json` has `types`/`typings`) | **Delete** — the DefinitelyTyped package is obsolete | +| `@types/x` that's ambient/global-only (e.g. `@types/webpack-env`) | **Keep** — never imported by design | +| Declared in more than one workspace (`package.json`), used in only one | **Relocate/dedupe** — remove the *unused* declaration, never the used copy | +| Shadows a Node builtin (`buffer`, `assert`, …) | **Keep** — usually a false positive | +| Referenced only in a config/`scripts` (step 2 hit) | **Keep** | + +### 5. The gate — the only real proof + +Remove it, reinstall (per the repo's dependency rules — never hand-edit +`package.json`/lockfile, never `--ignore-scripts`), and verify the affected +area builds: + +```bash +npm uninstall "$PKG" # in the declaring workspace; updates the lockfile +npm run type-check # or the affected workspace's type-check +npm run test # / test:api, as relevant +npm run build # if it's a build-time dep +``` + +Green across the relevant checks = safe. Commit the `package.json` + +`package-lock.json` change (see the git-safety / dependency rules in +`CLAUDE.md`). If anything goes red, it wasn't dead — restore it. + +## Optional: enumerate candidates to sweep + +To triage the whole surface rather than one package, list declared deps and +grep each for an import, then apply steps 2–5 to the ones with zero hits: + +```bash +node -e "const p=require('./package.json');console.log([...Object.keys(p.dependencies||{}),...Object.keys(p.devDependencies||{})].join('\n'))" \ +| while read PKG; do + hits=$(grep -rl --include=*.ts --include=*.tsx --include=*.js --include=*.jsx --include=*.mjs \ + -e "from ['\"]$PKG" -e "require(['\"]$PKG" redisinsight configs scripts tests 2>/dev/null | grep -vc node_modules) + [ "$hits" = "0" ] && echo "candidate: $PKG" + done +``` + +This is a **first filter only** — every candidate still goes through steps 2–5. +Expect false positives (config/string/dynamic/ambient use). Never delete straight +from this list. + +## Worked example — `jsonpath` + +1. Grep across the repo → the only hits were unrelated tutorial text in a + `manifest.json`; **no `import`/`require`**. +2. Not referenced in any config or script. +3. `npm ls jsonpath` → a leaf; it was also the sole reason `underscore` was + installed. +4. Plain runtime dep, zero references → likely deletable. +5. Removed `jsonpath` + `@types/jsonpath`, `npm install`, `npm run type-check` + → green. Confirmed dead; committed. (`underscore` dropped with it.) diff --git a/.ai/skills/e2e-testing/SKILL.md b/.ai/skills/e2e-testing/SKILL.md index f7c14c9108..9a3ddf2605 100644 --- a/.ai/skills/e2e-testing/SKILL.md +++ b/.ai/skills/e2e-testing/SKILL.md @@ -94,7 +94,10 @@ npx playwright test # All projects Put a test in `tests/serial/` when it: - Shares database state across tests via `beforeAll` -- Runs dangerous commands or mutates global app state +- Runs dangerous commands or mutates global app state. Settings are global: + `scanThreshold`, `dateFormat`, `timezone` and `batchSize` are one shared resource, + so a spec that changes one and holds it across other work breaks every concurrent + test that reads it - Cannot tolerate concurrent execution with other tests - Would cause flakiness when run with other tests - Require special environment configuration @@ -310,15 +313,36 @@ const config = ConfigFactory.build({ name: 'custom-name' }); ### Cleanup Pattern -Always prefix test data with `test-` for easy cleanup: +Prefix test data with `test-` so leftovers are identifiable, but **never clean up by +that prefix**. Specs share a Redis instance and different files run on different +workers, so deleting every `test-*` key also removes keys the specs alongside it are +still asserting on, and their rows disappear mid-test. + +Track what a test creates and delete only that: ```typescript -// In apiHelper -async deleteTestData(): Promise { - return this.deleteByPattern(new RegExp(`^${TEST_PREFIX}`)); -} +import { createKeyTracker } from 'e2eSrc/helpers'; + +test.describe('Browser > Add Key', () => { + const keys = createKeyTracker(); + + test.afterEach(async ({ apiHelper }) => { + await keys.cleanup(apiHelper, database.id); + }); + + test('should add a Hash key', async ({ browserPage }) => { + const keyData = keys.track(HashKeyFactory.build()); + // keys.add(name) records a name built without a factory, e.g. a rename target. + }); +}); ``` +Miss a `track()` and the key is never deleted, which is harmless in CI (the test +environment is recreated per run) but accumulates locally until the RTE restarts. + +Databases need no such care: each spec deletes its own in `afterAll`, and +`browser.setup` clears leftover `test-` databases once before the run. + ## Fixtures ### Add New Fixtures to base.ts diff --git a/.ai/skills/i18n/SKILL.md b/.ai/skills/i18n/SKILL.md index ecee011a03..61a9177ff0 100644 --- a/.ai/skills/i18n/SKILL.md +++ b/.ai/skills/i18n/SKILL.md @@ -81,6 +81,29 @@ import { Trans } from 'uiSrc/i18n'; // getTranslatedApiError() fills {{databaseId}} from response.data.resource — no extra code. ``` +## Plurals + +Use i18next's native **`count`-based** plurals — never a hand-rolled `isPlural` branch with +`.single`/`.plural` keys. + +- Add one key per plural form with the i18next suffix: `key_one`, `key_other` (a language may + need more forms — `_few`, `_many` — but `en`/`bg` only use `_one`/`_other`). +- Reference the **base** key (no suffix) and pass `count`; i18next selects the form: + `t('key', { count })` or ``. +- The base key type-checks even though only the suffixed forms are in `en.json` — i18next's + types resolve it from the `_one`/`_other` entries. +- **Write the whole sentence in each form.** Don't interpolate the one differing word as a + fragment — word order, agreement, and the number of plural forms vary by language. +- Renaming a key (e.g. `.single` → `_one`) leaves the old key behind in `bg.json` because + `i18n:extract` doesn't prune — delete the orphan so en/bg parity holds. + +```tsx +// en.json: +// "workbench.runConfirm.body_one": "…This command is part of…" +// "workbench.runConfirm.body_other": "…These commands are part of…" + +``` + ## Keys - **Flat, dotted keys** — `keySeparator` and `nsSeparator` are `false`, so a dot is a literal character, not nesting. `"api.error.code.11000.title"` is a single key. @@ -130,13 +153,13 @@ The backend ships a stable `errorCode` on every user-facing error (see 1. Add the key + English value to `en.json` **and** the same key to `bg.json` (translated, or empty to defer). Keep both sorted and in parity. 2. Reference it: `t('my.key')` / `i18n.t('my.key')` / ``. 3. For dynamic values, pass `values` (interpolation) or `resource` (backend errors). -4. Run `yarn i18n:extract` to sync/sort, and `yarn i18n:check` to catch duplicate keys. -5. `yarn type-check` (new literal keys must resolve) and `yarn lint:ui`. +4. Run `npm run i18n:extract` to sync/sort, and `npm run i18n:check` to catch duplicate keys. +5. `npm run type-check` (new literal keys must resolve) and `npm run lint:ui`. ## Tooling -- `yarn i18n:extract` — scans `t()`/`` usages and syncs `en.json`/`bg.json` (alphabetical; does **not** prune unused keys). Note: dynamic (`as never`) keys aren't discovered by extraction — keep them in the locale files manually. -- `yarn i18n:check` — fails if a locale file has a **duplicate key** (JSON silently keeps the last, so a dup would shadow a value). Runs in CI on PRs touching `locales/**`. +- `npm run i18n:extract` — scans `t()`/`` usages and syncs `en.json`/`bg.json` (alphabetical; does **not** prune unused keys). Note: dynamic (`as never`) keys aren't discovered by extraction — keep them in the locale files manually. +- `npm run i18n:check` — fails if a locale file has a **duplicate key** (JSON silently keeps the last, so a dup would shadow a value). Runs in CI on PRs touching `locales/**`. - Dev override: append `?lang=bg` to the URL to preview Bulgarian. ## Do / Don't @@ -146,3 +169,4 @@ The backend ships a stable `errorCode` on every user-facing error (see - ✅ Keep en/bg key parity; empty bg is an acceptable "later" placeholder. - ❌ Don't hardcode user-facing strings — add a key. - ❌ Don't hand-edit the locale-file key order — let `i18n:extract` sort. +- ❌ Don't hand-roll plurals with a JS branch — use `count` + `key_one`/`key_other` (see Plurals). diff --git a/.ai/skills/pull-requests/SKILL.md b/.ai/skills/pull-requests/SKILL.md index ee658842c4..500a6294de 100644 --- a/.ai/skills/pull-requests/SKILL.md +++ b/.ai/skills/pull-requests/SKILL.md @@ -10,10 +10,6 @@ description: >- ## Creating a PR -### Labels - -When creating PRs with AI assistance, always add the **"AI-Made"** label. - ### PR Title Include issue number at the start: @@ -36,7 +32,7 @@ Describe how to test the changes. --- -Closes #RI-123 +Refs #RI-123 ``` **PR Description Guidelines:** @@ -45,6 +41,7 @@ Closes #RI-123 - **Focus on high-level changes** - Don't list every code change in the #What section - **Brief and to the point** - The diff shows the details; describe the "why" and "what" at a high level - **Technical decisions** - Only mention significant architectural or design decisions if relevant +- **Link, don't auto-close** - Use `Refs #RI-123` / `Addresses #RI-123`, not `Closes`/`Fixes`/`Resolves` - those keywords auto-close the issue when the PR merges, and tickets should be closed manually, not by the merge ## Review Process diff --git a/.ai/skills/redis-insight-plugin/SKILL.md b/.ai/skills/redis-insight-plugin/SKILL.md index 5c17f8020c..bd7398ef83 100644 --- a/.ai/skills/redis-insight-plugin/SKILL.md +++ b/.ai/skills/redis-insight-plugin/SKILL.md @@ -33,7 +33,7 @@ See [references/official-docs-summary.md](references/official-docs-summary.md) f > - **[redis-ui-components](../redis-ui-components/)** — build all plugin UI from Redis UI > components. Import the internal `uiSrc/components/ui` wrappers; **never** import raw > `@redis-ui/*`. (This skill is a symlink into the installed `@redis-ui/components` package, -> so it resolves after `yarn install`; if it is missing, run install — the canonical source is +> so it resolves after `npm install`; if it is missing, run install — the canonical source is > `node_modules/@redis-ui/components/skills/redis-ui-components/`.) > - **[code-quality](../code-quality/SKILL.md)** — TypeScript everywhere (no `any`), naming > (`PascalCase` / `camelCase` / `UPPER_SNAKE_CASE`), import order, no magic numbers, no @@ -161,7 +161,7 @@ See [references/review-hardening.md](references/review-hardening.md). ## Build and Verify ```bash -yarn build +npm run build test -f dist/index.js test -f dist/styles.css # if "styles" is declared grep -c "process.env" dist/index.js # must be 0 in a Parcel build diff --git a/.ai/skills/redis-insight-plugin/references/error-handling.md b/.ai/skills/redis-insight-plugin/references/error-handling.md index 87986ceec9..4abd03114b 100644 --- a/.ai/skills/redis-insight-plugin/references/error-handling.md +++ b/.ai/skills/redis-insight-plugin/references/error-handling.md @@ -117,4 +117,4 @@ Validate persisted state before applying — fields can disappear or change shap | Values mapped to wrong field/axis | Response shape assumption wrong | Branch on the actual runtime shape, not the command name. | | Theme looks wrong | No `theme_DARK` handling | Read `document.body.classList` or `getTheme()` from SDK. | | Plugin disappears after Insight upgrade | Manifest field changed | Re-read official docs and update `package.json`. | -| Large bundle, slow load | Missing minify, full lodash | Run `yarn minify:js`; switch to scoped imports. | +| Large bundle, slow load | Missing minify, full lodash | Run `npm run minify:js`; switch to scoped imports. | diff --git a/.ai/skills/redis-insight-plugin/references/external-parcel-plugin.md b/.ai/skills/redis-insight-plugin/references/external-parcel-plugin.md index 306de875c9..b4f419d95c 100644 --- a/.ai/skills/redis-insight-plugin/references/external-parcel-plugin.md +++ b/.ai/skills/redis-insight-plugin/references/external-parcel-plugin.md @@ -41,7 +41,7 @@ Recommended scripts (see [../templates/external-parcel-package.json](../template ```json "scripts": { "start": "parcel src/index.html", - "build": "concurrently \"yarn build:js\" \"yarn build:css\"", + "build": "concurrently \"npm run build:js\" \"npm run build:css\"", "build:js":"parcel build src/main.tsx --no-source-maps --dist-dir dist --target module", "build:css":"parcel build src/styles/styles.scss --no-source-maps --dist-dir dist", "minify:js":"terser dist/index.js -o dist/index.js -c -m", @@ -95,7 +95,7 @@ Strip the rest before copying into `~/.redis-insight/plugins//`. The deplo ## Outputs -After `yarn build`: +After `npm run build`: - `dist/index.js` — single bundled module. - `dist/styles.css` — single stylesheet. @@ -107,8 +107,8 @@ For RedisInsight product UI fidelity, copy `templates/external-styles.scss` to ` ## Verification ```bash -yarn build -yarn verify # runs templates/verify-plugin.sh +npm run build +npm run verify # runs templates/verify-plugin.sh ``` `verify` should report: diff --git a/.ai/skills/redis-insight-plugin/references/iterative-development.md b/.ai/skills/redis-insight-plugin/references/iterative-development.md index 2598ea4ad2..92dfa03061 100644 --- a/.ai/skills/redis-insight-plugin/references/iterative-development.md +++ b/.ai/skills/redis-insight-plugin/references/iterative-development.md @@ -145,8 +145,8 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '20' } - - run: yarn install --frozen-lockfile - - run: yarn build + - run: npm ci + - run: npm run build - run: bash scripts/verify-plugin.sh - uses: actions/upload-artifact@v4 with: diff --git a/.ai/skills/redis-insight-plugin/references/redis-insight-plugin-guidelines.md b/.ai/skills/redis-insight-plugin/references/redis-insight-plugin-guidelines.md index c4defd604e..6fd9266580 100644 --- a/.ai/skills/redis-insight-plugin/references/redis-insight-plugin-guidelines.md +++ b/.ai/skills/redis-insight-plugin/references/redis-insight-plugin-guidelines.md @@ -78,7 +78,7 @@ export default { renderExampleView }; ## Testing & Verification -- `yarn build` produces `dist/index.js` and `dist/styles.css`. +- `npm run build` produces `dist/index.js` and `dist/styles.css`. - `templates/verify-plugin.sh` confirms file presence, no `process.env`, and that activation method names appear in the bundle. - Deploy with `templates/deploy-external.sh` (folder install) or `templates/deploy-internal-docker.sh` (Docker container). - After deploy, `curl http://localhost:5540/api/plugins` and grep for the plugin name. diff --git a/.ai/skills/redis-insight-plugin/references/testing-and-deployment.md b/.ai/skills/redis-insight-plugin/references/testing-and-deployment.md index 92e0edcf38..34af47587c 100644 --- a/.ai/skills/redis-insight-plugin/references/testing-and-deployment.md +++ b/.ai/skills/redis-insight-plugin/references/testing-and-deployment.md @@ -46,7 +46,7 @@ That's it. Nothing else is required at deploy time. External (host install): ```bash -yarn build +npm run build bash templates/verify-plugin.sh bash templates/deploy-external.sh ``` @@ -54,7 +54,7 @@ bash templates/deploy-external.sh Inside Docker RedisInsight: ```bash -yarn build +npm run build bash templates/verify-plugin.sh bash templates/deploy-internal-docker.sh ``` diff --git a/.ai/skills/redis-insight-plugin/templates/deploy-external.sh b/.ai/skills/redis-insight-plugin/templates/deploy-external.sh index 7fff6e7163..22050a7f46 100644 --- a/.ai/skills/redis-insight-plugin/templates/deploy-external.sh +++ b/.ai/skills/redis-insight-plugin/templates/deploy-external.sh @@ -17,7 +17,7 @@ DEST="${RI_PLUGINS_DIR:-$HOME/.redis-insight/plugins}/$PLUGIN_NAME" echo "deploy: plugin=$PLUGIN_NAME dest=$DEST" # 1. Build -yarn build +npm run build # 2. Verify bash "$PLUGIN_ROOT/templates/verify-plugin.sh" \ diff --git a/.ai/skills/redis-insight-plugin/templates/deploy-internal-docker.sh b/.ai/skills/redis-insight-plugin/templates/deploy-internal-docker.sh index 03779ed4ee..0f973b7182 100644 --- a/.ai/skills/redis-insight-plugin/templates/deploy-internal-docker.sh +++ b/.ai/skills/redis-insight-plugin/templates/deploy-internal-docker.sh @@ -24,7 +24,7 @@ DEST="$INSIGHT_PLUGINS_DIR/$PLUGIN_NAME" echo "deploy(docker): plugin=$PLUGIN_NAME container=$CONTAINER dest=$DEST" # 1. Build -yarn build +npm run build # 2. Verify bash "$PLUGIN_ROOT/templates/verify-plugin.sh" \ diff --git a/.ai/skills/redis-insight-plugin/templates/external-parcel-package.json b/.ai/skills/redis-insight-plugin/templates/external-parcel-package.json index dcd4217066..06bcb93892 100644 --- a/.ai/skills/redis-insight-plugin/templates/external-parcel-package.json +++ b/.ai/skills/redis-insight-plugin/templates/external-parcel-package.json @@ -7,7 +7,7 @@ "styles": "./dist/styles.css", "scripts": { "start": "parcel src/index.html", - "build": "concurrently \"yarn build:js\" \"yarn build:css\"", + "build": "concurrently \"npm run build:js\" \"npm run build:css\"", "build:js": "parcel build src/main.tsx --no-source-maps --dist-dir dist --target module", "build:css": "parcel build src/styles/styles.scss --no-source-maps --dist-dir dist", "minify:js": "terser dist/index.js -o dist/index.js -c -m", diff --git a/.ai/skills/redis-insight-plugin/templates/verify-plugin.sh b/.ai/skills/redis-insight-plugin/templates/verify-plugin.sh index d0a678dbf8..f6e0178f36 100644 --- a/.ai/skills/redis-insight-plugin/templates/verify-plugin.sh +++ b/.ai/skills/redis-insight-plugin/templates/verify-plugin.sh @@ -29,7 +29,7 @@ fi MAIN_ABS="$PLUGIN_ROOT/${MAIN_PATH#./}" if [[ ! -f "$MAIN_ABS" ]]; then - echo "verify: built bundle not found at $MAIN_ABS (run yarn build first)" >&2 + echo "verify: built bundle not found at $MAIN_ABS (run npm run build first)" >&2 exit 1 fi diff --git a/.ai/skills/tsconfigs/SKILL.md b/.ai/skills/tsconfigs/SKILL.md index 836281fd29..af06ff1bf1 100644 --- a/.ai/skills/tsconfigs/SKILL.md +++ b/.ai/skills/tsconfigs/SKILL.md @@ -15,9 +15,9 @@ RedisInsight has no root `tsconfig.json`. Config is split per area, each owning | File | Owns | Consumers | | - | - | - | -| `redisinsight/ui/tsconfig.json` | UI source, `uiSrc/*`, `apiClient` paths | Vite (UI build), ESLint UI override, `yarn type-check:ui` | +| `redisinsight/ui/tsconfig.json` | UI source, `uiSrc/*`, `apiClient` paths | Vite (UI build), ESLint UI override, `npm run type-check:ui` | | `redisinsight/api/tsconfig.json` | API source, `src/*`, `tests/*` paths | NestJS build, ESLint API override | -| `redisinsight/api/tsconfig.check.json` | Same as base + `strict: true` (with `strictPropertyInitialization` and `useUnknownInCatchVariables` off) and `noEmit: true` | `yarn type-check:api` only — kept separate so strict mode doesn't break `nest build`. See the `type-check-baselines` skill. | +| `redisinsight/api/tsconfig.check.json` | Same as base + `strict: true` (with `strictPropertyInitialization` and `useUnknownInCatchVariables` off) and `noEmit: true` | `npm run type-check:api` only — kept separate so strict mode doesn't break `nest build`. See the `type-check-baselines` skill. | | `redisinsight/desktop/tsconfig.json` | Desktop source. Paths `desktopSrc/*`, `apiSrc/*`, `uiSrc/*`, `apiClient`, `apiClient/*` for TypeScript / IDE intellisense | ESLint for desktop files, TS language server | | `configs/tsconfig.json` | Compiler options (`module: CommonJS`, `esModuleInterop`) used by `ts-node` to load the `.ts` webpack configs | `ts-node` via `TS_NODE_PROJECT` set in `build:main` / `build:main:stage` / `build:stage` | | `.storybook/tsconfig.json` | Storybook framework files, extends UI tsconfig | Storybook + ESLint | diff --git a/.ai/skills/type-check-baselines/SKILL.md b/.ai/skills/type-check-baselines/SKILL.md index 46919db133..6b3312bf4b 100644 --- a/.ai/skills/type-check-baselines/SKILL.md +++ b/.ai/skills/type-check-baselines/SKILL.md @@ -16,18 +16,18 @@ RedisInsight gates TypeScript errors per project via a one-way ratchet: current | Project | tsconfig used | Baseline file | Per-project compare | | - | - | - | - | -| UI | `redisinsight/ui/tsconfig.json` | `redisinsight/ui/.tscheck.rec.json` | `yarn --cwd redisinsight/ui type-check` | -| API | `redisinsight/api/tsconfig.check.json` (strict, extends base) | `redisinsight/api/.tscheck.rec.json` | `yarn --cwd redisinsight/api type-check` | -| Desktop | `redisinsight/desktop/tsconfig.json` | `redisinsight/desktop/.tscheck.rec.json` | `yarn --cwd redisinsight/desktop type-check` | -| Configs | `configs/tsconfig.json` | — (must stay at 0 errors) | `yarn tsc --project configs/tsconfig.json --noEmit` | +| UI | `redisinsight/ui/tsconfig.json` | `redisinsight/ui/.tscheck.rec.json` | `npm run type-check --prefix redisinsight/ui` | +| API | `redisinsight/api/tsconfig.check.json` (strict, extends base) | `redisinsight/api/.tscheck.rec.json` | `npm run type-check --prefix redisinsight/api` | +| Desktop | `redisinsight/desktop/tsconfig.json` | `redisinsight/desktop/.tscheck.rec.json` | `npm run type-check --prefix redisinsight/desktop` | +| Configs | `configs/tsconfig.json` | — (must stay at 0 errors) | `npx tsc --project configs/tsconfig.json --noEmit` | Run all checks together from the repo root: -- `yarn type-check` — compare against baselines (all four projects). E2E Playwright is type-checked by a separate workflow (`tests-e2e-playwright-lint.yml`) — not part of this. -- `yarn tscheck` — refresh baselines for ui/api/desktop after fixing errors. Projects whose error count didn't change produce no diff. -- `yarn tscheck:force` — force-overwrite baselines for ui/api/desktop. Emergencies only. +- `npm run type-check` — compare against baselines (all four projects). E2E Playwright is type-checked by a separate workflow (`tests-e2e-playwright-lint.yml`) — not part of this. +- `npm run tscheck` — refresh baselines for ui/api/desktop after fixing errors. Projects whose error count didn't change produce no diff. +- `npm run tscheck:force` — force-overwrite baselines for ui/api/desktop. Emergencies only. -**Always run refresh commands through the root `yarn tscheck` / `yarn tscheck:force` wrappers.** The per-workspace refresh scripts (`yarn --cwd redisinsight/ tscheck`) shell out to `tsc`, `tsx`, and `tsc-output-parser`, which are installed only in the **root** `node_modules/.bin/` — this repo is not a yarn workspace, so yarn won't add the root bin dir to PATH when invoked with `--cwd`. The root wrappers exist precisely to avoid that trap by running in the root yarn context first. If you must invoke the per-package script directly, prepend the root bin dir manually: `PATH="$PWD/node_modules/.bin:$PATH" yarn --cwd redisinsight/ui tscheck`. +**Always run refresh commands through the root `npm run tscheck` / `npm run tscheck:force` wrappers.** The per-workspace refresh scripts (`npm run tscheck --prefix redisinsight/`) shell out to `tsc`, `tsx`, and `tsc-output-parser`, which are installed only in the **root** `node_modules/.bin/` — this repo is not an npm workspace, so `npm run --prefix` only exposes the sub-dir's bin, not the root's. The root wrappers exist precisely to avoid that trap by running in the root context first. If you must invoke the per-package script directly, prepend the root bin dir manually: `PATH="$PWD/node_modules/.bin:$PATH" npm run tscheck --prefix redisinsight/ui`. ## API has a dedicated check tsconfig @@ -53,7 +53,7 @@ You introduced new errors. Fix them. Read the script output — it lists the fil You fixed errors (good). Refresh baselines from the repo root: ```sh -yarn tscheck +npm run tscheck ``` This runs the refresh for ui, api, and desktop; only the project whose count changed will produce a diff. Commit the updated `.tscheck.rec.json`. @@ -64,21 +64,21 @@ Same rule: the file × error-code counts went from 0 to N — that's "new errors ### Bootstrapping a fresh baseline -Only needed once per project (already done for ui/api/desktop). The non-force `yarn --cwd redisinsight/ tscheck` calls `compare` first, which fails against an empty baseline. Use `yarn --cwd redisinsight/ tscheck:force` for the very first baseline only. +Only needed once per project (already done for ui/api/desktop). The non-force `npm run tscheck --prefix redisinsight/` calls `compare` first, which fails against an empty baseline. Use `npm run tscheck:force --prefix redisinsight/` for the very first baseline only. -### After `yarn install` in `redisinsight/api/` +### After `npm install` in `redisinsight/api/` -The api postinstall regenerates `redisinsight/api-client/`. That can shift UI and Desktop error counts (they both import from `apiClient`). If `yarn type-check:ui` or `yarn type-check:desktop` reports drift after an api install, refresh those baselines. +The api postinstall regenerates `redisinsight/api-client/`. That can shift UI and Desktop error counts (they both import from `apiClient`). If `npm run type-check:ui` or `npm run type-check:desktop` reports drift after an api install, refresh those baselines. ### Local UI check disagrees with CI -UI plugins under `redisinsight/ui/src/packages/{redisearch, redisgraph, redistimeseries-app, ri-explain, clients-list}` are sub-projects whose source gets type-checked via the UI tsconfig. Their deps live in nested `node_modules` populated by `yarn build:statics` (or by running `yarn --cwd redisinsight/ui/src/packages/`). CI runs `yarn build:statics` before `yarn type-check:ui`, so the baseline reflects "plugin deps installed." +UI plugins under `redisinsight/ui/src/packages/{redisearch, redisgraph, redistimeseries-app, ri-explain, clients-list}` are sub-projects whose source gets type-checked via the UI tsconfig. Their deps live in nested `node_modules` populated by `npm run build:statics` (or by running `npm install --prefix redisinsight/ui/src/packages/`). CI runs `npm run build:statics` before `npm run type-check:ui`, so the baseline reflects "plugin deps installed." -If `yarn type-check:ui` shows TS7016 ("Could not find a declaration file for module ...") errors that CI doesn't, you're missing plugin deps. Run `yarn build:statics` once, then re-run the check. Don't refresh the baseline to your local state — CI runs with plugin deps installed. +If `npm run type-check:ui` shows TS7016 ("Could not find a declaration file for module ...") errors that CI doesn't, you're missing plugin deps. Run `npm run build:statics` once, then re-run the check. Don't refresh the baseline to your local state — CI runs with plugin deps installed. ### Local Desktop check disagrees with CI -Desktop type-check needs `redisinsight/api/dist/` populated with the **dev** nest build (`yarn --cwd redisinsight/api build`, not `build:prod` — prod skips `.d.ts` emission). CI does this automatically. Locally, build api once before generating or refreshing the desktop baseline. +Desktop type-check needs `redisinsight/api/dist/` populated with the **dev** nest build (`npm run build --prefix redisinsight/api`, not `build:prod` — prod skips `.d.ts` emission). CI does this automatically. Locally, build api once before generating or refreshing the desktop baseline. ## Reviewing PRs diff --git a/.eslintignore b/.eslintignore index 922a94791b..6d26fd2332 100644 --- a/.eslintignore +++ b/.eslintignore @@ -64,7 +64,7 @@ redisinsight/ui/src/packages/redistimeseries-app /report __mocks__ -# Auto-generated API client (output of `yarn generate:api-client`) +# Auto-generated API client (output of `npm run generate:api-client`) redisinsight/api-client # Storybook build output diff --git a/.github/actions/install-all-build-libs/action.yml b/.github/actions/install-all-build-libs/action.yml index 681e4db7e6..e5e5593358 100644 --- a/.github/actions/install-all-build-libs/action.yml +++ b/.github/actions/install-all-build-libs/action.yml @@ -23,7 +23,7 @@ runs: using: 'composite' steps: - name: Setup Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v7.0.0 with: node-version-file: '.nvmrc' @@ -36,12 +36,11 @@ runs: node_modules redisinsight/node_modules redisinsight/api/node_modules - # Hash both package.json and yarn.lock for every workspace so a - # change to either invalidates the cache. Hashing only yarn.lock - # let package.json edits without `yarn install` cache-hit, which - # skipped `yarn install --frozen-lockfile` and hid the resulting - # package.json / yarn.lock mismatch. - key: node-modules-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package.json', 'yarn.lock', 'redisinsight/package.json', 'redisinsight/yarn.lock', 'redisinsight/api/package.json', 'redisinsight/api/yarn.lock') }} + # Hash both package.json and package-lock.json for every workspace so a + # change to either invalidates the cache. Hashing only package-lock.json + # would let package.json edits without `npm ci` cache-hit, which would + # skip `npm ci` and hide the resulting package.json / lockfile mismatch. + key: node-modules-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package.json', 'package-lock.json', 'redisinsight/package.json', 'redisinsight/package-lock.json', 'redisinsight/api/package.json', 'redisinsight/api/package-lock.json') }} restore-keys: | node-modules-${{ runner.os }}-${{ runner.arch }}- @@ -95,20 +94,5 @@ runs: shell: bash run: | if [ ! -f redisinsight/api-client/index.ts ]; then - yarn --cwd redisinsight/api generate:api-client + npm run generate:api-client --prefix redisinsight/api fi - - # When install ran (cache miss), its postinstall executed - # `yarn-deduplicate yarn.lock`. If the committed lockfile was not - # dedup-clean, postinstall rewrote it in place and this diff fails. - # On cache hit install was skipped — the lockfile is byte-identical - # to a previously verified state, so the diff is a no-op. - - name: Verify root yarn.lock is unchanged after install - shell: bash - run: | - if ! git diff --exit-code --quiet -- yarn.lock; then - echo "::error file=yarn.lock::yarn.lock was modified by 'yarn install' (postinstall ran yarn-deduplicate). The committed lockfile is not dedup-clean. Run 'yarn install' at the repo root locally and commit the updated yarn.lock." - git --no-pager diff --stat -- yarn.lock - exit 1 - fi - echo "yarn.lock is unchanged after install — dedup-clean ✅" diff --git a/.github/actions/install-deps/action.yml b/.github/actions/install-deps/action.yml index 7ed4a1a77f..10f50e5d3d 100644 --- a/.github/actions/install-deps/action.yml +++ b/.github/actions/install-deps/action.yml @@ -22,12 +22,13 @@ runs: working-directory: ${{ inputs.dir-path }} shell: bash - # env: - # SKIP_POSTINSTALL: ${{ inputs.skip-postinstall }} - # run: yarn install run: | # todo: uncomment after build our binaries # export npm_config_keytar_binary_host_mirror=${{ inputs.keytar-host-mirror }} # export npm_config_node_sqlite3_binary_host_mirror=${{ inputs.sqlite3-host-mirror }} - yarn install --frozen-lockfile --network-timeout 1000000 + if [ "${{ inputs.skip-postinstall }}" = "1" ]; then + npm ci --ignore-scripts + else + npm ci + fi diff --git a/.github/actions/redis-test-env-up/action.yml b/.github/actions/redis-test-env-up/action.yml index eac4ae7851..ed0695a8c0 100644 --- a/.github/actions/redis-test-env-up/action.yml +++ b/.github/actions/redis-test-env-up/action.yml @@ -66,3 +66,43 @@ runs: wait_for_cluster master-plain-7-1 "IP-based cluster (8200)" wait_for_cluster master-hostname-7-1 "Hostname-based cluster (8210)" + + - name: Wait for published Redis ports to serve + shell: bash + run: | + # Any RESP reply (+PONG, or -NOAUTH/-ERR) proves the server is serving. + redis_responds() { + local port=$1 reply='' + exec 3<>"/dev/tcp/127.0.0.1/$port" 2>/dev/null || return 1 + printf 'PING\r\n' >&3 || { exec 3<&- 3>&-; return 1; } + read -r -t 5 reply <&3 || { exec 3<&- 3>&-; return 1; } + exec 3<&- 3>&- + case "$reply" in +*|-*) return 0 ;; *) return 1 ;; esac + } + + # TLS (8104) needs a handshake before it speaks RESP, so only its socket + # is checked. + port_open() { + (exec 3<>"/dev/tcp/127.0.0.1/$1") 2>/dev/null + } + + wait_for_port() { + local port=$1 kind=$2 + for i in $(seq 1 60); do + # stderr is dropped at the call site: bash reports a refused + # /dev/tcp redirection itself, past the redirection in the function. + if [ "$kind" = tls ]; then + port_open "$port" 2>/dev/null && { echo "✅ $port accepting connections after ~$((i*2))s"; return 0; } + else + redis_responds "$port" 2>/dev/null && { echo "✅ $port serving after ~$((i*2))s"; return 0; } + fi + sleep 2 + done + echo "::error::Redis on port $port did not become ready within 120s" + return 1 + } + + for port in 8100 8101 8103 8105 8108 8109 8110 8200 8210 28100; do + wait_for_port "$port" resp + done + wait_for_port 8104 tls diff --git a/.github/actions/setup-e2e-playwright/action.yml b/.github/actions/setup-e2e-playwright/action.yml index 5daf33d094..7381b877a5 100644 --- a/.github/actions/setup-e2e-playwright/action.yml +++ b/.github/actions/setup-e2e-playwright/action.yml @@ -15,7 +15,7 @@ runs: using: 'composite' steps: - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v7.0.0 with: node-version-file: '.nvmrc' # Note: We don't use setup-node's npm cache here because: diff --git a/.github/build/build.sh b/.github/build/build.sh index 907587ced2..832c233894 100755 --- a/.github/build/build.sh +++ b/.github/build/build.sh @@ -2,11 +2,11 @@ set -e # install deps -yarn -yarn --cwd redisinsight/api +npm ci +npm ci --prefix redisinsight/api # build -yarn build:statics -yarn build:ui -yarn --cwd ./redisinsight/api build:prod +npm run build:statics +npm run build:ui +npm run build:prod --prefix redisinsight/api diff --git a/.github/build/build_modules.sh b/.github/build/build_modules.sh index 1c1da36437..26a3dfc47e 100755 --- a/.github/build/build_modules.sh +++ b/.github/build/build_modules.sh @@ -27,10 +27,11 @@ npm_config_arch="$ARCH" \ npm_config_target_arch="$ARCH" \ npm_config_platform="$PLATFORM" \ npm_config_target_platform="$PLATFORM" \ -yarn --cwd ./redisinsight/api install --production +npm ci --prefix ./redisinsight/api --omit=dev -cp redisinsight/api/.yarnclean.prod redisinsight/api/.yarnclean -yarn --cwd ./redisinsight/api autoclean --force +# NOTE: `yarn autoclean` has no npm equivalent, so pruning docs/tests/etc. from +# node_modules was dropped in the yarn->npm migration. This makes release +# artifacts larger; revisit with node-prune or a find-based clean if size regresses. rm -rf redisinsight/build.zip @@ -53,8 +54,8 @@ npm_config_arch="$ARCH" \ npm_config_target_arch="$ARCH" \ npm_config_platform="$PLATFORM" \ npm_config_target_platform="$PLATFORM" \ -yarn --cwd ./redisinsight/api install -yarn --cwd ./redisinsight/api minify:prod +npm ci --prefix ./redisinsight/api +npm run minify:prod --prefix ./redisinsight/api PACKAGE_JSON_PATH="./redisinsight/api/package.json" @@ -78,8 +79,7 @@ npm_config_arch="$ARCH" \ npm_config_target_arch="$ARCH" \ npm_config_platform="$PLATFORM" \ npm_config_target_platform="$PLATFORM" \ -yarn --cwd ./redisinsight/api install --production -yarn --cwd ./redisinsight/api autoclean --force +npm install --prefix ./redisinsight/api --omit=dev # Compress minified build cd redisinsight && tar -czf build-mini.tar.gz \ @@ -93,6 +93,6 @@ LICENSE \ mkdir -p release/web-mini cp redisinsight/build-mini.tar.gz release/web-mini/"$FILENAME" -# Restore the original package.json and yarn.lock -git restore redisinsight/api/yarn.lock redisinsight/api/package.json +# Restore the original package.json and package-lock.json +git restore redisinsight/api/package-lock.json redisinsight/api/package.json diff --git a/.github/build/release-docker.sh b/.github/build/release-docker.sh index 1ade23da49..fbbe810bea 100755 --- a/.github/build/release-docker.sh +++ b/.github/build/release-docker.sh @@ -2,7 +2,7 @@ set -e HELP="Args: --v - Semver (3.6.0) +-v - Semver (3.8.0) -d - Build image repository (Ex: -d redisinsight) -r - Target repository (Ex: -r redis/redisinsight) " diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ba99097161..55c1d9ce64 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,19 +1,291 @@ version: 2 +# One entry per lockfile. Directories absent from this file still get security +# updates: those run repo-wide and ignore this configuration. updates: - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: 'npm' + directory: '/' schedule: - interval: "weekly" + interval: 'weekly' + day: 'monday' + # Overnight, so the batch and its CI finish before the working day. + time: '02:00' + timezone: 'Europe/Sofia' + # A cap for a busy week, not an expected number. + open-pull-requests-limit: 15 + # Every pull request here edits the same lockfile, so an automatic rebase of + # the whole set follows each merge. Use `@dependabot rebase` when merging. + rebase-strategy: 'disabled' cooldown: + # Matches min-release-age=3 in .npmrc; anything newer cannot be installed. default-days: 3 - semver-major-days: 7 - semver-minor-days: 3 - semver-patch-days: 1 - - package-ecosystem: "github-actions" - directory: "/" + ignore: + # A major needs an owner and a full test run, so it belongs in planned work. + - dependency-name: '*' + update-types: ['version-update:semver-major'] + # A compiler minor moves the error counts in .tscheck.rec.json, which CI + # compares exactly. The baselines need refreshing by hand. + - dependency-name: 'typescript' + update-types: ['version-update:semver-minor'] + # An upgrade needs manual visual work on colors and paddings. + # + # Every rule below names its update types. A bare `dependency-name` would + # also suppress security updates for the package. + - dependency-name: '@redis-ui/*' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + # Pre-1.0: a minor changes the editor API. Twice failed type-check and the + # Linux build. + - dependency-name: 'monaco-editor' + update-types: ['version-update:semver-minor'] + # Follows the monaco-editor API. + - dependency-name: 'react-monaco-editor' + update-types: ['version-update:semver-minor'] + # Held on a prerelease by a patch in patches/. Leaving a prerelease for its + # release is neither patch, minor nor major, so only a version pin catches it. + - dependency-name: 'react-vtree' + versions: ['>= 3.0.0'] + # Held at 9.22.5: 9.22.6 fails the frontend tests. + - dependency-name: 'react-virtualized' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + # A patch in patches/ is keyed to the exact version. Moving these means + # regenerating the patch and relaxing the rule together. + - dependency-name: 'monaco-yaml' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + - dependency-name: '@elastic/eui' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + + # A group opens at most one pull request, so the number of groups sets how + # many arrive in a week. Grouped by what a failure points at. + # + # A dependency lands in its most specific matching group: an exact name beats + # a wildcard, which beats `*`. A catch-all that omits `patterns` outranks the + # named groups and swallows them. + groups: + # Shows up as a visual or behavioural change in the UI. + frontend: + update-types: ['patch', 'minor'] + patterns: [ + 'react', + 'react-dom', + '@types/react', + '@types/react-dom', + 'redux', + 'react-redux', + '@reduxjs/toolkit', + 'redux-thunk', + 'redux-mock-store', + 'i18next', + 'i18next-cli', + 'react-i18next', + 'monaco-editor', + 'monaco-yaml', + 'react-monaco-editor', + # The browser key list renders through these together. + 'react-virtualized', + 'react-virtualized-auto-sizer', + 'react-window', + 'react-window-infinite-loader', + 'react-vtree', + '@types/react-virtualized', + '@types/react-window-infinite-loader', + ] + # Packaging plus the Electron runtime libraries. electron-builder releases + # electron-updater and builder-util-runtime in lockstep, and node-abi maps + # Electron versions to native module ABIs. A failure needs an installed app + # to reproduce. + electron: + update-types: ['patch', 'minor'] + patterns: + [ + 'electron', + 'electron-builder', + 'electron-builder-notarize', + 'electron-updater', + 'app-builder-lib', + 'builder-util*', + '@electron/*', + 'node-abi', + 'electron-context-menu', + 'electron-debug', + 'electron-devtools-installer', + 'electron-log', + 'electron-store', + '@types/electron-store', + ] + # Vite builds the renderer, webpack the Electron main and preload bundles. + # Breakage stops the build rather than changing behaviour. + tooling: + update-types: ['patch', 'minor'] + patterns: [ + 'vite', + 'vite-*', + '@vitejs/*', + 'esbuild', + 'esbuild-*', + 'rollup', + 'webpack', + 'webpack-*', + '*-webpack-plugin', + 'mini-css-extract-plugin', + '@svgr/webpack', + 'react-refresh', + # Named individually: a `*-loader` glob also catches + # react-window-infinite-loader. + 'css-loader', + 'file-loader', + 'style-loader', + 'ts-loader', + 'url-loader', + '@teamsupercell/typings-for-css-modules-loader', + 'typescript', + '@aivenio/tsc-output-parser', + 'eslint', + 'eslint-*', + '@typescript-eslint/*', + 'prettier', + 'prettier-*', + 'lint-staged', + '@babel/*', + 'babel-*', + 'storybook', + '@storybook/*', + ] + # A failure here is usually the runner, not the application. + testing: + update-types: ['patch', 'minor'] + patterns: + [ + 'jest', + 'jest-*', + 'ts-jest', + '@testing-library/*', + '@faker-js/faker', + 'msw', + 'supertest', + 'ts-mockito', + 'fishery', + 'identity-obj-proxy', + '@types/jest', + '@types/supertest', + ] + # No `update-types`: an update matching no group would open its own pull + # request, and a prerelease reaching its release counts as a major. + everything-else: + patterns: ['*'] + + # Two lockfiles in one entry. /redisinsight ships the packaged app's lockfile + # and declares the same native modules as the api tree, so covering both here + # lets shared-natives update them together. Separate entries cannot. + - package-ecosystem: 'npm' + directories: + - '/redisinsight' + - '/redisinsight/api' + schedule: + interval: 'weekly' + day: 'monday' + time: '02:00' + timezone: 'Europe/Sofia' + open-pull-requests-limit: 10 + # Same reason as the root entry. + rebase-strategy: 'disabled' + cooldown: + default-days: 3 + + ignore: + # Same policy as the root entry. + - dependency-name: '*' + update-types: ['version-update:semver-major'] + # As above: a compiler minor moves the recorded error counts. + - dependency-name: 'typescript' + update-types: ['version-update:semver-minor'] + # Pre-1.0, so a minor carries breaking schema and driver changes. + - dependency-name: 'typeorm' + update-types: ['version-update:semver-minor'] + # A minor on the Redis clients has broken lint, type-check and both builds. + - dependency-name: 'ioredis-mock' + update-types: ['version-update:semver-minor'] + - dependency-name: 'redis' + update-types: ['version-update:semver-minor'] + # A patch in redisinsight/api/patches/ is keyed to the exact version, so + # any bump either fails postinstall or drops the patch. Moving these means + # regenerating the patch and relaxing the rule together. + - dependency-name: 'ioredis' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + - dependency-name: 'redis-parser' + update-types: + ['version-update:semver-patch', 'version-update:semver-minor'] + + groups: + # `group-by` raises one pull request per dependency spanning both + # lockfiles, so the two trees cannot drift onto different versions. No + # update-types filter: anything outside this group arrives per directory. + shared-natives: + group-by: 'dependency-name' + patterns: ['better-sqlite3', 'keytar', 'tunnel-ssh'] + # rxjs and reflect-metadata are NestJS peers pinned to its major. No + # `dependency-type`, so ioredis-mock can travel with ioredis. + backend: + update-types: ['patch', 'minor'] + patterns: + [ + '@nestjs/*', + 'rxjs', + 'reflect-metadata', + 'redis', + 'redis-parser', + 'ioredis', + 'ioredis-mock', + '@types/ioredis-mock', + 'socket.io', + 'socket.io-client', + 'socket.io-mock', + 'typescript', + ] + # Unit tests on jest, integration on mocha and chai. babel-jest follows + # jest's major, not Babel's. + testing: + update-types: ['patch', 'minor'] + patterns: + [ + 'jest', + 'jest-*', + 'ts-jest', + 'babel-jest', + '@types/jest', + '@faker-js/faker', + 'supertest', + '@types/supertest', + 'mocha', + 'mocha-*', + '@mochajs/*', + 'ts-mocha', + 'chai', + 'chai-*', + 'nyc', + 'nock', + 'fishery', + ] + # No `update-types`, for the same reason as the root entry. + everything-else: + patterns: ['*'] + + # Actions are versioned by major tag, so majors are the upgrades worth taking + # and are deliberately not ignored here. + - package-ecosystem: 'github-actions' + directory: '/' schedule: - interval: "weekly" + interval: 'weekly' + day: 'monday' + time: '02:00' + timezone: 'Europe/Sofia' cooldown: default-days: 3 + groups: + github-actions: + patterns: ['*'] diff --git a/.github/deps-audit-report.js b/.github/deps-audit-report.js deleted file mode 100644 index 228c7d8542..0000000000 --- a/.github/deps-audit-report.js +++ /dev/null @@ -1,87 +0,0 @@ -const fs = require('fs'); -const { exec } = require('child_process'); - -const FILENAME = process.env.FILENAME; -const DEPS = process.env.DEPS || ''; -const file = `${FILENAME}`; -const outputFile = `slack.${FILENAME}`; - -function generateSlackMessage(summary) { - const message = { - text: - `DEPS AUDIT: *${DEPS}* result (Branch: *${process.env.GITHUB_REF_NAME}*)` + - `\nScanned ${summary.totalDependencies} dependencies` + - `\n`, - attachments: [], - }; - - if (summary.totalVulnerabilities) { - if (summary.vulnerabilities.critical) { - message.attachments.push({ - title: 'Critical', - color: '#641E16', - text: `${summary.vulnerabilities.critical}`, - }); - } - if (summary.vulnerabilities.high) { - message.attachments.push({ - title: 'High', - color: '#C0392B', - text: `${summary.vulnerabilities.high}`, - }); - } - if (summary.vulnerabilities.moderate) { - message.attachments.push({ - title: 'Moderate', - color: '#F5B041', - text: `${summary.vulnerabilities.moderate}`, - }); - } - if (summary.vulnerabilities.low) { - message.attachments.push({ - title: 'Low', - color: '#F9E79F', - text: `${summary.vulnerabilities.low}`, - }); - } - if (summary.vulnerabilities.info) { - message.attachments.push({ - title: 'Info', - text: `${summary.vulnerabilities.info}`, - }); - } - } else { - message.attachments.push({ - title: 'No vulnerabilities found', - color: 'good', - }); - } - - return message; -} - -async function main() { - const lastAuditLine = await new Promise((resolve, reject) => { - exec(`tail -n 1 ${file}`, (error, stdout, stderr) => { - if (error) { - return reject(error); - } - resolve(stdout); - }); - }); - - const { data: summary } = JSON.parse(`${lastAuditLine}`); - const vulnerabilities = summary?.vulnerabilities || {}; - summary.totalVulnerabilities = Object.values(vulnerabilities).reduce( - (totalVulnerabilities, val) => totalVulnerabilities + val, - ); - fs.writeFileSync( - outputFile, - JSON.stringify({ - channel: process.env.SLACK_AUDIT_REPORT_CHANNEL, - ...generateSlackMessage(summary), - }), - ); -} - -main(); diff --git a/.github/workflows/aws-upload-dev.yml b/.github/workflows/aws-upload-dev.yml index 14d5b5835e..f73facee60 100644 --- a/.github/workflows/aws-upload-dev.yml +++ b/.github/workflows/aws-upload-dev.yml @@ -19,7 +19,7 @@ jobs: name: Upload to s3 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Get current date id: date diff --git a/.github/workflows/aws-upload-enterprise.yml b/.github/workflows/aws-upload-enterprise.yml index 233dc13e57..41464fa7c5 100644 --- a/.github/workflows/aws-upload-enterprise.yml +++ b/.github/workflows/aws-upload-enterprise.yml @@ -22,7 +22,7 @@ jobs: name: Upload to s3 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Get current date id: date diff --git a/.github/workflows/aws-upload-prod.yml b/.github/workflows/aws-upload-prod.yml index e77b27c883..32d0cf3d24 100644 --- a/.github/workflows/aws-upload-prod.yml +++ b/.github/workflows/aws-upload-prod.yml @@ -15,7 +15,7 @@ jobs: name: Release s3 private runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Merge builds by pattern id: merge-builds @@ -51,7 +51,7 @@ jobs: needs: 'release-private' environment: 'production-approve' steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Init variables run: | diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 06a04ba32e..b056075336 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -15,7 +15,7 @@ jobs: name: Unit tests coverage if: ${{ inputs.type == 'unit' }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Download Coverage Report uses: actions/download-artifact@v8 @@ -41,7 +41,7 @@ jobs: name: Integration tests coverage if: ${{ inputs.type == 'integration' }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Download Coverage Report uses: actions/download-artifact@v8 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7f6bef6a24..7e035fc1ba 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,11 +38,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.36.2 + uses: github/codeql-action/init@v4.37.6 with: languages: ${{ matrix.language }} config-file: ./.github/codeql/config.yml @@ -54,7 +54,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v4.36.2 + uses: github/codeql-action/autobuild@v4.37.6 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -68,4 +68,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.36.2 + uses: github/codeql-action/analyze@v4.37.6 diff --git a/.github/workflows/compress-images.yml b/.github/workflows/compress-images.yml index 0169c4b1d1..000031d7d4 100644 --- a/.github/workflows/compress-images.yml +++ b/.github/workflows/compress-images.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repo - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Compress Images uses: calibreapp/image-actions@main diff --git a/.github/workflows/dependency-audit.yml b/.github/workflows/dependency-audit.yml new file mode 100644 index 0000000000..92aaaaf3b7 --- /dev/null +++ b/.github/workflows/dependency-audit.yml @@ -0,0 +1,132 @@ +name: Dependency Audit + +on: + workflow_dispatch: + inputs: + branch: + description: 'Branch/ref to audit (blank = current ref)' + type: string + default: '' + post_to_slack: + description: 'Post results to Slack' + type: boolean + default: true + schedule: + - cron: '0 7 * * 1' # weekly, Monday 07:00 UTC + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + audit: + name: Audit dependencies + runs-on: ubuntu-latest + # Gates every Slack step so a manual run with post_to_slack off stays silent. + env: + POST_TO_SLACK: ${{ github.event_name != 'workflow_dispatch' || inputs.post_to_slack }} + steps: + - uses: actions/checkout@v7.0.1 + with: + ref: ${{ inputs.branch || github.ref }} + + # Label Slack with the tree actually audited. A manual run can check out a + # different ref via inputs.branch, so github.ref_name/github.sha (the + # trigger ref) would misname it. + - name: Resolve audited ref + id: audited + env: + INPUT_BRANCH: ${{ inputs.branch }} + TRIGGER_REF: ${{ github.ref_name }} + run: | + { + echo "ref=${INPUT_BRANCH:-$TRIGGER_REF}" + echo "sha=$(git rev-parse HEAD)" + } >> "$GITHUB_OUTPUT" + + # `npm audit` reads the committed lockfiles and the core tests are plain + # `node --test` — neither needs `node_modules`, so we only set up Node. + - name: Setup Node + uses: actions/setup-node@v7.0.0 + with: + node-version-file: '.nvmrc' + + - name: Run dependency-audit core tests + run: npm run test:scripts + + - name: Run dependency audit report + id: report + run: node scripts/dependency-audit-report.mjs --github + + # Inline payload mirrors the E2E nightly Slack step. + - name: Post to Slack + if: env.POST_TO_SLACK == 'true' && steps.report.outputs.post == 'true' + uses: slackapi/slack-github-action@v4.0.0 + with: + # Fail the step on a Slack API error; v4 stays green otherwise, + # hiding an alert that never got delivered. + errors: true + method: chat.postMessage + token: ${{ secrets.SLACK_TEST_REPORT_KEY }} + payload: | + channel: "${{ secrets.SLACK_TEST_REPORT_CHANNEL }}" + text: " *Dependency audit — ${{ steps.report.outputs.total_hc }} high/critical* — `${{ github.repository }}` on `${{ steps.audited.outputs.ref }}` @ `${{ steps.audited.outputs.sha }}`" + attachments: + - color: "${{ steps.report.outputs.color }}" + title: "${{ github.workflow }}" + title_link: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + fields: + - title: "Prod Critical" + value: "${{ steps.report.outputs.prod_critical }}" + short: true + - title: "Prod High" + value: "${{ steps.report.outputs.prod_high }}" + short: true + - title: "Dev Critical" + value: "${{ steps.report.outputs.dev_critical }}" + short: true + - title: "Dev High" + value: "${{ steps.report.outputs.dev_high }}" + short: true + + # Separate from the vulnerability report so a broken audit can't read as + # clean, and still fires if the post above errored out. + - name: Alert Slack when the audit could not run + if: ${{ !cancelled() && env.POST_TO_SLACK == 'true' && steps.report.outputs.failed == 'true' }} + uses: slackapi/slack-github-action@v4.0.0 + with: + # Fail the step on a Slack API error; v4 stays green otherwise, + # hiding an alert that never got delivered. + errors: true + method: chat.postMessage + token: ${{ secrets.SLACK_TEST_REPORT_KEY }} + payload: | + channel: "${{ secrets.SLACK_TEST_REPORT_CHANNEL }}" + text: " *Dependency audit could not run* — one or more lockfiles failed to audit; the vulnerability report is incomplete — `${{ github.repository }}` on `${{ steps.audited.outputs.ref }}` @ `${{ steps.audited.outputs.sha }}`" + attachments: + - color: "#cc0000" + title: "${{ github.workflow }} — see step summary for the affected trees" + title_link: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + + # A failure at or before the report (e.g. the core tests) would otherwise + # stop the job with no alert. The report-outcome gate skips post-report + # Slack failures. + - name: Alert Slack when the audit workflow failed + if: failure() && env.POST_TO_SLACK == 'true' && steps.report.outcome != 'success' + uses: slackapi/slack-github-action@v4.0.0 + with: + # Fail the step on a Slack API error; v4 stays green otherwise, + # hiding an alert that never got delivered. + errors: true + method: chat.postMessage + token: ${{ secrets.SLACK_TEST_REPORT_KEY }} + payload: | + channel: "${{ secrets.SLACK_TEST_REPORT_CHANNEL }}" + text: " *Dependency audit workflow failed* — a step errored before the report completed — `${{ github.repository }}` on `${{ steps.audited.outputs.ref || github.ref_name }}`" + attachments: + - color: "#cc0000" + title: "${{ github.workflow }} — check the failed step" + title_link: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 897fe1cda0..9ea40b279d 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest name: Docker Build steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Build Docker image run: docker build -t redisinsight-local . diff --git a/.github/workflows/github-release-upload.yml b/.github/workflows/github-release-upload.yml index 1cdd779d4b..5786f5bb71 100644 --- a/.github/workflows/github-release-upload.yml +++ b/.github/workflows/github-release-upload.yml @@ -10,8 +10,9 @@ jobs: upload: name: Upload assets to GitHub draft release runs-on: ubuntu-latest + continue-on-error: true steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Download builds uses: actions/download-artifact@v8 @@ -27,21 +28,24 @@ jobs: APP_VERSION=$(jq -r '.version' redisinsight/package.json) echo "version=${APP_VERSION}" >> "$GITHUB_OUTPUT" - RELEASE_TAG=$(gh release list --json tagName,isDraft \ - --jq ".[] | select(.isDraft and .tagName == \"${APP_VERSION}\") | .tagName" \ - | head -n 1) + RELEASE_TAG=$(gh release list --json tagName,name,isDraft \ + --jq "[.[] | select(.isDraft and (.name | contains(\"${APP_VERSION}\")))][0].tagName") - if [ -z "$RELEASE_TAG" ]; then - echo "::warning::No draft release found for tag '${APP_VERSION}'. Skipping upload." - echo "found=false" >> "$GITHUB_OUTPUT" + if [ -z "$RELEASE_TAG" ] || [ "$RELEASE_TAG" = "null" ]; then + echo "No draft release found for '${APP_VERSION}'. Creating one." + gh release create "${APP_VERSION}" \ + --draft \ + --target "${GITHUB_SHA}" \ + --title "${APP_VERSION}" \ + --notes "Release ${APP_VERSION}" + RELEASE_TAG="${APP_VERSION}" else - echo "Draft release found: ${RELEASE_TAG}" - echo "found=true" >> "$GITHUB_OUTPUT" - echo "tag=${RELEASE_TAG}" >> "$GITHUB_OUTPUT" + echo "Draft release found (tag: ${RELEASE_TAG})" fi + echo "tag=${RELEASE_TAG}" >> "$GITHUB_OUTPUT" + - name: Upload desktop installers to draft release - if: steps.find-release.outputs.found == 'true' env: GH_TOKEN: ${{ github.token }} run: | diff --git a/.github/workflows/i18n-locale-check.yml b/.github/workflows/i18n-locale-check.yml index 34442d2a90..207f470305 100644 --- a/.github/workflows/i18n-locale-check.yml +++ b/.github/workflows/i18n-locale-check.yml @@ -12,11 +12,11 @@ jobs: runs-on: ubuntu-latest name: Check duplicate i18n keys steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7.0.0 with: node-version-file: '.nvmrc' - name: Check i18n locale files for duplicate keys - run: yarn i18n:check + run: npm run i18n:check diff --git a/.github/workflows/licenses-check.yml b/.github/workflows/licenses-check.yml index a705a033b6..3c5c6f28a6 100644 --- a/.github/workflows/licenses-check.yml +++ b/.github/workflows/licenses-check.yml @@ -8,7 +8,7 @@ jobs: name: Licenses check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Install all libs and dependencies uses: ./.github/actions/install-all-build-libs @@ -16,7 +16,7 @@ jobs: - name: Install plugins dependencies env: pluginsOnlyInstall: 1 - run: yarn build:statics + run: npm run build:statics - name: Generate licenses csv files and send csv data to google sheet env: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6fecaf94e9..5df97009b2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest name: ESLint steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Install dependencies uses: ./.github/actions/install-all-build-libs @@ -28,4 +28,4 @@ jobs: eslint-${{ runner.os }}-${{ hashFiles('.eslintrc.js') }}- - name: Run ESLint - run: yarn lint + run: npm run lint diff --git a/.github/workflows/manual-build-enterprise.yml b/.github/workflows/manual-build-enterprise.yml index 9aa47bb2ad..fcdf893958 100644 --- a/.github/workflows/manual-build-enterprise.yml +++ b/.github/workflows/manual-build-enterprise.yml @@ -96,7 +96,7 @@ jobs: outputs: # Set this to consume the output on other job selected: ${{ steps.get-selected.outputs.selected}} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - id: get-selected uses: joao-zanutto/get-selected@v2.0.0 @@ -143,6 +143,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Remove all artifacts uses: ./.github/actions/remove-artifacts diff --git a/.github/workflows/manual-build.yml b/.github/workflows/manual-build.yml index 47a5e46bb7..b910eb836f 100644 --- a/.github/workflows/manual-build.yml +++ b/.github/workflows/manual-build.yml @@ -96,7 +96,7 @@ jobs: outputs: # Set this to consume the output on other job selected: ${{ steps.get-selected.outputs.selected}} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - id: get-selected uses: joao-zanutto/get-selected@v2.0.0 @@ -141,6 +141,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Remove all artifacts uses: ./.github/actions/remove-artifacts diff --git a/.github/workflows/pipeline-build-docker.yml b/.github/workflows/pipeline-build-docker.yml index 7c40429ac2..0e696fe9e7 100644 --- a/.github/workflows/pipeline-build-docker.yml +++ b/.github/workflows/pipeline-build-docker.yml @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-24.04 environment: ${{ inputs.environment }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 # SSH Debug - name: Enable SSH diff --git a/.github/workflows/pipeline-build-linux.yml b/.github/workflows/pipeline-build-linux.yml index fccd3fa0b9..bd02318b4e 100644 --- a/.github/workflows/pipeline-build-linux.yml +++ b/.github/workflows/pipeline-build-linux.yml @@ -70,7 +70,7 @@ jobs: needsSystemFpm: true steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 # SSH Debug - name: Enable SSH @@ -87,7 +87,7 @@ jobs: cache-node-modules: '0' - name: Install plugins dependencies and build plugins - run: yarn build:statics + run: npm run build:statics - name: Resolve linux targets for matrix arch id: resolve-targets @@ -147,11 +147,11 @@ jobs: - name: Build linux packages (production) if: vars.ENV == 'production' && steps.resolve-targets.outputs.mode == 'default' - run: yarn package:prod --linux ${{ matrix.defaultTargets }} + run: npm run package:prod -- --linux ${{ matrix.defaultTargets }} - name: Build linux packages (staging) if: (vars.ENV == 'staging' || vars.ENV == 'development') && steps.resolve-targets.outputs.mode == 'default' - run: yarn package:stage --linux ${{ matrix.defaultTargets }} + run: npm run package:stage -- --linux ${{ matrix.defaultTargets }} - name: Build linux packages (custom) if: steps.resolve-targets.outputs.mode == 'custom' @@ -160,9 +160,9 @@ jobs: CUSTOM_TARGETS: ${{ steps.resolve-targets.outputs.custom_targets }} run: | if [ "$IS_PRODUCTION" == "true" ]; then - yarn package:prod --linux $CUSTOM_TARGETS + npm run package:prod -- --linux $CUSTOM_TARGETS else - yarn package:stage --linux $CUSTOM_TARGETS + npm run package:stage -- --linux $CUSTOM_TARGETS fi - name: Verify native binaries diff --git a/.github/workflows/pipeline-build-macos.yml b/.github/workflows/pipeline-build-macos.yml index 209e67b4a4..28927f8742 100644 --- a/.github/workflows/pipeline-build-macos.yml +++ b/.github/workflows/pipeline-build-macos.yml @@ -35,7 +35,7 @@ jobs: runs-on: macos-14 environment: ${{ inputs.environment }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 # SSH Debug - name: Enable SSH @@ -62,15 +62,15 @@ jobs: cache-node-modules: '0' - name: Install plugins dependencies and build plugins - run: yarn build:statics + run: npm run build:statics - name: Build macos dmg (prod) if: vars.ENV == 'production' && inputs.target == vars.ALL run: | unset CSC_LINK - yarn package:prod - yarn package:mas + npm run package:prod + npm run package:mas rm -rf release/mac mv release/mas-universal/Redis-Insight-mac-universal-mas.pkg release/Redis-Insight-mac-universal-mas.pkg @@ -82,7 +82,7 @@ jobs: echo $APP_BUNDLE_VERSION echo $CSC_KEYCHAIN - yarn package:stage && yarn package:mas + npm run package:stage && npm run package:mas rm -rf release/mac mv release/mas-universal/Redis-Insight-mac-universal-mas.pkg release/Redis-Insight-mac-universal-mas.pkg @@ -95,9 +95,9 @@ jobs: target=$(echo "${{inputs.target}}" | grep -oE 'build_macos_[^ ]+' | sed 's/build_macos_/dmg:/' | paste -sd ' ' -) if [ "${{ vars.ENV == 'production' }}" == "true" ]; then - yarn package:prod --mac $target + npm run package:prod -- --mac $target else - yarn package:stage --mac $target + npm run package:stage -- --mac $target fi rm -rf release/mac diff --git a/.github/workflows/pipeline-build-windows.yml b/.github/workflows/pipeline-build-windows.yml index 053c9cccfd..e09e2a771d 100644 --- a/.github/workflows/pipeline-build-windows.yml +++ b/.github/workflows/pipeline-build-windows.yml @@ -29,7 +29,7 @@ jobs: environment: ${{ inputs.environment }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 # SSH Debug - name: Enable SSH @@ -52,19 +52,19 @@ jobs: WIN_CSC_DIGICERT_KEYPAIR_ALIAS: ${{ secrets.WIN_CSC_DIGICERT_KEYPAIR_ALIAS }} - name: Install plugins dependencies and build plugins - run: yarn build:statics:win + run: npm run build:statics:win - name: Build windows exe (production) if: vars.ENV == 'production' run: | - yarn package:prod -c.win.signtoolOptions.certificateSha1=${{ secrets.WIN_CSC_DIGICERT_CERT_SHA1 }} + npm run package:prod -- -c.win.signtoolOptions.certificateSha1=${{ secrets.WIN_CSC_DIGICERT_CERT_SHA1 }} rm -rf release/win-unpacked shell: bash - name: Build windows exe (staging) if: (vars.ENV == 'staging' || vars.ENV == 'development') run: | - yarn package:stage -c.win.signtoolOptions.certificateSha1=${{ secrets.WIN_CSC_DIGICERT_CERT_SHA1 }} + npm run package:stage -- -c.win.signtoolOptions.certificateSha1=${{ secrets.WIN_CSC_DIGICERT_CERT_SHA1 }} rm -rf release/win-unpacked shell: bash diff --git a/.github/workflows/publish-stores.yml b/.github/workflows/publish-stores.yml index b99adfd155..f0f3af5f94 100644 --- a/.github/workflows/publish-stores.yml +++ b/.github/workflows/publish-stores.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest name: Publish to Dockerhub steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Download Docker images run: | @@ -65,7 +65,7 @@ jobs: SNAPCRAFT_FILE_NAME: ${{ matrix.snapcraft_file_name }} SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Download Snapcraft package id: snap diff --git a/.github/workflows/release-prod.yml b/.github/workflows/release-prod.yml index fab4eb897c..3b3193d910 100644 --- a/.github/workflows/release-prod.yml +++ b/.github/workflows/release-prod.yml @@ -6,18 +6,11 @@ on: - "latest" jobs: - tests-prod: - name: Run all tests - uses: ./.github/workflows/tests.yml - secrets: inherit - with: - short_rte_list: false - pre_release: true - + # Tests run on the release PR (tests.yml), not here — the build is gated by + # that PR's run. builds-prod: name: Create all builds for release uses: ./.github/workflows/build.yml - needs: tests-prod secrets: inherit with: environment: "production" @@ -56,6 +49,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Remove all artifacts uses: ./.github/actions/remove-artifacts diff --git a/.github/workflows/release-stage.yml b/.github/workflows/release-stage.yml index 9fa5814568..b7c7ea51fe 100644 --- a/.github/workflows/release-stage.yml +++ b/.github/workflows/release-stage.yml @@ -6,18 +6,11 @@ on: - "release/**" jobs: - tests: - name: Release stage tests - uses: ./.github/workflows/tests.yml - secrets: inherit - with: - short_rte_list: false - pre_release: true - + # Tests run on the release PR (tests.yml), not here — the build is gated by + # that PR's run. builds: name: Release stage builds uses: ./.github/workflows/build.yml - needs: tests secrets: inherit with: environment: "staging" @@ -39,6 +32,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Remove all artifacts uses: ./.github/actions/remove-artifacts # Remove artifacts from github actions diff --git a/.github/workflows/tests-backend.yml b/.github/workflows/tests-backend.yml index 342682eb78..57d4b39504 100644 --- a/.github/workflows/tests-backend.yml +++ b/.github/workflows/tests-backend.yml @@ -9,8 +9,6 @@ on: required: false env: - SLACK_AUDIT_REPORT_CHANNEL: ${{ secrets.SLACK_AUDIT_REPORT_CHANNEL }} - SLACK_AUDIT_REPORT_KEY: ${{ secrets.SLACK_AUDIT_REPORT_KEY }} REPORT_NAME: 'report-be' jobs: @@ -18,32 +16,16 @@ jobs: name: Unit tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Install all libs and dependencies for BE uses: ./.github/actions/install-all-build-libs with: skip-system-deps: '1' - - name: API PROD dependencies scan - run: | - FILENAME=api.prod.deps.audit.json - - yarn --cwd redisinsight/api audit --groups dependencies --json > $FILENAME || true && - FILENAME=$FILENAME DEPS="API prod" node .github/deps-audit-report.js && - curl -H "Content-type: application/json" --data @slack.$FILENAME -H "Authorization: Bearer $SLACK_AUDIT_REPORT_KEY" -X POST https://slack.com/api/chat.postMessage - - - name: API DEV dependencies scan - run: | - FILENAME=api.dev.deps.audit.json - - yarn --cwd redisinsight/api audit --groups devDependencies --json > $FILENAME || true && - FILENAME=$FILENAME DEPS="API dev" node .github/deps-audit-report.js && - curl -H "Content-type: application/json" --data @slack.$FILENAME -H "Authorization: Bearer $SLACK_AUDIT_REPORT_KEY" -X POST https://slack.com/api/chat.postMessage - - name: Unit tests API timeout-minutes: 20 - run: yarn --cwd redisinsight/api/ test:cov --ci --silent + run: npm run test:cov --prefix redisinsight/api -- --ci --silent - name: Upload Test Report uses: actions/upload-artifact@v7 diff --git a/.github/workflows/tests-e2e-playwright-chromium.yml b/.github/workflows/tests-e2e-playwright-chromium.yml index 869dba4be4..0993751a14 100644 --- a/.github/workflows/tests-e2e-playwright-chromium.yml +++ b/.github/workflows/tests-e2e-playwright-chromium.yml @@ -29,12 +29,17 @@ jobs: E2E_CLOUD_DATABASE_PORT: ${{ secrets.E2E_CLOUD_DATABASE_PORT }} E2E_CLOUD_DATABASE_NAME: ${{ secrets.E2E_CLOUD_DATABASE_NAME }} E2E_CLOUD_API_SECRET_KEY: ${{ secrets.E2E_CLOUD_API_SECRET_KEY }} - E2E_RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} - RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} + # Not a secret: dependabot[bot] runs cannot read Actions secrets, and this + # only encrypts credentials for this job's throwaway Redis containers. + E2E_RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' + RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' TEST_BIG_DB_DUMP: ${{ secrets.TEST_BIG_DB_DUMP }} + outputs: + digest: ${{ steps.summarize.outputs.digest }} + steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Enable SSH Debug if: ${{ inputs.debug }} @@ -54,26 +59,29 @@ jobs: working-directory: ${{ env.E2E_DIR }} - name: Build statics - run: yarn build:statics + run: npm run build:statics - name: Build UI (production web bundle) - run: yarn build:ui + run: npm run build:ui - name: Build API - run: yarn --cwd redisinsight/api build + run: npm run build --prefix redisinsight/api - name: Start application (production mode) env: RI_SERVE_STATICS: 'true' run: | - yarn --cwd redisinsight/api start:prod & + npm run start:prod --prefix redisinsight/api & npx wait-on http://localhost:5540/api/health --timeout 120000 - - name: Ensure host.docker.internal resolves on the host + - name: Ensure cluster addresses resolve on the host run: | if ! grep -q host.docker.internal /etc/hosts; then echo "127.0.0.1 host.docker.internal" | sudo tee -a /etc/hosts fi + if ! grep -q master-hostname-7-1 /etc/hosts; then + echo "127.0.0.1 master-hostname-7-1 master-hostname-7-2 master-hostname-7-3" | sudo tee -a /etc/hosts + fi - name: Start Redis test environment uses: ./.github/actions/redis-test-env-up @@ -89,6 +97,28 @@ jobs: RI_CLIENT_URL: http://localhost:5540 RI_API_URL: http://localhost:5540 + - name: Summarize Playwright results + id: summarize + if: always() + working-directory: ${{ env.E2E_DIR }} + run: | + node scripts/summarize-results.mjs \ + --json test-results/agent-digest.json \ + --markdown >> "$GITHUB_STEP_SUMMARY" + { + echo 'digest<> "$GITHUB_OUTPUT" + + - name: Upload agent digest + if: always() + uses: actions/upload-artifact@v7 + with: + name: e2e-digest-chromium + path: ${{ env.E2E_DIR }}/test-results/agent-digest.json + retention-days: 14 + - name: Upload test results if: always() uses: actions/upload-artifact@v7 diff --git a/.github/workflows/tests-e2e-playwright-docker.yml b/.github/workflows/tests-e2e-playwright-docker.yml index 41b2250456..fd11c302da 100644 --- a/.github/workflows/tests-e2e-playwright-docker.yml +++ b/.github/workflows/tests-e2e-playwright-docker.yml @@ -29,12 +29,17 @@ jobs: E2E_CLOUD_DATABASE_PORT: ${{ secrets.E2E_CLOUD_DATABASE_PORT }} E2E_CLOUD_DATABASE_NAME: ${{ secrets.E2E_CLOUD_DATABASE_NAME }} E2E_CLOUD_API_SECRET_KEY: ${{ secrets.E2E_CLOUD_API_SECRET_KEY }} - E2E_RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} - RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} + # Not a secret: dependabot[bot] runs cannot read Actions secrets, and this + # only encrypts credentials for this job's throwaway Redis containers. + E2E_RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' + RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' TEST_BIG_DB_DUMP: ${{ secrets.TEST_BIG_DB_DUMP }} + outputs: + digest: ${{ steps.summarize.outputs.digest }} + steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Enable SSH Debug if: ${{ inputs.debug }} @@ -70,10 +75,65 @@ jobs: docker compose -p e2e-ri-docker \ -f tests/e2e/docker.web.docker-compose.yml \ up --detach --force-recreate - # Wait for the app to be ready - sleep 10 + + # /api/health and GET /api/databases both answer while POST to the same + # path still 404s, so gate on the write the suite depends on. npx wait-on http://localhost:5540/api/health --timeout 60000 + echo "Waiting for POST /api/databases to be served..." + for i in $(seq 1 60); do + code=$(curl -s -o /tmp/ri-probe.json -w '%{http_code}' \ + -X POST http://localhost:5540/api/databases \ + -H 'Content-Type: application/json' \ + -d '{"name":"test-readiness-probe","host":"host.docker.internal","port":8100}' || true) + + if [ "$code" = "200" ] || [ "$code" = "201" ]; then + # Prefixed "test-" so browser.setup cleans it up if this delete fails. + id=$(jq -r '.id // empty' /tmp/ri-probe.json) + [ -n "$id" ] && curl -s -o /dev/null -X DELETE "http://localhost:5540/api/databases/$id" || true + echo "✅ POST /api/databases served after ~$((i*2))s" + break + fi + + if [ "$i" = "60" ]; then + echo "::error::POST /api/databases still returning $code after 120s" + cat /tmp/ri-probe.json || true + exit 1 + fi + sleep 2 + done + + - name: Start connectivity probes + run: | + docker rm -f conn-probe >/dev/null 2>&1 || true + docker run -d --name conn-probe \ + --add-host host.docker.internal:host-gateway \ + --add-host master-hostname-7-1:host-gateway \ + redis:7.0.0 \ + sh -c 'probe() { + s=$(date +%s%3N) + if timeout 5 redis-cli -h "$1" -p "$2" ping >/dev/null 2>&1; then r=ok; else r=FAIL; fi + e=$(date +%s%3N) + echo "$(date -u +%T) container $3 $r $((e-s))ms" + } + while true; do + probe host.docker.internal 8100 standalone + probe master-hostname-7-1 8210 cluster-hostname + sleep 2 + done' + + # perl rather than `date +%s%3N`, which is GNU-only. It adds ~40ms per + # sample, so compare failures and stalls between the probes, not baselines. + nohup bash -c 'nowms() { perl -MTime::HiRes=time -e "printf \"%d\n\", time*1000"; } + while true; do + s=$(nowms) + if timeout 5 bash -c "exec 3<>/dev/tcp/127.0.0.1/8100" 2>/dev/null; then r=ok; else r=FAIL; fi + e=$(nowms) + echo "$(date -u +%T) host $r $((e-s))ms" + sleep 2 + done' > /tmp/host-probe.log 2>&1 & + echo "probes started" + - name: Run Playwright tests (Chromium - Docker) working-directory: ${{ env.E2E_DIR }} run: npx playwright test --project=chromium-parallel --project=chromium-serial @@ -96,6 +156,78 @@ jobs: OSS_CLUSTER_HOST: 'host.docker.internal' OSS_CLUSTER_HOSTNAME_HOST: 'host.docker.internal' + - name: Collect connectivity probes + if: always() + run: | + dest="${{ env.E2E_DIR }}/test-results" + mkdir -p "$dest" + docker logs conn-probe > "$dest/probe-container.log" 2>&1 || true + cp /tmp/host-probe.log "$dest/probe-host.log" 2>/dev/null || true + docker rm -f conn-probe >/dev/null 2>&1 || true + # Stop the host loop so it does not keep sampling through the remaining steps. + pkill -f 'Time::HiRes' >/dev/null 2>&1 || true + + summarize() { + local label=$1 file=$2 filter=${3:-} + local samples + samples=$( [ -n "$filter" ] && grep " $filter " "$file" 2>/dev/null || cat "$file" 2>/dev/null ) + [ -n "$samples" ] || { echo "$label: no samples"; return; } + local total fails slowest + total=$(printf '%s\n' "$samples" | wc -l | tr -d ' ') + fails=$(printf '%s\n' "$samples" | grep -c FAIL || true) + slowest=$(printf '%s\n' "$samples" | grep -oE '[0-9]+ms$' | tr -d 'ms' | sort -n | tail -1) + echo "$label: $total samples, $fails failed, slowest ${slowest}ms" + } + summarize "container -> host.docker.internal:8100 " "$dest/probe-container.log" standalone + summarize "container -> master-hostname-7-1:8210 " "$dest/probe-container.log" cluster-hostname + summarize "host -> 127.0.0.1:8100 " "$dest/probe-host.log" + + echo "--- slowest 15 container samples ---" + grep -E 'FAIL|[0-9]{4,}ms' "$dest/probe-container.log" | head -15 || true + + # `docker logs` cannot be used here: the compose service sets + # `logging: driver: none` and RI_STDOUT_LOGGER=false. + - name: Capture RedisInsight container logs + if: failure() + run: | + dest="${{ env.E2E_DIR }}/test-results/container-logs" + mkdir -p "$dest" + + docker inspect e2e-ri-docker-app-1 \ + --format 'status={{.State.Status}} restarts={{.RestartCount}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}} startedAt={{.State.StartedAt}}' \ + | tee "$dest/container-state.txt" || true + + if docker cp e2e-ri-docker-app-1:/data/logs "$dest" 2>"$dest/copy-error.txt"; then + find "$dest" -type f -exec ls -l {} \; + echo "--- last 100 lines ---" + tail -n 100 "$dest"/logs/* 2>/dev/null || true + else + echo "::warning::could not copy /data/logs out of the app container" + cat "$dest/copy-error.txt" || true + fi + + - name: Summarize Playwright results + id: summarize + if: always() + working-directory: ${{ env.E2E_DIR }} + run: | + node scripts/summarize-results.mjs \ + --json test-results/agent-digest.json \ + --markdown >> "$GITHUB_STEP_SUMMARY" + { + echo 'digest<> "$GITHUB_OUTPUT" + + - name: Upload agent digest + if: always() + uses: actions/upload-artifact@v7 + with: + name: e2e-digest-docker + path: ${{ env.E2E_DIR }}/test-results/agent-digest.json + retention-days: 14 + - name: Upload test results if: always() uses: actions/upload-artifact@v7 diff --git a/.github/workflows/tests-e2e-playwright-electron.yml b/.github/workflows/tests-e2e-playwright-electron.yml index 36ea1e823f..c55474dec3 100644 --- a/.github/workflows/tests-e2e-playwright-electron.yml +++ b/.github/workflows/tests-e2e-playwright-electron.yml @@ -29,8 +29,10 @@ jobs: E2E_CLOUD_DATABASE_PORT: ${{ secrets.E2E_CLOUD_DATABASE_PORT }} E2E_CLOUD_DATABASE_NAME: ${{ secrets.E2E_CLOUD_DATABASE_NAME }} E2E_CLOUD_API_SECRET_KEY: ${{ secrets.E2E_CLOUD_API_SECRET_KEY }} - E2E_RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} - RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} + # Not a secret: dependabot[bot] runs cannot read Actions secrets, and this + # only encrypts credentials for this job's throwaway Redis containers. + E2E_RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' + RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' TEST_BIG_DB_DUMP: ${{ secrets.TEST_BIG_DB_DUMP }} # Environment variables needed for Electron/AppImage on Linux (from repository variables) DBUS_SESSION_BUS_ADDRESS: ${{ vars.DBUS_SESSION_BUS_ADDRESS || 'unix:path=/dev/null' }} @@ -39,8 +41,11 @@ jobs: RI_SERVER_TLS_CERT: ${{ secrets.RI_SERVER_TLS_CERT }} RI_SERVER_TLS_KEY: ${{ secrets.RI_SERVER_TLS_KEY }} + outputs: + digest: ${{ steps.summarize.outputs.digest }} + steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Enable SSH Debug if: ${{ inputs.debug }} @@ -114,11 +119,14 @@ jobs: mkdir -p tests/e2e/remote mkdir -p tests/e2e/rdi - - name: Ensure host.docker.internal resolves on the host + - name: Ensure cluster addresses resolve on the host run: | if ! grep -q host.docker.internal /etc/hosts; then echo "127.0.0.1 host.docker.internal" | sudo tee -a /etc/hosts fi + if ! grep -q master-hostname-7-1 /etc/hosts; then + echo "127.0.0.1 master-hostname-7-1 master-hostname-7-2 master-hostname-7-3" | sudo tee -a /etc/hosts + fi - name: Start Redis test environment uses: ./.github/actions/redis-test-env-up @@ -147,11 +155,33 @@ jobs: # Electron uses HTTPS (with TLS certificates) RI_ELECTRON_API_URL: 'https://localhost:5530' RI_SOCKETS_CORS: 'true' - RI_ENCRYPTION_KEY: ${{ secrets.E2E_RI_ENCRYPTION_KEY }} + RI_ENCRYPTION_KEY: 'e2e-tests-encryption-key' RI_ENCRYPTION_KEYTAR: 'false' # Disable TLS certificate validation for self-signed certs (like old tests do) NODE_TLS_REJECT_UNAUTHORIZED: '0' + - name: Summarize Playwright results + id: summarize + if: always() + working-directory: ${{ env.E2E_DIR }} + run: | + node scripts/summarize-results.mjs \ + --json test-results/agent-digest.json \ + --markdown >> "$GITHUB_STEP_SUMMARY" + { + echo 'digest<> "$GITHUB_OUTPUT" + + - name: Upload agent digest + if: always() + uses: actions/upload-artifact@v7 + with: + name: e2e-digest-electron-linux + path: ${{ env.E2E_DIR }}/test-results/agent-digest.json + retention-days: 14 + - name: Upload test results if: always() uses: actions/upload-artifact@v7 diff --git a/.github/workflows/tests-e2e-playwright-lint.yml b/.github/workflows/tests-e2e-playwright-lint.yml index 23bad9b5d9..e07094fa76 100644 --- a/.github/workflows/tests-e2e-playwright-lint.yml +++ b/.github/workflows/tests-e2e-playwright-lint.yml @@ -11,7 +11,7 @@ jobs: name: Lint & Type Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Setup E2E environment uses: ./.github/actions/setup-e2e-playwright diff --git a/.github/workflows/tests-e2e-playwright-v2.yml b/.github/workflows/tests-e2e-playwright-v2.yml index 8f3b7d355a..c5693e8f9e 100644 --- a/.github/workflows/tests-e2e-playwright-v2.yml +++ b/.github/workflows/tests-e2e-playwright-v2.yml @@ -1,7 +1,25 @@ name: E2E Playwright Tests (v2) +# E2E is expensive, so it does not run on every pull request. These are the only +# cases where it runs: +# +# 1. Dependabot opens a dependency PR. Its branch is `dependabot/**`, and the +# push that creates that branch starts this workflow. +# 2. Dependabot rebases a dependency PR. That is another push to the same +# branch, so the run restarts on the new commit. +# 3. Someone adds `e2e-tests` or `run-all-tests` to a PR. +# 4. The nightly schedule, at 00:00 UTC. +# 5. Someone starts it by hand from the Actions tab. +# +# `skip-e2e` on a PR overrides cases 1, 2 and 3. It stops a run already going and +# keeps later ones off. +# +# Opening a PR or pushing to it does not start E2E unless the branch is +# `dependabot/**`. Case 3 is how you ask for it, and removing then re-adding the +# label is how you rerun it. + on: - # Manual trigger + # Case 5. workflow_dispatch: inputs: environment: @@ -15,47 +33,104 @@ on: type: boolean default: false - # Trigger on PR with label (remove and re-add label to rerun) + # Cases 1 and 2. The branch name is the only way to limit this to Dependabot: a + # `pull_request` trigger cannot filter on who opened the PR, so it would start a + # run on every PR in the repo just to work out that it is not wanted. + push: + branches: ['dependabot/**'] + + # Case 3, and `skip-e2e`. pull_request: types: [labeled] - # Nightly schedule (0 AM UTC) + # Case 4. schedule: - cron: '0 0 * * *' -# Cancel in-progress runs for the same PR/branch concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + # One run per branch at a time. A new push replaces the one already going, + # which is what case 2 needs. + # + # The key is the branch rather than the PR so that a push (cases 1 and 2) and a + # label (case 3) on the same PR land in the same group. That is what lets + # `skip-e2e` stop a run a push started. + # + # The `-noop-` on the end puts labels this workflow ignores in a group + # of their own, where they cancel nothing. Without it every label added to a PR + # would kill the run: the group is worked out before any job `if` is read, so + # skipping the jobs is too late. Dependabot adds `dependencies` and `javascript` + # twice each within two seconds, so this matters on every dependency PR. + group: >- + ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref_name }}${{ + github.event.action == 'labeled' && + !contains(fromJSON('["e2e-tests","run-all-tests","skip-e2e"]'), github.event.label.name) + && format('-noop-{0}', github.run_id) || '' }} cancel-in-progress: true jobs: - # Check if workflow should run (for PR label trigger) + # Works out which case this event is, and whether it runs anything. check-trigger: runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read outputs: should_run: ${{ steps.check.outputs.should_run }} steps: + # A push event carries no PR, so the labels have to be fetched to honour + # `skip-e2e` in cases 1 and 2. + - name: Read labels for the pushed branch + id: pushed-pr + if: github.event_name == 'push' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + BRANCH: ${{ github.ref_name }} + run: | + labels=$(gh pr list --head "$BRANCH" --state open --json labels \ + --jq '[.[0].labels[].name] | join(",")' || true) + echo "labels=$labels" >> "$GITHUB_OUTPUT" + - name: Check trigger conditions id: check env: EVENT_NAME: ${{ github.event_name }} - HAS_E2E_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'e2e-tests') }} - HAS_RUN_ALL_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'run-all-tests') }} - HAS_DEPENDENCIES_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'dependencies') }} + ACTION: ${{ github.event.action }} + LABEL_ADDED: ${{ github.event.label.name }} + PUSHED_PR_LABELS: ${{ steps.pushed-pr.outputs.labels }} + HAS_SKIP_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'skip-e2e') }} run: | - if [[ "$EVENT_NAME" == "workflow_dispatch" ]]; then - echo "should_run=true" >> $GITHUB_OUTPUT - elif [[ "$EVENT_NAME" == "schedule" ]]; then - echo "should_run=true" >> $GITHUB_OUTPUT - elif [[ "$EVENT_NAME" == "pull_request" ]]; then - if [[ "$HAS_E2E_LABEL" == "true" || "$HAS_RUN_ALL_LABEL" == "true" || "$HAS_DEPENDENCIES_LABEL" == "true" ]]; then - echo "should_run=true" >> $GITHUB_OUTPUT - else - echo "should_run=false" >> $GITHUB_OUTPUT - fi - else - echo "should_run=false" >> $GITHUB_OUTPUT - fi + # Case 3. The same list appears in the concurrency group above, next to + # `skip-e2e`. Changing one without the other breaks quietly. + OPT_IN_LABELS='e2e-tests run-all-tests' + + should_run=false + case "$EVENT_NAME" in + workflow_dispatch | schedule) + # Cases 4 and 5, always. + should_run=true + ;; + push) + # Cases 1 and 2. The branch filter has already narrowed this to + # dependency branches, so `skip-e2e` is the only thing left to check. + if [[ ",$PUSHED_PR_LABELS," != *",skip-e2e,"* ]]; then + should_run=true + fi + ;; + pull_request) + if [[ "$HAS_SKIP_LABEL" == "true" ]]; then + # `skip-e2e` wins, even when an opt-in label arrives after it. + should_run=false + elif [[ "$ACTION" == "labeled" ]]; then + # Case 3. Every other label reaches this point too, in its own + # concurrency group, and leaves should_run false. + for label in $OPT_IN_LABELS; do + [[ "$LABEL_ADDED" == "$label" ]] && should_run=true + done + fi + ;; + esac + echo "should_run=$should_run" >> "$GITHUB_OUTPUT" # Lint and type-check E2E code lint: @@ -138,7 +213,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Post to Slack - uses: slackapi/slack-github-action@v3.0.3 + uses: slackapi/slack-github-action@v4.0.0 with: method: chat.postMessage token: ${{ secrets.SLACK_TEST_REPORT_KEY }} @@ -168,4 +243,3 @@ jobs: - title: "Electron (Linux)" value: "${{ needs.e2e-electron.result }}" short: true - diff --git a/.github/workflows/tests-frontend.yml b/.github/workflows/tests-frontend.yml index ff8c136c7a..a138fa847c 100644 --- a/.github/workflows/tests-frontend.yml +++ b/.github/workflows/tests-frontend.yml @@ -3,8 +3,6 @@ on: workflow_call: env: - SLACK_AUDIT_REPORT_CHANNEL: ${{ secrets.SLACK_AUDIT_REPORT_CHANNEL }} - SLACK_AUDIT_REPORT_KEY: ${{ secrets.SLACK_AUDIT_REPORT_KEY }} REPORT_NAME: 'report-fe' jobs: @@ -12,32 +10,16 @@ jobs: runs-on: ubuntu-latest name: Frontend tests steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Install all libs and dependencies uses: ./.github/actions/install-all-build-libs with: skip-system-deps: '1' - - name: UI PROD dependencies audit - run: | - FILENAME=ui.prod.deps.audit.json - - yarn audit --groups dependencies --json > $FILENAME || true && - FILENAME=$FILENAME DEPS="UI prod" node .github/deps-audit-report.js && - curl -H "Content-type: application/json" --data @slack.$FILENAME -H "Authorization: Bearer $SLACK_AUDIT_REPORT_KEY" -X POST https://slack.com/api/chat.postMessage - - - name: UI DEV dependencies audit - run: | - FILENAME=ui.dev.deps.audit.json - - yarn audit --groups devDependencies --json > $FILENAME || true && - FILENAME=$FILENAME DEPS="UI dev" node .github/deps-audit-report.js && - curl -H "Content-type: application/json" --data @slack.$FILENAME -H "Authorization: Bearer $SLACK_AUDIT_REPORT_KEY" -X POST https://slack.com/api/chat.postMessage - - name: Unit tests UI timeout-minutes: 30 - run: yarn test:cov --ci --silent + run: npm run test:cov -- --ci --silent - name: Upload Test Report uses: actions/upload-artifact@v7 diff --git a/.github/workflows/tests-integration.yml b/.github/workflows/tests-integration.yml index d7906ad4f4..2b86cf2566 100644 --- a/.github/workflows/tests-integration.yml +++ b/.github/workflows/tests-integration.yml @@ -45,8 +45,6 @@ on: type: boolean default: false env: - SLACK_AUDIT_REPORT_KEY: ${{ secrets.SLACK_AUDIT_REPORT_KEY }} - SLACK_AUDIT_REPORT_CHANNEL: ${{ secrets.SLACK_AUDIT_REPORT_CHANNEL }} TEST_MEDIUM_DB_DUMP: ${{ secrets.TEST_MEDIUM_DB_DUMP }} TEST_BIG_DB_DUMP: ${{ secrets.TEST_BIG_DB_DUMP }} REPORT_NAME: 'report-it' @@ -117,7 +115,7 @@ jobs: matrix: rte: ${{ fromJson(needs.set-matrix.outputs.matrix) }} steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 # SSH Debug - name: Enable SSH @@ -259,7 +257,7 @@ jobs: actions: write contents: read steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Merge coverage artifacts id: merge-artifacts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3f29a4e819..f786968807 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,13 +1,23 @@ name: ✅ Tests +# Runs on every pull request. Which suites run is decided per PR from the changed +# files plus these labels: `run-all-tests`, `run-frontend-tests`, +# `run-backend-tests`, `run-integration-tests`. +# +# Three cases: +# +# 1. A PR is opened, or a commit is pushed to it. Any run already going is +# replaced. +# 2. One of the four labels above is added, to widen what the PR runs. +# 3. Any other label is added. Nothing runs. This case exists only so that +# labels aimed elsewhere, such as `e2e-tests` or Dependabot's own +# `dependencies` and `javascript`, cannot disturb case 1. See the +# concurrency note below. + on: - push: - branches-ignore: - - main - - latest - - 'release/**' + # Cases 1, 2 and 3. pull_request: - types: [labeled] + types: [opened, synchronize, reopened, labeled] workflow_dispatch: inputs: @@ -44,21 +54,36 @@ on: default: false type: boolean -# Cancel a previous run workflow. -# Key by head identity (not github.ref) so the push-triggered run and the -# pull_request-triggered run for the same branch share one concurrency group -# and cancel each other, instead of running the full suite twice in parallel. -# - push: head_ref is empty -> falls back to ref_name (branch name) -# - pull_request: head_ref is the source branch name -# Qualify by the head repo so fork PRs that happen to share a branch name -# (e.g. "main") don't collide and cancel each other's runs; for same-repo -# events this resolves to github.repository, preserving the push<->PR merge. concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }} + # One run per PR at a time. A new commit replaces the one already going, which + # is case 1. + # + # The `-noop-` on the end puts case 3 in a group of its own, where it + # cancels nothing. Without it, any label added to a PR would kill the run and + # start the whole suite again: the group is worked out before any job `if` is + # read, so skipping the jobs is too late. Dependabot adds `dependencies` and + # `javascript` twice each within two seconds of opening a PR, so without this + # every dependency PR loses the run that opening it started. + # + # The label list is repeated on the `changes` and `lint` jobs below. Changing + # one without the others breaks quietly. + group: >- + ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}${{ + github.event.action == 'labeled' && + !contains(fromJSON('["run-all-tests","run-frontend-tests","run-backend-tests","run-integration-tests"]'), github.event.label.name) + && format('-noop-{0}', github.run_id) || '' }} cancel-in-progress: true jobs: + # Skipped in case 3, which is what makes that run do nothing. Every job after + # this one skips with it, through `needs`. changes: + if: >- + github.event.action != 'labeled' || + contains(fromJSON('["run-all-tests","run-frontend-tests","run-backend-tests","run-integration-tests"]'), github.event.label.name) + permissions: + contents: read + pull-requests: read runs-on: ubuntu-latest outputs: frontend: ${{ steps.filter.outputs.frontend }} @@ -67,8 +92,8 @@ jobs: docker: ${{ steps.filter.outputs.docker }} infra: ${{ steps.filter.outputs.infra }} steps: - - uses: actions/checkout@v7.0.0 - - uses: dorny/paths-filter@v4.0.1 + - uses: actions/checkout@v7.0.1 + - uses: dorny/paths-filter@v4.0.3 id: filter with: # Compare against main so each push's gating reflects the @@ -89,8 +114,8 @@ jobs: # Shared toolchain / CI config — when these change, run everything. infra: - 'package.json' - - 'yarn.lock' - - '.yarnrc' + - 'package-lock.json' + - '.npmrc' - '.nvmrc' - '.eslintrc*' - '.eslintignore' @@ -113,9 +138,15 @@ jobs: desktop: ${{ steps.eval.outputs.desktop }} integration: ${{ steps.eval.outputs.integration }} docker: ${{ steps.eval.outputs.docker }} + short_rte: ${{ steps.eval.outputs.short_rte }} steps: - id: eval env: + IS_FORK: ${{ github.event.pull_request.head.repo.fork == true }} + # Release-branch PRs (head or target release/** or latest) get the + # full suite + full RTE list. + IS_RELEASE: ${{ startsWith(github.head_ref, 'release/') || github.head_ref == 'latest' || startsWith(github.base_ref, 'release/') || github.base_ref == 'latest' }} + INPUT_SHORT_RTE: ${{ inputs.short_rte_list }} PRE_RELEASE: ${{ inputs.pre_release == true }} DISPATCH: ${{ github.event_name == 'workflow_dispatch' }} LABEL_ALL: ${{ contains(github.event.pull_request.labels.*.name, 'run-all-tests') }} @@ -128,14 +159,21 @@ jobs: CHG_DOCKER: ${{ needs.changes.outputs.docker }} CHG_INFRA: ${{ needs.changes.outputs.infra }} run: | - # "Run everything" — pre-release builds, manual dispatch, the - # run-all-tests label, or shared toolchain/CI changes. - if [[ "$PRE_RELEASE" == "true" || "$DISPATCH" == "true" || "$LABEL_ALL" == "true" || "$CHG_INFRA" == "true" ]]; then + # "Run everything" — pre-release builds, release-branch PRs, manual + # dispatch, the run-all-tests label, or shared toolchain/CI changes. + if [[ "$PRE_RELEASE" == "true" || "$IS_RELEASE" == "true" || "$DISPATCH" == "true" || "$LABEL_ALL" == "true" || "$CHG_INFRA" == "true" ]]; then ALL=true else ALL=false fi + # Full RTE list for release testing; short list otherwise, unless a + # caller overrides it. + short_rte=true + if [[ "$PRE_RELEASE" == "true" || "$IS_RELEASE" == "true" || "$INPUT_SHORT_RTE" == "false" ]]; then + short_rte=false + fi + ui=$ALL api=$ALL desktop=$ALL @@ -148,15 +186,28 @@ jobs: [[ "$CHG_BACKEND" == "true" || "$LABEL_IT" == "true" ]] && integration=true [[ "$CHG_FRONTEND" == "true" || "$CHG_BACKEND" == "true" || "$CHG_DOCKER" == "true" ]] && docker=true + # Forks run in isolation with no secrets, so the secret/infra suites + # can't run there. Keep lint/type-check/unit on; force the rest off. + if [[ "$IS_FORK" == "true" ]]; then + integration=false + docker=false + fi + { echo "ui=$ui" echo "api=$api" echo "desktop=$desktop" echo "integration=$integration" echo "docker=$docker" + echo "short_rte=$short_rte" } >> "$GITHUB_OUTPUT" lint: + # No `needs`, so it cannot inherit the skip from `changes` and repeats the + # same condition to stay out of case 3. + if: >- + github.event.action != 'labeled' || + contains(fromJSON('["run-all-tests","run-frontend-tests","run-backend-tests","run-integration-tests"]'), github.event.label.name) uses: ./.github/workflows/lint.yml secrets: inherit @@ -182,7 +233,7 @@ jobs: frontend-tests-coverage: needs: frontend-tests - if: ${{ github.actor != 'dependabot[bot]' }} + if: ${{ github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork != true }} uses: ./.github/workflows/code-coverage.yml secrets: inherit with: @@ -197,7 +248,7 @@ jobs: backend-tests-coverage: needs: backend-tests - if: ${{ github.actor != 'dependabot[bot]' }} + if: ${{ github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork != true }} uses: ./.github/workflows/code-coverage.yml secrets: inherit with: @@ -214,7 +265,7 @@ jobs: contents: read checks: write with: - short_rte_list: ${{ inputs.short_rte_list || true }} + short_rte_list: ${{ needs.should-run.outputs.short_rte == 'true' }} redis_client: ${{ inputs.redis_client || '' }} debug: ${{ inputs.debug || false }} @@ -229,30 +280,23 @@ jobs: clean: uses: ./.github/workflows/clean-deployments.yml - if: ${{ always() && github.actor != 'dependabot[bot]' }} + # `always()` runs this even when every test job skips, so it needs its own + # guard to stay out of case 3 and not delete deployments for a run that does + # no work. + if: ${{ always() && needs.changes.result != 'skipped' && github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork != true }} permissions: actions: write contents: read deployments: write - needs: - [ - frontend-tests, - backend-tests, - integration-tests, - ] + needs: [changes, frontend-tests, backend-tests, integration-tests] # Remove artifacts from github actions remove-artifacts: name: Remove artifacts if: ${{ github.actor != 'dependabot[bot]' }} - needs: - [ - frontend-tests, - backend-tests, - integration-tests, - ] + needs: [frontend-tests, backend-tests, integration-tests] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Remove all artifacts uses: ./.github/actions/remove-artifacts diff --git a/.github/workflows/type-check.yml b/.github/workflows/type-check.yml index 8861064bfd..0957c9ed51 100644 --- a/.github/workflows/type-check.yml +++ b/.github/workflows/type-check.yml @@ -22,15 +22,15 @@ jobs: runs-on: ubuntu-latest name: tsc baselines steps: - - uses: actions/checkout@v7.0.0 + - uses: actions/checkout@v7.0.1 - name: Install dependencies uses: ./.github/actions/install-all-build-libs with: skip-system-deps: '1' - # yarn 1.x without workspaces does not share root binaries with sub-dirs. - # Workspace-level scripts (yarn --cwd redisinsight/ ...) pipe through + # npm run --prefix exposes only the sub-dir's node_modules/.bin, not root's. + # Workspace-level scripts (npm run ... --prefix redisinsight/) pipe through # tsc / tsc-output-parser / tsx, which only live in the root node_modules. # Putting root's .bin on PATH lets nested invocations find them. - name: Expose root node_modules/.bin @@ -46,30 +46,35 @@ jobs: path: | redisinsight/ui/src/packages/node_modules redisinsight/ui/src/packages/*/node_modules - key: ui-plugins-node-modules-${{ runner.os }}-${{ hashFiles('redisinsight/ui/src/packages/**/yarn.lock') }} + key: ui-plugins-node-modules-${{ runner.os }}-${{ hashFiles('redisinsight/ui/src/packages/**/package-lock.json') }} - name: Install UI plugin deps and build statics if: ${{ inputs.run-ui != false }} - run: yarn build:statics + run: npm run build:statics - name: UI if: ${{ inputs.run-ui != false }} - run: yarn --cwd redisinsight/ui type-check + # The i18next.d.ts key-type union (built from en.json) grows with the + # locale files and pushes tsc past the runner's default heap. Raise it + # so the UI type-check doesn't OOM. + env: + NODE_OPTIONS: --max-old-space-size=8192 + run: npm run type-check --prefix redisinsight/ui - name: API if: ${{ inputs.run-api != false }} - run: yarn --cwd redisinsight/api type-check + run: npm run type-check --prefix redisinsight/api # Desktop sources import from redisinsight/api/dist/src/**, so the api # has to be built first or those imports show up as TS2307/TS2749 errors. # Use the default nest build (not build:prod) so `.d.ts` files are emitted. - name: Build API (for desktop type-check) if: ${{ inputs.run-desktop != false }} - run: yarn --cwd redisinsight/api build + run: npm run build --prefix redisinsight/api - name: Desktop if: ${{ inputs.run-desktop != false }} - run: yarn --cwd redisinsight/desktop type-check + run: npm run type-check --prefix redisinsight/desktop - name: Configs - run: yarn tsc --project configs/tsconfig.json --noEmit + run: npx tsc --project configs/tsconfig.json --noEmit diff --git a/.github/workflows/virustotal.yml b/.github/workflows/virustotal.yml index 3a2b295a7d..c48898788f 100644 --- a/.github/workflows/virustotal.yml +++ b/.github/workflows/virustotal.yml @@ -23,7 +23,7 @@ jobs: artifact_exists: ${{ steps.list_artifacts.outputs.artifact_exists }} steps: - name: Checkout Repository - uses: actions/checkout@v7.0.0 + uses: actions/checkout@v7.0.1 - name: Download All Artifacts uses: actions/download-artifact@v8 diff --git a/.gitignore b/.gitignore index 79a9b2d196..f5ad63546d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,6 @@ node_modules logs *.log npm-debug.log* -yarn-debug.log* -yarn-error.log* lerna-debug.log* # OS @@ -56,7 +54,7 @@ redisinsight/api/dist-minified redisinsight/api/tutorials redisinsight/api/content -# Generated OpenAPI artifacts (regenerated on install via `yarn generate:api-client`). +# Generated OpenAPI artifacts (regenerated on install via `npm run generate:api-client`). # Both the spec dump and the TS client are derived from BE source — they are not committed. redisinsight/api/openapi.json redisinsight/api-client @@ -91,7 +89,6 @@ redisinsight/ui/src/packages/common/index* static/ .env* -.npmrc # AI rules .windsurfrules diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..4bf73ae841 --- /dev/null +++ b/.npmrc @@ -0,0 +1,9 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) +# that conflict with React 18. This is a known issue being resolved as the +# project migrates away from @elastic/eui to @redis-ui/components. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/.vscode/launch.json b/.vscode/launch.json index abf7f2c859..ab83a34817 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,8 +5,8 @@ "type": "node", "request": "launch", "name": "Debug API (Nest Framework)", - "runtimeExecutable": "yarn", - "runtimeArgs": ["dev:api", "--debug", "--inspect-brk"], + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev:api", "--", "--debug", "--inspect-brk"], "autoAttachChildProcesses": true, "restart": true, "sourceMaps": true, diff --git a/.yarnrc b/.yarnrc deleted file mode 100644 index a156e63075..0000000000 --- a/.yarnrc +++ /dev/null @@ -1,4 +0,0 @@ -# This will set the --ignore-scripts flag whenever running yarn add -#--ignore-scripts true -#--install.ignore-scripts true ---add.ignore-scripts true diff --git a/AGENTS.md b/AGENTS.md index 68ddd61ca6..0dcc727a39 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,16 +27,16 @@ redisinsight/ ```bash # Frontend development (web) -yarn dev:ui +npm run dev:ui # Backend development -yarn dev:api +npm run dev:api # Desktop app development (runs all: API + UI + Electron) -yarn dev:desktop +npm run dev:desktop # Frontend with coverage -yarn dev:ui:coverage +npm run dev:ui:coverage ``` ## Testing Instructions @@ -45,13 +45,13 @@ yarn dev:ui:coverage ```bash # Frontend tests -yarn test # Run all UI tests +npm test # Run all UI tests # Backend tests -yarn test:api # Run all API tests +npm run test:api # Run all API tests # E2E tests -yarn --cwd tests/e2e-playwright test +npm test --prefix tests/e2e-playwright ``` ### Run Specific Frontend Tests @@ -73,22 +73,22 @@ node 'node_modules/.bin/jest' 'redisinsight/ui/src/slices/tests/browser/keys.spe ```bash # Lint check -yarn lint # All code -yarn lint:ui # Frontend only -yarn lint:api # Backend only +npm run lint # All code +npm run lint:ui # Frontend only +npm run lint:api # Backend only # Type checking (compares against .tscheck.rec.json baselines for ui/api/desktop + configs) -yarn type-check +npm run type-check # Refresh baselines after intentionally adding or fixing TS errors (do not run casually) -yarn tscheck +npm run tscheck # Tests -yarn test # Frontend tests -yarn test:api # Backend tests +npm test # Frontend tests +npm run test:api # Backend tests ``` -`yarn type-check` is the gate — CI fails if any (file × error-code) TS-error count increases. If you intentionally changed TS-error counts, run `yarn tscheck` to refresh the baselines and commit the updated `.tscheck.rec.json` files. See `.ai/skills/type-check-baselines/SKILL.md` for details (including the `yarn tscheck:force` escape hatch). +`npm run type-check` is the gate — CI fails if any (file × error-code) TS-error count increases. If you intentionally changed TS-error counts, run `npm run tscheck` to refresh the baselines and commit the updated `.tscheck.rec.json` files. See `.ai/skills/type-check-baselines/SKILL.md` for details (including the `npm run tscheck:force` escape hatch). **Fix any linting errors, type errors, or test failures before committing.** @@ -98,7 +98,7 @@ These apply to every change in the repo. Skill files contain the full detail; th ### Code quality (always) -- Run `yarn lint` and `yarn type-check` before committing — both must pass. +- Run `npm run lint` and `npm run type-check` before committing — both must pass. - TypeScript everywhere. Avoid `any`; use `unknown` if you must. - Naming: `PascalCase` components, `camelCase` functions/variables, `UPPER_SNAKE_CASE` constants, `is/has/should` prefix for booleans. - No `console.log` in production code (use `console.warn`/`error`). @@ -113,10 +113,10 @@ These apply to every change in the repo. Skill files contain the full detail; th ### Dependency / lockfile management (always) -- The root `postinstall` runs `yarn-deduplicate yarn.lock`, so `yarn install` rewrites the lockfile whenever it isn't dedup-clean. After modifying any `package.json` (root, `redisinsight/`, or `redisinsight/api/`), run `yarn install` from that directory and commit the resulting lockfile changes. -- Never edit `yarn.lock` files by hand and never run `yarn install --ignore-scripts` (or otherwise skip `postinstall`) when preparing a commit — the lockfile shipped to CI must match what `yarn install` produces locally. -- CI runs `yarn install --frozen-lockfile` and then fails if `yarn.lock` is modified by the install. A green local install in every changed package's directory is required before pushing. -- Use the right package manager for the change: `yarn add` / `yarn remove` (or `yarn upgrade`) for dependency changes, never manual edits to `package.json` versions without re-running install. +- After modifying any `package.json` (root, `redisinsight/`, `redisinsight/api/`, or a `redisinsight/ui/src/packages/*` plugin), run `npm install` from that directory and commit the resulting `package-lock.json` changes. +- Never edit `package-lock.json` files by hand and never run `npm install --ignore-scripts` (or otherwise skip `postinstall`) when preparing a commit — the `postinstall` applies `patch-package` patches, and the lockfile shipped to CI must match what `npm install` produces locally. +- CI runs `npm ci`, which installs strictly from `package-lock.json` and fails if it is out of sync with `package.json`. A green local install in every changed package's directory is required before pushing. +- Use the right package manager for the change: `npm install ` / `npm uninstall ` (or `npm update`) for dependency changes, never manual edits to `package.json` versions without re-running install. ## Skills @@ -145,7 +145,7 @@ All detailed development standards are exposed as skills under `.ai/skills/`. Cl - Ensure the current branch name follows `.ai/skills/branches/SKILL.md` before opening a PR; rename it if it doesn't - Write to `src/` and `tests/` directories -- Run `yarn lint` and `yarn test` before commits +- Run `npm run lint` and `npm test` before commits - Follow naming conventions (camelCase, PascalCase, UPPER_SNAKE_CASE) - Use faker library for test data generation - Use `renderComponent` helper in component tests @@ -168,7 +168,7 @@ All detailed development standards are exposed as skills under `.ai/skills/`. Cl - Commit secrets or API keys - Edit `node_modules/` or `vendor/` directories -- Edit `yarn.lock` by hand or commit a lockfile produced with `--ignore-scripts` / a skipped `postinstall` +- Edit `package-lock.json` by hand or commit a lockfile produced with `--ignore-scripts` / a skipped `postinstall` - Use fixed time waits in tests (use `waitFor` instead) - Use `!important` in styled-components - Import directly from `@redis-ui/*` (use internal wrappers from `uiSrc/components/ui`) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ddbf078475..199c52f023 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,7 +45,7 @@ TypeScript config is split across the repo rather than centralised in a single r ESLint's root config uses `parserOptions.project: true`, so each linted file picks up its nearest tsconfig automatically. When you add a new top-level TS area, drop a tsconfig in it. -There is intentionally no root `tsconfig.json`. Running bare `tsc` from the repo root will fail — use `yarn type-check:ui` or pass `--project ` explicitly. +There is intentionally no root `tsconfig.json`. Running bare `tsc` from the repo root will fail — use `npm run type-check:ui` or pass `--project ` explicitly. ### Type-error baselines @@ -53,9 +53,9 @@ Per-project type-check runs in CI and fails if any new TS error is introduced. F Common flows: -- **Check locally** (all projects): `yarn type-check`. -- **Check one project**: `yarn --cwd redisinsight/{ui,api,desktop} type-check`. -- **You fixed errors**: CI will say "baseline is outdated". Run `yarn --cwd redisinsight/{ui,api,desktop} tscheck` locally to refresh the matching `.tscheck.rec.json` and commit it. +- **Check locally** (all projects): `npm run type-check`. +- **Check one project**: `npm run type-check --prefix redisinsight/{ui,api,desktop}`. +- **You fixed errors**: CI will say "baseline is outdated". Run `npm run tscheck --prefix redisinsight/{ui,api,desktop}` locally to refresh the matching `.tscheck.rec.json` and commit it. - **You introduced new errors**: fix them. Do not use `tscheck:force` in any workspace to overwrite the baseline upward — error counts must only decrease. Reviewers should reject PRs that bump baselines without a corresponding fix. ## Pull Requests diff --git a/Dockerfile b/Dockerfile index 39b658c429..b7a6577f9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,29 +21,33 @@ RUN apk update && apk add --no-cache --virtual .gyp \ WORKDIR /usr/src/app # restore node_modules for front-end -COPY package.json yarn.lock ./ +# .npmrc carries legacy-peer-deps=true, required for `npm ci` to resolve +# the project's legacy peer dependencies. +COPY package.json package-lock.json .npmrc ./ COPY patches ./patches COPY redisinsight/ui/vite.config.mjs ./redisinsight/ui/ COPY redisinsight/ui/src/config ./redisinsight/ui/src/config -RUN SKIP_POSTINSTALL=1 yarn install +# --ignore-scripts skips the postinstall's `vite optimize` (the UI is built +# later via build:ui); patch-package is still needed for the UI deps, so run it. +RUN npm ci --ignore-scripts && npx patch-package # prepare backend by copying scripts/configs and installing node modules # this is required to build the static assets COPY configs ./configs COPY scripts ./scripts COPY redisinsight ./redisinsight -RUN yarn --cwd redisinsight/api install +RUN npm ci --prefix redisinsight/api # build the frontend, static assets, and backend api -RUN yarn build:ui -RUN yarn build:statics -RUN yarn build:api - -# install backend _again_ to build native modules and remove dev dependencies, -# then run autoclean to remove additional unnecessary files -RUN yarn --cwd ./redisinsight/api install --production -COPY ./redisinsight/api/.yarnclean.prod ./redisinsight/api/.yarnclean -RUN yarn --cwd ./redisinsight/api autoclean --force +RUN npm run build:ui +RUN npm run build:statics +RUN npm run build:api + +# install backend _again_ to build native modules and drop dev dependencies. +# NOTE: `yarn autoclean` (pruning docs/tests from node_modules) has no npm +# equivalent and was dropped in the yarn->npm migration; the image is slightly +# larger as a result. Revisit with node-prune if image size regresses. +RUN npm ci --prefix redisinsight/api --omit=dev FROM node:24.16.0-alpine diff --git a/README.md b/README.md index 388e0fc48d..16f9be67b3 100644 --- a/README.md +++ b/README.md @@ -22,20 +22,23 @@ Redis Insight is an intuitive and efficient GUI for Redis, allowing you to inter ### Redis Insight Highlights: -- Browse, filter, visualise your key-value Redis data structures and see key values in different formats (including JSON, Hex, ASCII, etc.) -- CRUD support for lists, hashes, strings, sets, sorted sets, and streams -- CRUD support for [JSON](https://redis.io/json/) data structure -- Interactive tutorials to learn easily, among other things, how to leverage the native JSON data structure supporting structured querying and full-text search, including vector similarity search for your AI use cases -- Contextualised recommendations to optimize performance and memory usage. The list of recommendations gets updated as you interact with your database -- Profiler - analyze every command sent to Redis in real-time -- SlowLog - analyze slow operations in Redis instances based on the [Slowlog](https://github.com/RedisInsight/RedisInsight/releases#:~:text=results%20of%20the-,Slowlog,-command%20to%20analyze) command -- Pub/Sub - support for [Redis pub/sub](https://redis.io/docs/latest/develop/interact/pubsub/), enabling subscription to channels and posting messages to channels -- Bulk actions - Delete the keys in bulk based on the filters set in Browser or Tree view -- Workbench - advanced command line interface with intelligent command auto-complete, complex data visualizations and support for the raw mode -- Command auto-complete support for [search and query](https://redis.io/search/) capability, [JSON](https://redis.io/json/) and [time series](https://redis.io/timeseries/) data structures -- Visualizations of your [search and query](https://redis.io/search/) indexes and results. -- Ability to build [your own data visualization plugins](https://github.com/RedisInsight/Packages) -- Officially supported for Redis OSS, [Redis Cloud](https://redis.io/cloud/). Works with Microsoft Azure Managed Redis (formerly Azure Cache for Redis) +* Browse, filter, visualise your key-value Redis data structures and see key values in different formats (including JSON, Hex, ASCII, etc.) +* CRUD support for lists, hashes, strings, sets, sorted sets, and streams +* CRUD support for [JSON](https://redis.io/json/) data structure +* CRUD support for vector sets - create and manage vector sets, add elements, and run vector similarity search +* CRUD support for arrays - create, browse, search, aggregate, edit, and delete array elements +* Interactive tutorials to learn easily, among other things, how to leverage the native JSON data structure supporting structured querying and full-text search, including vector similarity search for your AI use cases +* Contextualised recommendations to optimize performance and memory usage. The list of recommendations gets updated as you interact with your database +* Profiler - analyze every command sent to Redis in real-time +* SlowLog - analyze slow operations in Redis instances based on the [Slowlog](https://github.com/RedisInsight/RedisInsight/releases#:~:text=results%20of%20the-,Slowlog,-command%20to%20analyze) command +* Pub/Sub - support for [Redis pub/sub](https://redis.io/docs/latest/develop/interact/pubsub/), enabling subscription to channels and posting messages to channels +* Bulk actions - Delete the keys in bulk based on the filters set in Browser or Tree view +* Workbench - advanced command line interface with intelligent command auto-complete, complex data visualizations and support for the raw mode +* Command auto-complete support for [search and query](https://redis.io/search/) capability, [JSON](https://redis.io/json/) and [time series](https://redis.io/timeseries/) data structures +* Visualizations of your [search and query](https://redis.io/search/) indexes and results. +* Vector search - create and manage search indexes and query your indexed data +* Ability to build [your own data visualization plugins](https://github.com/RedisInsight/Packages) +* Officially supported for Redis OSS, [Redis Cloud](https://redis.io/cloud/). Works with Microsoft Azure Managed Redis (formerly Azure Cache for Redis) Check out the [release notes](https://github.com/RedisInsight/RedisInsight/releases). @@ -54,13 +57,13 @@ Additionally, you can use [Redis for VS Code](https://github.com/RedisInsight/Re Alternatively you can also build from source. See our wiki for instructions. -- [How to build](https://github.com/RedisInsight/RedisInsight/wiki/How-to-build-and-contribute) +* [How to build](https://github.com/RedisInsight/RedisInsight/wiki/How-to-build-and-contribute) ## How to debug If you have any issues occurring in Redis Insight, you can follow the steps below to get more information about the errors and find their root cause. -- [How to debug](https://github.com/RedisInsight/RedisInsight/wiki/How-to-debug) +* [How to debug](https://github.com/RedisInsight/RedisInsight/wiki/How-to-debug) ## Redis Insight API (only for Docker) @@ -70,26 +73,26 @@ If you are running Redis Insight from [Docker](https://hub.docker.com/r/redis/re Redis Insight supports Azure Managed Redis and Azure Cache for Redis with Microsoft Entra ID authentication. If your organization requires admin consent for third-party applications, see our setup guide. -- [Azure Setup Guide](docs/azure-setup.md) -- [Azure Docker Setup](docs/azure-docker-setup.md) - Configuration for Docker, custom ports, and reverse proxies +* [Azure Setup Guide](docs/azure-setup.md) +* [Azure Docker Setup](docs/azure-docker-setup.md) - Configuration for Docker, custom ports, and reverse proxies ## Feedback -- Request a new [feature](https://github.com/RedisInsight/RedisInsight/issues/new?assignees=&labels=&template=feature_request.md&title=%5BFeature+Request%5D%3A) -- Upvote [popular feature requests](https://github.com/RedisInsight/RedisInsight/issues?q=is%3Aopen+is%3Aissue+label%3Afeature+sort%3Areactions-%2B1-desc) -- File a [bug](https://github.com/RedisInsight/RedisInsight/issues/new?assignees=&labels=&template=bug_report.md&title=%5BBug%5D%3A) +* Request a new [feature](https://github.com/RedisInsight/RedisInsight/issues/new?assignees=\&labels=\&template=feature_request.md\&title=%5BFeature+Request%5D%3A) +* Upvote [popular feature requests](https://github.com/RedisInsight/RedisInsight/issues?q=is%3Aopen+is%3Aissue+label%3Afeature+sort%3Areactions-%2B1-desc) +* File a [bug](https://github.com/RedisInsight/RedisInsight/issues/new?assignees=\&labels=\&template=bug_report.md\&title=%5BBug%5D%3A) ## Redis Insight Plugins With Redis Insight you can now also extend the core functionality by building your own data visualizations. See our wiki for more information. -- [Plugin Documentation](https://github.com/RedisInsight/RedisInsight/wiki/Plugin-Documentation) +* [Plugin Documentation](https://github.com/RedisInsight/RedisInsight/wiki/Plugin-Documentation) ## Contributing If you would like to contribute to the code base or fix and issue, please consult the wiki. -- [How to build and contribute](https://github.com/RedisInsight/RedisInsight/wiki/How-to-build-and-contribute) +* [How to build and contribute](https://github.com/RedisInsight/RedisInsight/wiki/How-to-build-and-contribute) ## API documentation diff --git a/configs/tsconfig.json b/configs/tsconfig.json index 88f569508d..d83e206656 100644 --- a/configs/tsconfig.json +++ b/configs/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "target": "ES2020", - "module": "CommonJS", - "moduleResolution": "node", + "module": "nodenext", + "moduleResolution": "nodenext", "esModuleInterop": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, diff --git a/docs/azure-setup.md b/docs/azure-setup.md index 68723bb388..75cfc68abc 100644 --- a/docs/azure-setup.md +++ b/docs/azure-setup.md @@ -4,6 +4,8 @@ To use the Azure integration, your Azure tenant administrator may need to grant admin consent for the RedisInsight application. This is a one-time setup per Azure tenant — once done, all users in your organization can use RedisInsight with Entra ID seamlessly. +> **Which tenant?** The commands below must be run **in the home tenant of every user who signs in through RedisInsight** — this is not necessarily the tenant that owns the Azure Managed Redis resources. If your users belong to a different tenant than the one hosting the resources, see [Multi-tenant scenarios](#multi-tenant-scenarios). + > **Why is this needed?** See [Why This Setup is Required](#why-this-setup-is-required) for details on the authentication flow. > **Running in Docker?** See [Azure Docker Setup](azure-docker-setup.md) for configuration when using custom ports or reverse proxies. @@ -54,6 +56,37 @@ az ad app permission list-grants \ You should see `AzureRedisCacheAadApp` and `Windows Azure Service Management API` (or `Azure Resource Manager`) in the output. +## Multi-tenant scenarios + +By default, RedisInsight signs you in through the multi-tenant `/common` endpoint, which issues the access token against **your home tenant**. That works when your account and the Azure Managed Redis resources live in the same tenant. Two situations need extra attention: + +- **Your resources are in a different tenant than your account.** The setup commands above (`az ad sp create` / `az ad app permission grant`) must exist in **your home tenant** — the tenant your user account belongs to — because that is where the token is issued. Running them only in the resource tenant is not enough and results in `AADSTS650052`. +- **You are a guest / external user of the resource tenant.** Sign in against that tenant explicitly (see [Picking a tenant](#picking-a-tenant)) so the token is issued there and its subscriptions become visible. + +> **Personal Microsoft accounts.** Azure Resource Manager and Azure Cache for Redis are **organizational-only Azure APIs** — a personal Microsoft account (e.g. `@outlook.com`) can't be issued tokens for them, so the default sign-in fails with *"You can't sign in here with a personal account."* (This isn't about the app registration, which does allow personal accounts; it's the resources that are org-only.) To use a personal account, invite it as a **guest** into the organizational tenant that owns the resources, then sign in against that tenant with the **Tenant ID** field (see below). + +### Cross-tenant access (resources and user in different tenants) + +Say the Azure Managed Redis lives in **tenant A**, but your user account's home is **tenant B**. To reach A's resources from RedisInsight: + +1. **Get invited to tenant A.** An administrator of tenant A invites your account as a **guest** (Entra ID → External Identities), and you accept the invitation. +2. **Get a role in tenant A.** You need **Reader** on the subscription (or resource group) so autodiscovery can list it, plus a **Redis data access policy** (e.g. *Data Owner*) on the cache if you want to connect to the data, not just discover it. +3. **Make sure tenant A is set up.** The [admin-consent commands](#granting-admin-consent-azure-cli) must have been run **in tenant A** (the tenant the token will be issued for). +4. **Sign in against tenant A.** In RedisInsight, use the **Tenant ID** field (see below) to enter tenant A's ID. The token is issued by A, and A's subscriptions and databases appear. + +Without the invitation and role (steps 1–2), sign-in may succeed but you'll see **no subscriptions** — see the [troubleshooting note](#signed-in-successfully-but-no-subscriptions-appear). + +### Picking a tenant + +When you click **Azure Managed Redis**, the sign-in dialog has an optional **Tenant ID** field. Enter a tenant GUID or domain (for example `your-tenant.onmicrosoft.com`) to authenticate against that specific tenant instead of your home tenant. + +Use it when: + +- Your home tenant differs from the tenant that owns the Azure Managed Redis resources, or +- You are a guest in the resource tenant and its subscriptions don't appear by default. + +Leave the field blank to sign in against your home tenant (the default). The tenant you signed in with is shown on the subscriptions screen. To switch tenants, use the **Switch account or tenant** button there and enter a different tenant ID. + ## Troubleshooting ### Error: AADSTS650057 - Invalid resource @@ -98,6 +131,24 @@ az ad sp create --id acca5fbb-b7e4-4009-81f1-37e38fd66d78 Then grant the permissions using the CLI commands above. +> **Multi-tenant note:** This error most often means the service principals exist in the *resource* tenant but not in the tenant the token was issued for. The token is issued for your **home tenant** by default — so the commands must be run there. If your resources are in a different tenant, either run the setup in your home tenant, or sign in against the resource tenant using the **Tenant ID** field (see [Picking a tenant](#picking-a-tenant)). + +### Error: AADSTS50079 - Multi-factor authentication required + +If you see this error: + +> Due to a configuration change made by your administrator ... you must enroll in multi-factor authentication to access '797f4846-...'. + +The tenant you're signing in against enforces MFA (via Security Defaults or a Conditional Access policy), and RedisInsight refreshes the management token silently, which can't complete an interactive MFA prompt. Enroll the account in MFA once (e.g. sign in to the [Azure portal](https://portal.azure.com) as that account in the target tenant and complete the prompt), then sign in to RedisInsight again. Once enrolled, silent token refresh carries the MFA claim and autodiscovery works. + +### Signed in successfully but no subscriptions appear + +Sign-in worked and there's no error, but the subscriptions list is empty. This means your account has no role in the tenant you signed in against. Azure only returns subscriptions your identity can access, so you need at least **Reader** on the subscription (or resource group). For a guest/cross-tenant sign-in, an administrator of that tenant must assign the role — see [Cross-tenant access](#cross-tenant-access-resources-and-user-in-different-tenants). + +### "You can't sign in here with a personal account" + +**Azure Resource Manager and Azure Cache for Redis are organizational-only APIs**, so a personal Microsoft account can't be issued tokens for them — even though RedisInsight's app registration itself allows personal accounts. Signing in via the default (blank) flow routes a personal account to its consumer tenant, where those resources don't exist, so Azure blocks it. To use a personal account, it must be a **guest** in the organizational tenant that owns the resources, and you must sign in using the **Tenant ID** field (enter that tenant) rather than the blank/default sign-in — the token is then issued in that tenant's context. + ## Why This Setup is Required ### How RedisInsight Authenticates diff --git a/electron-builder.json b/electron-builder.json index fa4cadadd3..39e914b462 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -46,8 +46,8 @@ "asarUnpack": ["node_modules"], "provisioningProfile": "embedded.provisionprofile", "binaries": [ - "Contents/Resources/app-x64.asar.unpacked/node_modules/better-sqlite3/build/Release/better_sqlite3.node", - "Contents/Resources/app-arm64.asar.unpacked/node_modules/better-sqlite3/build/Release/better_sqlite3.node", + "Contents/Resources/app-x64.asar.unpacked/node_modules/better-sqlite3/prebuilds/darwin-x64.node", + "Contents/Resources/app-arm64.asar.unpacked/node_modules/better-sqlite3/prebuilds/darwin-arm64.node", "Contents/Resources/app-arm64.asar.unpacked/node_modules/keytar/build/Release/keytar.node", "Contents/Resources/app-x64.asar.unpacked/node_modules/keytar/build/Release/keytar.node" ], @@ -62,8 +62,8 @@ "asarUnpack": ["node_modules"], "provisioningProfile": "dev.provisionprofile", "binaries": [ - "Contents/Resources/app-x64.asar.unpacked/node_modules/better-sqlite3/build/Release/better_sqlite3.node", - "Contents/Resources/app-arm64.asar.unpacked/node_modules/better-sqlite3/build/Release/better_sqlite3.node", + "Contents/Resources/app-x64.asar.unpacked/node_modules/better-sqlite3/prebuilds/darwin-x64.node", + "Contents/Resources/app-arm64.asar.unpacked/node_modules/better-sqlite3/prebuilds/darwin-arm64.node", "Contents/Resources/app-arm64.asar.unpacked/node_modules/keytar/build/Release/keytar.node", "Contents/Resources/app-x64.asar.unpacked/node_modules/keytar/build/Release/keytar.node" ], diff --git a/i18next.config.mjs b/i18next.config.mjs index 3d8b7dfe73..34fe01b9b2 100644 --- a/i18next.config.mjs +++ b/i18next.config.mjs @@ -1,6 +1,6 @@ import { defineConfig } from 'i18next-cli' -// Config for `yarn i18n:extract` — scans t() usages in the UI and syncs keys +// Config for `npm run i18n:extract` — scans t() usages in the UI and syncs keys // into the locale files. en is the source of truth; bg gets the same keys with // empty values to translate. export default defineConfig({ diff --git a/jest.config.cjs b/jest.config.cjs index c069331638..cee1ea0b2b 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -2,6 +2,18 @@ require('dotenv').config({ path: './redisinsight/ui/.env.test' }); /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ module.exports = { + // Limit discovery to UI sources and the api-client they import, so watch + // only reruns on relevant changes. + roots: [ + '/redisinsight/ui', + '/redisinsight/__mocks__', + '/redisinsight/api-client', + ], + // Fuzzy filename / test-name filtering in --watch (the `p` and `t` prompts). + watchPlugins: [ + 'jest-watch-typeahead/filename', + 'jest-watch-typeahead/testname', + ], testEnvironmentOptions: { url: 'http://localhost/', customExportConditions: [''], @@ -22,12 +34,6 @@ module.exports = { '@redislabsdev/redis-ui-table': '@redis-ui/table', 'monaco-editor': '/redisinsight/__mocks__/monacoMock.js', 'monaco-yaml': '/redisinsight/__mocks__/monacoYamlMock.js', - unified: '/redisinsight/__mocks__/unified.js', - 'remark-parse': '/redisinsight/__mocks__/remarkParse.js', - 'remark-gfm': '/redisinsight/__mocks__/remarkGfm.js', - 'remark-rehype': '/redisinsight/__mocks__/remarkRehype.js', - 'rehype-stringify': '/redisinsight/__mocks__/rehypeStringify.js', - 'unist-util-visit': '/redisinsight/__mocks__/unistUtilsVisit.js', d3: '/node_modules/d3/dist/d3.min.js', '^uuid$': require.resolve('uuid'), msgpackr: require.resolve('msgpackr'), @@ -48,7 +54,7 @@ module.exports = { '\\.mjs$': 'babel-jest', }, transformIgnorePatterns: [ - 'node_modules/(?!(monaco-editor|react-monaco-editor|brotli-dec-wasm|until-async|rettime|uuid|react-jsx-parser)/)', + 'node_modules/(?!(monaco-editor|react-monaco-editor|brotli-dec-wasm|until-async|rettime|uuid|react-markdown|devlop|hast-util-.*|comma-separated-tokens|property-information|space-separated-tokens|unist-util-.*|vfile|vfile-message|html-url-attributes|mdast-util-.*|micromark.*|decode-named-character-reference|character-entities.*|trim-lines|remark-.*|rehype-.*|unified|bail|is-plain-obj|trough|estree-util-is-identifier-name|hastscript|web-namespaces|zwitch|ccount|escape-string-regexp|markdown-table|longest-streak|html-void-elements|stringify-entities)/)', ], // TODO: add tests for plugins modulePathIgnorePatterns: [ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..568c2e4587 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,31427 @@ +{ + "name": "redisinsight", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redisinsight", + "hasInstallScript": true, + "license": "SSPL", + "dependencies": { + "@elastic/datemath": "^5.0.3", + "@elastic/eui": "34.6.0", + "@redis-ui/components": "^44.0.2", + "@redis-ui/icons": "^6.9.3", + "@redis-ui/styles": "^15.0.0", + "@redis-ui/table": "^3.7.0", + "@reduxjs/toolkit": "^2.12.0", + "@sentry/electron": "^7.16.0", + "@sentry/react": "^10.69.0", + "@stablelib/snappy": "^1.0.3", + "@types/json-dup-key-validator": "^1.0.2", + "ajv": "^8.20.0", + "axios": "^1.19.0", + "brotli-dec-wasm": "^2.3.2", + "buffer": "^6.0.3", + "classnames": "^2.5.1", + "connection-string": "^4.4.0", + "d3": "^7.9.0", + "date-fns": "^3.6.0", + "date-fns-tz": "^3.2.0", + "dompurify": "^3.4.13", + "electron-context-menu": "^3.1.0", + "electron-log": "^4.2.4", + "electron-store": "^8.2.0", + "electron-updater": "^6.8.9", + "file-saver": "^2.0.5", + "formik": "^2.4.9", + "fzstd": "^0.1.1", + "get-port": "^7.2.0", + "html-entities": "^2.6.0", + "html-react-parser": "^1.2.4", + "i18next": "^23.16", + "java-object-serialization": "^0.1.2", + "js-yaml": "^4.3.1", + "json-bigint": "^1.0.0", + "json-dup-key-validator": "^1.0.3", + "jszip": "^3.10.1", + "lodash": "^4.18.1", + "lz4js": "^0.2.0", + "modern-normalize": "^3.0.1", + "monaco-editor": "^0.48.0", + "monaco-yaml": "^5.1.1", + "msgpackr": "^1.12.1", + "node-abi": "^4.33.0", + "pako": "^2.2.0", + "php-serialize": "^5.1.3", + "pickleparser": "^0.2.1", + "rawproto": "^0.7.15", + "react": "^18.3.1", + "react-contenteditable": "^3.3.5", + "react-dom": "^18.3.1", + "react-focus-on": "^3.10.2", + "react-hotkeys-hook": "^3.3.1", + "react-i18next": "^13.5", + "react-markdown": "^9.1.0", + "react-monaco-editor": "^0.59.0", + "react-redux": "^9.2.0", + "react-resizable-panels": "^3.0.6", + "react-rnd": "^10.5.3", + "react-router-dom": "^5.3.4", + "react-virtualized": "^9.22.2", + "react-virtualized-auto-sizer": "^1.0.26", + "react-vtree": "^3.0.0-beta.3", + "react-window": "^1.8.11", + "react-window-infinite-loader": "^1.0.10", + "redux": "^5.0.1", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "semver": "7.7.4", + "socket.io-client": "^4.8.3", + "styled-components": "^5.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "url-parse": "^1.5.10", + "uuid": "^14.0.0" + }, + "devDependencies": { + "@aivenio/tsc-output-parser": "2.1.1", + "@babel/plugin-proposal-decorators": "^7.29.7", + "@babel/preset-env": "^7.29.7", + "@babel/preset-react": "^7.29.7", + "@babel/preset-typescript": "^7.29.7", + "@electron/rebuild": "^4.2.0", + "@faker-js/faker": "^8.4.1", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@sentry/vite-plugin": "^5.4.0", + "@sentry/webpack-plugin": "^5.4.0", + "@storybook/addon-a11y": "^9.1.19", + "@storybook/addon-docs": "^9.1.11", + "@storybook/addon-links": "^9.1.11", + "@storybook/addon-themes": "^9.1.11", + "@storybook/react-vite": "^9.1.11", + "@svgr/webpack": "^8.1.0", + "@teamsupercell/typings-for-css-modules-loader": "^2.4.0", + "@testing-library/jest-dom": "^6.2.0", + "@testing-library/react": "^13.3.0", + "@testing-library/react-hooks": "^8.0.1", + "@testing-library/user-event": "^14.4.3", + "@types/classnames": "^2.3.4", + "@types/d3": "^7.4.3", + "@types/detect-port": "^1.3.0", + "@types/dompurify": "^3.2.0", + "@types/electron-store": "^3.2.0", + "@types/express": "^5.0.6", + "@types/file-saver": "^2.0.5", + "@types/html-entities": "^1.3.4", + "@types/ioredis": "^4.26.0", + "@types/is-glob": "^4.0.2", + "@types/jest": "^29.5.14", + "@types/js-yaml": "^4.0.9", + "@types/json-bigint": "^1.0.1", + "@types/lodash": "^4.14.171", + "@types/node": "14.14.10", + "@types/pako": "^2.0.4", + "@types/react": "18.2.1", + "@types/react-dom": "18.2.1", + "@types/react-router-dom": "^5.3.3", + "@types/react-virtualized": "^9.22.3", + "@types/react-window-infinite-loader": "^1.0.6", + "@types/segment-analytics": "^0.0.34", + "@types/semver": "^7.7.0", + "@types/styled-components": "^5.1.34", + "@types/supertest": "^2.0.8", + "@types/text-encoding": "^0.0.40", + "@types/webpack-env": "^1.18.4", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react-swc": "^3.6.0", + "assert": "^2.1.0", + "babel-preset-vite": "^1.1.3", + "concurrently": "^9.2.4", + "construct-style-sheets-polyfill": "^3.1.0", + "copyfiles": "^2.4.1", + "core-js": "^3.50.0", + "cross-env": "^7.0.2", + "css-loader": "^5.0.1", + "css-minimizer-webpack-plugin": "^8.0.0", + "csv-parser": "^3.2.1", + "csv-stringify": "^6.8.3", + "deep-object-diff": "^1.1.9", + "dotenv": "^16.4.5", + "electron": "^43.3.0", + "electron-builder": "26.15.7", + "electron-builder-notarize": "^1.5.2", + "electron-debug": "^3.2.0", + "electron-devtools-installer": "^3.2.1", + "esbuild-plugin-react-virtualized": "^1.0.4", + "eslint": "^8.57.1", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-webpack": "^0.13.8", + "eslint-plugin-compat": "^6.0.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest": "^28.9.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-prettier": "^5.5.1", + "eslint-plugin-promise": "^7.1.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-sonarjs": "^4.2.0", + "eslint-plugin-storybook": "^9.1.11", + "file-loader": "^6.0.0", + "fishery": "^2.3.1", + "google-auth-library": "^10.9.1", + "googleapis": "^125.0.0", + "html-webpack-plugin": "^5.6.0", + "i18next-cli": "^1", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-fixed-jsdom": "^0.0.10", + "jest-html-reporters": "^3.1.7", + "jest-runner-groups": "^2.2.0", + "jest-watch-typeahead": "^2.2.2", + "jest-when": "^4.0.2", + "json-stable-stringify": "^1.3.0", + "license-checker": "^25.0.1", + "lint-staged": "^16.4.0", + "mini-css-extract-plugin": "2.10.2", + "moment": "^2.30.1", + "msw": "2.13.2", + "patch-package": "^8.0.1", + "prettier": "3.5.2", + "react-refresh": "^0.9.0", + "redux-mock-store": "^1.5.5", + "redux-thunk": "^3.1.0", + "regenerator-runtime": "^0.14.1", + "rimraf": "^3.0.2", + "sass": "npm:sass-embedded@1.75.0", + "socket.io-mock": "^1.3.2", + "source-map-support": "^0.5.19", + "storybook": "^9.1.19", + "style-loader": "^2.0.0", + "supertest": "^4.0.2", + "terser-webpack-plugin": "^5.5.0", + "text-encoding": "^0.7.0", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-mockito": "^2.6.1", + "ts-node": "^10.9.2", + "tsconfig-paths": "^3.9.0", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^4.23.11", + "typescript": "^4.0.5", + "url-loader": "^4.1.0", + "vite": "^6.4.3", + "vite-bundle-visualizer": "1.0.1", + "vite-plugin-compression2": "^2.5.3", + "vite-plugin-ejs": "^1.7.0", + "vite-plugin-electron": "^0.28.6", + "vite-plugin-electron-renderer": "^0.14.6", + "vite-plugin-istanbul": "^7.1.0", + "vite-plugin-react-click-to-component": "^3.0.0", + "vite-plugin-svgr": "^4.2.0", + "webpack": "^5.104.1", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^5.1.4", + "webpack-merge": "^5.10.0", + "whatwg-fetch": "^3.6.20" + }, + "engines": { + "node": ">=24.x", + "npm": ">=11.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha1-KFbFVEPT1GFpPzLSuW+26pLh/6k= sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true + }, + "node_modules/@aivenio/tsc-output-parser": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/@aivenio/tsc-output-parser/-/tsc-output-parser-2.1.1.tgz", + "integrity": "sha1-K1AuU6L+QSpdXZVj8l1SfzFFvOs= sha512-aCLAjh8lRc3I+giJSiqe38wrtMOZZFaDdAjqbiPSu8xnH2FBvZMJmVBdk8nNP8OMw4qJJ3OS8/D9DXWoMCAe0g==", + "dev": true, + "bin": { + "tsc-output-parser": "dist/cli.js" + } + }, + "node_modules/@apm-js-collab/code-transformer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.18.1.tgz", + "integrity": "sha512-u1Hb6bHjWtkSpiprwVP6YaHC1DTN4RAU3zYkUDUe7WMnJwdyU1pwTL9dFKiSJB9IiLue/EQovmyx6xhU7FFtAQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/estree": "^1.0.8", + "astring": "^1.9.0", + "esquery": "^1.7.0", + "meriyah": "^6.1.4", + "semifies": "^1.0.0", + "source-map": "^0.6.0" + }, + "bin": { + "code-transformer": "cli.js" + } + }, + "node_modules/@apm-js-collab/code-transformer-bundler-plugins": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer-bundler-plugins/-/code-transformer-bundler-plugins-0.7.4.tgz", + "integrity": "sha512-nAfOeZPSUAQvJa1iFT/5oCrTm5YQhMMrfCNthNnaXHZiOQhu1KGuLoIx7HtbAi3wfwaBYLaICPIeenIaEwcXIg==", + "license": "MIT", + "dependencies": { + "@apm-js-collab/code-transformer": "^0.18.1", + "es-module-lexer": "^2.1.0", + "magic-string": "^0.30.21", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@apm-js-collab/tracing-hooks": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.13.0.tgz", + "integrity": "sha512-mTvWz9rnQwx1U3h0XPTHaX7bgfkpipLLTQyjlC2cdhQpQEuoLT0AGzoydeoq2NxfEVv6fWOOETcSbb2nptleyw==", + "license": "Apache-2.0", + "dependencies": { + "@apm-js-collab/code-transformer": "^0.18.0", + "debug": "^4.4.1", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc= sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik= sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc= sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "dependencies": { + "@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", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "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==", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha1-xw/jxuy9w/0t0bD0mEKLiLgs5H8= sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI= sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha1-bt3yhvLsQY90DJHWCoM0fFWDjd0= sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s= sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha1-jb2zzgtcSH4a7BDhPJpDpQCBTfg= sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y= sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4= sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha1-d7C1uU8Zl/qdbjEl9EUiex+vnYU= sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha1-wKB2bxoTYX2KF0B9erj51IYiXqQ= sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha1-vDw5ZDKQQ8eREuUTwbGY8WWJrCE= sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha1-UMlcfkxPVJNs+gEWQo7cVZhi1VE= sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha1-fwhx2Zgk0jE31g+G/PYTD9WhtR8= sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha1-vYcITO0MeW7Ea9pJLeboPSnon8I= sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo= sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc= sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", + "integrity": "sha1-68V71NcR35IKVT3opFajoCDODXI= sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-decorators": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha1-eET5KJVG76n+usLeTP41igUL1wM= sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo= sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha1-miOrkfuOYdFCaEEIvKbzQ87uiPY= sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "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.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE= sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk= sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "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.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha1-1Jo7PmtS5b5nQAIjF1gCNKakc1c= sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha1-1JOgkYuf2tdUD1r9m161xSUA0Y0= sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", + "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha1-r2eNhQas9SxXfKxz/3/mYVyF/JI= sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha1-3P4sJAlLt1e/c5YDdOfFXkNPGfA= sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha1-zLiKLEnIFyNoYf7ngmCAVzuKkjo= sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", + "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-react-display-name": "^7.29.7", + "@babel/plugin-transform-react-jsx": "^7.29.7", + "@babel/plugin-transform-react-jsx-development": "^7.29.7", + "@babel/plugin-transform-react-pure-annotations": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha1-EgIkUMRaTabY2Ch7GKT/Ldsj92g= sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA= sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dependencies": { + "@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.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk= sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@bufbuild/protobuf": { + "version": "1.9.0", + "resolved": "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.9.0.tgz", + "integrity": "sha1-//rDGDBZpBzu9TEeB+NyTUJqlcQ= sha512-W7gp8Q/v1NlCZLsv8pQ3Y0uCu/SHgXOVFK+eUluUKWXmsb6VHkpNx0apdOWWcDbB9sJoKeP8uPrjmehJz6xETQ==", + "dev": true + }, + "node_modules/@colordx/core": { + "version": "5.4.0", + "resolved": "https://registry.yarnpkg.com/@colordx/core/-/core-5.4.0.tgz", + "integrity": "sha1-5ui7astSyZaCe8hTeQBKmvSHTqo= sha512-zEvOjz+QQJX9l+HS5UO4tXoHSG+WSxPKHJg293k3j3myUWJtZ9P0pJT42WHLNxueyiVQX6BQtCs59i3MgpTMeg==", + "dev": true + }, + "node_modules/@croct/json": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/@croct/json/-/json-2.1.0.tgz", + "integrity": "sha1-LW2otSyrbRsfBmQqkvdRSEAx0JM= sha512-UrWfjNQVlBxN+OVcFwHmkjARMW55MBN04E9KfGac8ac8z1QnFVuiOOFtMWXCk3UwsyRqhsNaFoYLZC+xxqsVjQ==", + "dev": true + }, + "node_modules/@croct/json5-parser": { + "version": "0.2.2", + "resolved": "https://registry.yarnpkg.com/@croct/json5-parser/-/json5-parser-0.2.2.tgz", + "integrity": "sha1-2zRZXNdGuoRnacxX+hodxVKUAXc= sha512-0NJMLrbeLbQ0eCVj3UoH/kG2QckUgOASfwmfDTjyW1xAYPyTNJXcWVT/dssJdTJd0pRchW+qF0VFWQHcxs1OVw==", + "dev": true, + "dependencies": { + "@croct/json": "^2.1.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha1-AGKcNaaI4FqIsc2mhPudXnPwAKE= sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha1-ZTT9WTOlO6fL86F2FeJzoNEnP/k= sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha1-HVcr+74Ut3BOC6Dzm3SBW4SHDXA= sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@elastic/datemath": { + "version": "5.0.3", + "resolved": "https://registry.yarnpkg.com/@elastic/datemath/-/datemath-5.0.3.tgz", + "integrity": "sha1-e6zNq2crmj7Lf+g4dYBnCTa1hXM= sha512-8Hbr1Uyjm5OcYBfEB60K7sCP6U3IXuWDaLaQmYv3UxgI4jqBWbakoemwWvsqPVUvnwEjuX6z7ghPZbefs8xiaA==", + "dependencies": { + "tslib": "^1.9.3" + }, + "peerDependencies": { + "moment": "^2.24.0" + } + }, + "node_modules/@elastic/datemath/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA= sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha1-pxiLyX2cMSDNZeUu1CM3eHK2BL0= sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@elastic/eui/node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz", + "integrity": "sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y= sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@elastic/eui/node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha1-DmSwo3U92/H9wETF/QHQGZoC4SU= sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@elastic/eui/node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha1-nzOcqb6nEkblZfx5/32/6Yu1D14= sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha1-5P53xKmuHLLmwl4C3wBD0BZPbkE= sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha1-9NPQ4vX7tqxGRQZB6y4lvwXTayI= sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==" + }, + "node_modules/@elastic/eui/node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha1-m2r7WZvPMWXxD5P8hUj5oD0uwro= sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha1-nGKqOzW3mkhkVMaQRykGB19Ax+E= sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha1-YQUJoENITB5pdDf6XrP9mSYXyUU= sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha1-uNP+rCVtn/zJ+h/v3PPKcFdu6QM= sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@elastic/eui/node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz", + "integrity": "sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY= sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@elastic/eui/node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz", + "integrity": "sha1-Z2SaGr/Dq4XSlpUCkCd16wMUaXU= sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@elastic/eui/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I= 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).", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/@electron-internal/extract-zip/-/extract-zip-1.0.3.tgz", + "integrity": "sha1-3r9o9BXteoQW1WjNA82pgQnA6rQ= sha512-OjKpjB7gohtEjZiq6nDx1egqjZJhGPN1iFOIED+NFhB/MMkXw/XRcHjh1DGXKT5z2W9eW7Jy2UKU3gpjvusFTQ==", + "dev": true, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha1-PH7A4mSAzlGkh9VMihAjNGBTECE= sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/get/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha1-Lx6Jwvbb00COGxcR3YLWLjF/WNo= sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@electron/notarize": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", + "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "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": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha1-jVzxEy+DbXrb5CzwtJ33gW/IgkA= sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha1-dFlp1kmXd3a0P8dkjFVqqkYrQQI= sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha1-3qyzib1u530ef8rMzp4WxcfnjgQ= sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha1-dyESkcGQCnALinjPr9oxYNdpSe0= sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha1-CmeMSsS/hxfmdIHhp5fmwVL5PIQ= sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha1-YHCEYwxsAzmSoILebm+8GotSF1o= sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha1-OIomnw8lwbatwxe1osVXFIlMcK0= sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha1-3mM9s+wu9qPIni8ZA4Bj6KEi4sI= sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha1-XV6K7o/OSPXhib9zDr0fdY9JFFE= sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha1-Gv8nqZPqGyVKWGMYwpw7FuoPTQo= sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha1-+fg+5P7nisI62eZbEo/BGieFdTI= sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha1-oTSbv2oOXLXe1V0CN2byCk1DmjE= sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha1-UN6jYWvIGR+44RIoO0nq/wPnhCk= sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha1-+5B2JN8yVtBLmqLfUNeql+xkh0g= sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha1-r1smkaIrRL6EewyoFkHF+2rQFyw= sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha1-Siho111taWPkI7z5C3/RvjQ0CdM= sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha1-ht4igQysPtQG7BD41mAWgVuCJrQ= sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "dev": true, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha1-fxSLMVOnds7iAgFbEPmphQaNGI0= sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha1-YQxKzXeX2UiQpuLd4smOseiR3RI= sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha1-Z0pMTYGtRgaVyyofxp14zRh/M34= sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha1-U1l5/z/0/h58xPg+IyBQTHQ7fiA= sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha1-27Se2A3xHfdCaAI7SWrF2azSKzo= sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha1-Ee1WTseEMqIA6iYBohLSSvgVDVA= sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha1-pURvwMUStxyDxE2QjVx7e0xJOys= sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@inquirer/confirm/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM= sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha1-VMzY99R4UhQLYGbL131jssKxaP0= sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "5.2.2", + "resolved": "https://registry.yarnpkg.com/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha1-fHPi/A571MQM/TihgK5bvSTTK5A= sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha1-4q/qwkfZfdZO4YqoHpAr3R/g6nA= sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha1-1553JULPjTQGQunavToep/WjAQQ= sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", + "dev": true, + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha1-0L3qw/ErSDW3NZwq2JxCKk0cxy4= sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.yarnpkg.com/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha1-9cxYQ3MqgTBNBqDbS1PMfb2hVUE= sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "dev": true, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha1-kwXLFw38OlMj5erIhalF583dXEs= sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha1-sTNmjY4OCZtBM6u5FSIVAeD/ddc= sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha1-8h77YU2pyQUJUmL1F4H9KnIfzqw= sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "8.5.2", + "resolved": "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-8.5.2.tgz", + "integrity": "sha1-CcATKtoru6lMkdNBEV4eQcs/FSU= sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", + "dev": true, + "dependencies": { + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts/node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha1-nGp9ecYTKyr1f9t1dH8FYgTlU1Y= sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "5.3.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha1-Zva45qqC1HOZxDO4JiEo58Gk+c4= sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha1-yPS3irP4Zv3wUD+sDNCMSmZhwR4= sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", + "dev": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha1-OgXnbljZ4bsJXpEsPnCTqgTNRgQ= sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.yarnpkg.com/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha1-nG8NhX/mrVSaOpMjQ7ZOdqyzSxA= sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "dev": true, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA= sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE= sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q= sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM= sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ= sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha1-LVmuOrSzj7QnC/oj0w+OLobH/jI= sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0= sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "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": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha1-zUgi29uEUpJlxaK9tSmjycyVD/w= sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha1-tszMI58w/zZglljFpeIpF1fORI8= sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha1-JNYfVP8feG881Ac7S5RBY4O68qc= sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha1-dqPtsMt1O3Dfv+Iyg1ENPUVDK/I= sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha1-Aj7+XSaopw8hZ30KGvwPCkTjocY= sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha1-/ZG/H/+xbX0NJKQmqxpHpJiBpWU= sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha1-jZKQ+exH/3cmB/qGTKHVou+uHU0= sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha1-1TBBR/SaBSkAtLhT3tsRHQgOGZ8= sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha1-8Xwd45WLZ9/khTVPWhAJMpjypJs= sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha1-BLJi7LO4+qg7Cz0yFiOXI5Po9Mc= sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha1-Qwtc6KTgBEp+OBlmMwWnswkcjgM= sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha1-2Quncglc83o0peuUE/G1YqCFVMQ= sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha1-jbmoCqGgl7siYlcmhnNLrtmxZXw= sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha1-bO+XfOHTmDSjrqiHoXJmKKbwcs4= sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha1-3y3Zw0bH13aLigZjmZRkDGQuKEw= sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha1-ETH4z2NOfoTF53urEvBSr1hfulk= sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.6.1", + "resolved": "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz", + "integrity": "sha1-9jC5PtE9XQdIPA6tQtt5MFOzZKk= sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==", + "dev": true, + "dependencies": { + "glob": "^10.0.0", + "magic-string": "^0.30.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI= sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha1-IjTOJsYoifA9s9f+pDwZMqs+kns= sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE= sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y= sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha1-gQgmVlnUwz5y/+FOM9bMXrWfL9o= sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha1-aRKwDSxjHA0Vzhp6tXzWV/Ko+Lo= sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A= sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha1-0Hct4apoCgv7m6LzK0yCjHhXy50= sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha1-EAP1nVT65vY4y1ZG9SEQ+z2pW00= sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha1-2ehDgcJGjoJinkpb6dfQWi3TJM0= sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha1-RySqqEhububibX/zyGhZYNVgseM= sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha1-JeQ+VTEhZvM0jK5nQ1iHgdESwek= sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@mdn/browser-compat-data": { + "version": "5.7.6", + "resolved": "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz", + "integrity": "sha1-GQ1GY/oDaI2Fsx9BVkHHY8s3byk= sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", + "dev": true + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha1-RNdSwaLcET8V94G3zE9Towfj+jg= sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha1-12bcGhaKoxWmoLLQ8uDPG3TyPII= sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U= sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos= sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po= sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha1-SoItEPbw4xa+TWe01PjJoSSwc70= sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha1-KzqxJCs2CqCtsouF9dfaHBM6CVQ= sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha1-Cs8y9HCvLOr0fwlc3s1A1oZm79o= sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.220.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.220.0.tgz", + "integrity": "sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.220.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.220.0.tgz", + "integrity": "sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.220.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz", + "integrity": "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz", + "integrity": "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM= sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.7", + "resolved": "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz", + "integrity": "sha1-61AU39CwPn87ou7v9Qbu2JsCgFg= sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha1-LroWO459urtM42CateMqtj3aPvg= sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dev": true, + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha1-qbvnBcnYhG9OCP9nZazw8bCJhlY= sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha1-8Hf9wLXQB40wiTOW/0gnoT+Z6Bc= sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU= sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha1-6u5ZABIsEQo9vLcowFlwFKJiF3Q= sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha1-eyySJfvxsSZTlVH1mFdp0ASNkJA= sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha1-g/QVxEJfIePSeRTBKzJyoy49rmU= sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz", + "integrity": "sha1-S0YP28GsCXpJZOBMpATCXC9tfT8= sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.3.1.tgz", + "integrity": "sha1-xcl47UncyKgagSa96dVHx7koKFs= sha512-xTaLKAO+XXMPK/BpVTSaAAhlefmvMSACjIhK9mGsImvX2ljcTDm8VGR1CuS1uYcNdR5J+oiOhoJZc5un6bh3VQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.10", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.10.tgz", + "integrity": "sha1-oOdeXNlmboyBANU5qfV8UNET44s= sha512-O2mcG3gZNkJ/Ena34HurA3llPOEA/M4dJtIRMa6y/cknRDC8XY5UZBInKTsUwW5cUue9A4k0wi1XU5fKBzKe1w==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.6.tgz", + "integrity": "sha1-/s90R15GYO6Zx+sev6XM+xohn+Q= sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha1-osTEevYzcEjueP9twNCQs5DSuzA= sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha1-YWKO8mmkMzgsNk9vHjeIptwhOjY= sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.13", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz", + "integrity": "sha1-jIaKl+xwdl77El/UhwjJmTx65oM= sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha1-OeWldp5nbHUyBLeS++bPUI5VChQ= sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.9", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", + "integrity": "sha1-RuAlum5vQDZ34i+7fZm2PPezK8o= sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.14", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.14.tgz", + "integrity": "sha1-lAM6uOLpBblZUIVwHPxddaFVx7Y= sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.14", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha1-Tsmn5Qkl9/tmE5RGAEW0YhKjO+0= sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", + "integrity": "sha1-omXF8sb6Q2XLFr30/uaeNrYvcoo= sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha1-FAQALnmgP+Bit+OGSqAeJL0Ucfc= sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.14", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.14.tgz", + "integrity": "sha1-YTgE7V6UoFKt5pR3WifUciDR3SY= sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.13", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.1.13.tgz", + "integrity": "sha1-EA6vSPFZCb1jreDG+Lx4bsBivFk= sha512-84uqQV3omKDR076izYgcha6gdpN8m3z6w/AeJ83MSBJYVG/AbOHdLjAgsPZkeC/kt+k64moXFCnio8BbqXszlw==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.6.tgz", + "integrity": "sha1-In0ogvGdgJM3llJce70NPd9pmsA= sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.8", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", + "integrity": "sha1-AYHoW8DYxnIp3YzxmCBPX0zHwJw= sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha1-JTrArUlGxbSpxmh4M19c8HyWfO0= sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", + "integrity": "sha1-A/ZPlXcZx2HSLC+SzEP/tkvULMg= sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "dependencies": { + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-progress/-/react-progress-1.1.6.tgz", + "integrity": "sha1-vsg2j//ihEaJW+SKS4X3HrkXCfY= sha512-QzN9a36nKk2eZKMf9EBCia35x3TT+SOgZuzQBVIHyRrmYYi73VYBRK3zKwdJ6az/F5IZ6QlacGJBg7zfB85liA==", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.3.6.tgz", + "integrity": "sha1-Nve9xksQIS+gKbrcSHuRgEsLNM4= sha512-1tfTAqnYZNVwSpFhCT273nzK8qGBReeYnNTPspCggqk1fvIrfVxJekIuBFidNivzpdiMqDwVGnQvHqXrRPM4Og==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.9", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.9.tgz", + "integrity": "sha1-N/yst9/MnqRUAbLdB72XzLuJEbI= sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.4", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.2.4.tgz", + "integrity": "sha1-Vu7/2dXuIzkrukY1564/OBraeT0= sha512-/OOm58Gil4Ev5zT8LyVzqfBcij4dTHYdeyuF5lMHZ2bIp0Lk9oETocYiJ5QC0dHekEQnK6L/FNJCceeb4AkZ6Q==", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha1-QJRTEQuPNMoAlydQuAzXkvCyOow= sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha1-4tvBO9xeQWj0M091gy173T4t5bo= sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==" + }, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha1-0FwlyprEaVzBm6kfQvaG4+otmuw= sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha1-25uLz/SeAb5RCteYk/sOTNpQ8bw= sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha1-UC1uNU/IR9QWnDvF8Yned39oz+E= sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", + "integrity": "sha1-GOZTPneKIFHtwq0Hc9qOIvA/Ymo= sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-1.2.4.tgz", + "integrity": "sha1-MxgAfEFH32nAQUGqenfANLrqcWk= sha512-yZCky6XZFnR7pcGonJkr9VyNRu46KcYAbyg1v/gVVCZUr8UJ4x+RpncC27hHtiZ15jC+3WS8Yg/JSgyIHnYYsQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.11", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.11.tgz", + "integrity": "sha1-ncAC6m+K1oMLwg80mv3FfGA5AJw= sha512-4FiKSVoXqPP/KfzlB7lwwqoFV6EPwkrrqGp9cUYXjwDYHhvpnqq79P+EPHKcdoTE7Rl8w/+6s9rTlsfXHES9GA==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.8", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.1.8.tgz", + "integrity": "sha1-SZZvrL+Uqn1RKTeQx4xnwfdIeu8= sha512-hrpa59m3zDnsa35LrTOH5s/a3iGv/VD+KKQjjiCTo/W4r0XwPpiWQvAv6Xl1nupSoaZeNNxW6sJH9ZydsjKdYQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.6", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.2.6.tgz", + "integrity": "sha1-IxHaWTlR+F02zUX0AlgWv2/tqH4= sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha1-YqTbqLMlX9xcx3h/rqwcbkzFjUA= sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha1-kFeTQF3lfWGkOfSv67sX0GRfMZA= sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha1-CQzzDQCkx2MqFVSFEukVIhdZOQc= sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha1-s/7Zu+o2ahGPQEJ6xAUAqhQjzCk= sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha1-DEIwqe7UnUWJyWfi2cDZ1gojlx4= sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha1-GhrVVolz0kBR7Qr2h3ZvbHy5tbU= sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha1-AUQ8qO0HHTMCPBET5Rc7Xth2kVI= sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha1-beJ2/7w4mlN//kMW9bDyQSlAWzc= sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz", + "integrity": "sha1-qm0PlbDNUPCLAjk9JRMvUsp4Ydw= sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha1-eCRO/hKTDFb9JV15I4ZYV8QayMs= sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + }, + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha1-wtHQsK+LaexuKzokEroHaKyC24A= sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha1-wG2sLQEfNtYSWaocbfTw1eKLxV4= sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/resize-observer": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/@react-hook/resize-observer/-/resize-observer-2.0.2.tgz", + "integrity": "sha1-9J/k5rnehsWD0Tbff65DBoRSgJI= sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==", + "dependencies": { + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@redis-ui/components": { + "version": "44.0.2", + "resolved": "https://registry.yarnpkg.com/@redis-ui/components/-/components-44.0.2.tgz", + "integrity": "sha1-A5uk+wkHmUTQDqBkByZfzD+Kq1E= sha512-ldQzUV14452iVOuOxjnN3U9YbO6xm9UOmKpAHyJ8NZs53WAo4oCjGk4CImkf8cNh8YuDrVVg7RrZKbqFZqmSdg==", + "dependencies": { + "@radix-ui/react-checkbox": "^1.0.3", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.4", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-popover": "^1.0.3", + "@radix-ui/react-progress": "^1.1.0", + "@radix-ui/react-radio-group": "^1.1.2", + "@radix-ui/react-select": "^2.1.0", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.0.3", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-tooltip": "^1.0.4", + "@react-hook/resize-observer": "^2.0.2", + "react-children-utilities": "2.9.0", + "react-day-picker": "^8.6.0", + "react-hotkeys-hook": "^4.6.1", + "react-loading-skeleton": "^3.3.1", + "react-toastify": "10.0.4", + "type-fest": "^5.4.4", + "virtua": "^0.36.3" + }, + "peerDependencies": { + "@redis-ui/icons": "^6.9.2", + "@redis-ui/styles": "^15.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "styled-components": "^5.0.0" + } + }, + "node_modules/@redis-ui/components/node_modules/react-hotkeys-hook": { + "version": "4.6.2", + "resolved": "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-4.6.2.tgz", + "integrity": "sha1-Jt0g9Z0jIEgU8iPVxfOXmj/oPIg= sha512-FmP+ZriY3EG59Ug/lxNfrObCnW9xQShgk7Nb83+CkpfkcCpfS95ydv+E9JuXA5cp8KtskU7LGlIARpkc92X22Q==", + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" + } + }, + "node_modules/@redis-ui/icons": { + "version": "6.9.3", + "resolved": "https://registry.yarnpkg.com/@redis-ui/icons/-/icons-6.9.3.tgz", + "integrity": "sha1-vj53rUFjxQDLLIQdXUhudlH9eAw= sha512-CHWyqMn7ygGdIshgdgGLEqBd8X2g3XFBQHGhUXuMPgeq1nsYa9jiNbQfx9Hk65kv+AICr+ZfqM12irgAxpyenw==", + "peerDependencies": { + "@radix-ui/react-id": "^1.1.0", + "@redis-ui/styles": "^15.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@redis-ui/styles": { + "version": "15.0.0", + "resolved": "https://registry.yarnpkg.com/@redis-ui/styles/-/styles-15.0.0.tgz", + "integrity": "sha1-wjVtg4sBffsDeloJORVCPwDCVGI= sha512-Wic8KSOBHk0Idlnxbz4tDHiAW/Kw5ob7FOZdiAn8WReaGR8FKck195x1Pt4ZsyRCJ6gMyRUTW6o/PbhORGth9Q==", + "dependencies": { + "color-alpha": "^2.0.0", + "polished": "^4.3.1" + }, + "peerDependencies": { + "modern-normalize": "^3.0.1", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "styled-components": "^5.0.0" + } + }, + "node_modules/@redis-ui/table": { + "version": "3.7.0", + "resolved": "https://registry.yarnpkg.com/@redis-ui/table/-/table-3.7.0.tgz", + "integrity": "sha1-TZ/V8wXIPmEVUiIe6PKn/3Rnxfg= sha512-uLeMgecqwMwdmk7sIxMHlfKPi4ZAivtfW9t2M3CPvlftQM7IY9ur2fwRgF4V8Fl8PrePyQ5V9/38GSSz0CPscg==", + "dependencies": { + "@redis-ui/components": "^44.0.0", + "@redis-ui/icons": "^6.9.2", + "@tanstack/react-table": "^8.9.8", + "type-fest": "^5.4.4" + }, + "peerDependencies": { + "@redis-ui/styles": "^15.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "styled-components": "^5.0.0" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha1-5ieHUDo4Vh4Eu4854pyo22iVkPk= sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha1-R9K/TO9tRwsi9YMbQg+JZOC/dV8= sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha1-V7obDL2o56PFl6SFPIB7FW4hp7Q= sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha1-Vcy1SHwCQZlUxXp6gGAohdYW4e4= sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha1-kn3S+um8M2FAOsLHoAwy3c6a1+g= sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha1-YN6JG7Emq/3FQQ/cYWasoGXxCgw= sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "node_modules/@sentry/browser": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.67.0.tgz", + "integrity": "sha512-/ZhsAvte4rYhg0A0RtSFFgAgXhyMOfQIeOAfMfptN+X6IVSYOfkA9jtrP+Ej4+6vlaUFWRir1HweF56y63dEEA==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.67.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0", + "@sentry/feedback": "10.67.0", + "@sentry/replay": "10.67.0", + "@sentry/replay-canvas": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/browser-utils": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/browser-utils/-/browser-utils-10.67.0.tgz", + "integrity": "sha512-HUzaf0xAnPAB+OHBkD7N1Py+CTbD5InHulQ/pdhX4JctWtxuwD8odMD1LzdPnW8J6gVHlDVvcVBR8mXMZYSLSw==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/bundler-plugins": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugins/-/bundler-plugins-10.69.0.tgz", + "integrity": "sha512-I1otnSJIH4IOugLp+kcBbT0Kcex+J8xnHuUyzMAwCYSpZ0FMVvA723uNmkMdW0PxRRw0oEhe0qDB+t+ZjHxUiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.5", + "@sentry/cli": "^2.58.6", + "@sentry/core": "10.69.0", + "dotenv": "^17.4.2", + "find-up": "^5.0.0", + "glob": "^13.0.6", + "magic-string": "~0.30.8" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "rollup": ">=3.2.0", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/cli": { + "version": "2.58.6", + "resolved": "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.58.6.tgz", + "integrity": "sha1-cu20l32CJ1dRGyeeAGsA8TniSUU= sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.58.6", + "@sentry/cli-linux-arm": "2.58.6", + "@sentry/cli-linux-arm64": "2.58.6", + "@sentry/cli-linux-i686": "2.58.6", + "@sentry/cli-linux-x64": "2.58.6", + "@sentry/cli-win32-arm64": "2.58.6", + "@sentry/cli-win32-i686": "2.58.6", + "@sentry/cli-win32-x64": "2.58.6" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.58.6", + "resolved": "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.58.6.tgz", + "integrity": "sha1-OP2CdRAUsofljpnvlI0Byh4J9B0= sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.6.tgz", + "integrity": "sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.6.tgz", + "integrity": "sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.6.tgz", + "integrity": "sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.6.tgz", + "integrity": "sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-arm64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.6.tgz", + "integrity": "sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.6.tgz", + "integrity": "sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.6.tgz", + "integrity": "sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c= sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@sentry/cli/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY= sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sentry/cli/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha1-4QLxbKNVQkhldV0sno6k8k1Yw+I= sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/@sentry/conventions": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.16.0.tgz", + "integrity": "sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sentry/core": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.69.0.tgz", + "integrity": "sha512-+uuqVEeiDzYuAKjZLqsROKXvRTbl/QeH0gfGRtpYib1cud4rAFWRIkFmcR7Jb7JGFYwmReyQotiTj/hcDszTZg==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/electron": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-7.16.0.tgz", + "integrity": "sha512-GgnsAGynr1IKfakRuW5AGlxQsIZi0cFUyzcn9ekrYy1cIyb85piVLN5u7W9pXzSzKopaGrxXBWubPBSRagyXjA==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "10.67.0", + "@sentry/core": "10.67.0", + "@sentry/node": "10.67.0" + }, + "peerDependencies": { + "@sentry/node-native": "10.67.0" + }, + "peerDependenciesMeta": { + "@sentry/node-native": { + "optional": true + } + } + }, + "node_modules/@sentry/feedback": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/feedback/-/feedback-10.67.0.tgz", + "integrity": "sha512-I4ML2/SF3enwikb6ZSoRiqolQrx0zSzTSnUgwCmugICF/jpHW0th1pCray9R+t1Zzibw/Dpj4t/DNXaSDRa2MA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.67.0.tgz", + "integrity": "sha512-SFKpZGqOCEFSmP93NdDP6ikZp4NS7A/JR8+2ofK3jF6Y9Vyox7pX0pxdOnPLpFcPtMybMahfWqSAWJvsFs4RmA==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/instrumentation": "^0.220.0", + "@opentelemetry/sdk-trace-base": "^2.9.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0", + "@sentry/node-core": "10.67.0", + "@sentry/opentelemetry": "10.67.0", + "@sentry/server-utils": "10.67.0", + "import-in-the-middle": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node-core": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.67.0.tgz", + "integrity": "sha512-dBHHRwZyan1pOnFJ+sNBvR8TkXbZAfZU/jpxmALS3JZ2/8AGR7cQKL+b7SleKuJ7iUDZyklN3Nqi0i5JkcA+HA==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0", + "@sentry/opentelemetry": "10.67.0", + "import-in-the-middle": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/exporter-trace-otlp-http": ">=0.57.0 <1", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/core": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-http": { + "optional": true + }, + "@opentelemetry/instrumentation": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + } + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.67.0.tgz", + "integrity": "sha512-oLTOrAK1rOqmYRktOJZwz37B1seXPx1W2FTMVtzTVNjMFA/LZwGzePeZzhUOgzZgfLHixMd/ceWtGqoxAndcjQ==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0" + } + }, + "node_modules/@sentry/react": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.69.0.tgz", + "integrity": "sha512-f0Il/JMteHjdWPNZQB3rtp1Pcj2Leb3p0KSZuv3rh0EUril9CbWtQVy5zJhoAppi+MWWmgRWa+6BpHbQf+ABQA==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "10.69.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.69.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/browser": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.69.0.tgz", + "integrity": "sha512-8391tnm96YbR7b8SYfEA/NEIZuyb2r3SZrtAT0bhZtjlujcYWjo7gugQvk8sWLU9cAa/euD00eJoIoJvNfpd7Q==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.69.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.69.0", + "@sentry/feedback": "10.69.0", + "@sentry/replay": "10.69.0", + "@sentry/replay-canvas": "10.69.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/browser-utils": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/browser-utils/-/browser-utils-10.69.0.tgz", + "integrity": "sha512-e/u1Abj0zRPwR/deGZAP3GOULrsx67/XXnM5Skniqs4uxTsdNtPek1Nef0tpxwaQJYxwh6pWdhswLPPbbPOgBQ==", + "license": "MIT", + "dependencies": { + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.69.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/feedback": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/feedback/-/feedback-10.69.0.tgz", + "integrity": "sha512-qrGz5Qaw93/IhMjlFN6uIaXeHwgHDaKGa6FkTAP6PonpkvSbGGqan6xfsENxzj9HUVoli1lZ6tMRDnt2qtSPhg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.69.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/replay": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-10.69.0.tgz", + "integrity": "sha512-uRhmNhtFGPOlM0iniVmWKAX3KVXI0le41yYK/iKdPjinT9jA3ZrmykO/Fv1v/KI5znOtwa9D6eHRnDTTMRxFrg==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.69.0", + "@sentry/core": "10.69.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/react/node_modules/@sentry/replay-canvas": { + "version": "10.69.0", + "resolved": "https://registry.npmjs.org/@sentry/replay-canvas/-/replay-canvas-10.69.0.tgz", + "integrity": "sha512-VF6nXvSninHcc7dC1Zme0RjkC7VgRMCixs6jKaQX5zTNeqTW3dZGSefSOVv+ZteRi3hJvVORq985VjUC9Z/0+A==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.69.0", + "@sentry/replay": "10.69.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/replay": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-10.67.0.tgz", + "integrity": "sha512-nkEUgPCR82EcyJkCf3XCE9H0R5KisCqyCAaSGxe7NpAoQbvASHx4MUNgXVAn+D0M494gvPZh6lFH7JgzqTcSqQ==", + "license": "MIT", + "dependencies": { + "@sentry/browser-utils": "10.67.0", + "@sentry/core": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/replay-canvas": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/replay-canvas/-/replay-canvas-10.67.0.tgz", + "integrity": "sha512-neNA4T6MFtZzMdKYetiR+LZd9BNSd0q2szMn0wk+A15PqHE/IN7a34V6JZc9rCtmzB0wldh0eWGOBb49MSNKjA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.67.0", + "@sentry/replay": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/server-utils": { + "version": "10.67.0", + "resolved": "https://registry.npmjs.org/@sentry/server-utils/-/server-utils-10.67.0.tgz", + "integrity": "sha512-GQ9t+RSTx5s3b/aZrLFuL4nrwPLMah5NiZk5cjxJmgmOSgm3nMdO8gdqCedDch5B13F3YsxtaQYjSJnzLz8M5A==", + "license": "MIT", + "dependencies": { + "@apm-js-collab/code-transformer-bundler-plugins": "^0.7.1", + "@apm-js-collab/tracing-hooks": "^0.13.0", + "@sentry/conventions": "^0.16.0", + "@sentry/core": "10.67.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/vite-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-5.4.0.tgz", + "integrity": "sha512-fFJgCxs5hDyAm9BbZJ+LbA+LK2tjX5OoD0v0ARU4StR6KQmGUduoPs69yJ9AfqZ0om3Rlp5JDliiwFcNkasORA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/bundler-plugins": "^10.64.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@sentry/webpack-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-5.4.0.tgz", + "integrity": "sha512-J3a0BvUZ75Qxy+v/Ap3Hx4ZEcSjlPHZ/jDtxdRhXQCyNeEb8xq0uUBTI9VLtGk2eNeNucOxOEJ5ngqdNjnEH/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/bundler-plugins": "^10.64.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "webpack": ">=5.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha1-Zmf6wWxDa1Q0o4ejTe2wExmPbm4= sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha1-q7Edma620n8bVjw4FHpy1QBY4zk= sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha1-ECk1fkTKkBphVYX20nc428iQhM0= sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha1-Vf3/Hsq581QBkSna9N8N1Nkj6mY= sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha1-lhFvKpEuDAKBc0WzwQdRBpkg1VM= sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@stablelib/snappy": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stablelib/snappy/-/snappy-1.0.3.tgz", + "integrity": "sha512-JTu/W2mNy7wstd0V/19qBukMGWRWmhwBhulckOIkjA1hi2FLy2TzU8q1X+cIdkEOAWRX7twvsOg2cyBXnYmzUw==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha1-p5tV26+GBIEvUtFAssmrQbwVC7g= sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha1-PV5gjxbCOQwQUo6Y5Zrva/c8rns= sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" + }, + "node_modules/@storybook/addon-a11y": { + "version": "9.1.19", + "resolved": "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-9.1.19.tgz", + "integrity": "sha1-ARkNzGifcoj1OqOoelL24mJesoI= sha512-UjJ8qIKlI7UvGYVVV6axO1TgyySGZwbTEu/JbKjYxVTmZKBHK9PQZjEysYwqMTmqDtfeQ33Cg7WfkpeHdBmdgw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "axe-core": "^4.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^9.1.19" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-9.1.11.tgz", + "integrity": "sha1-sjU+Y1riDyQMUZr0C2Pi9Gr9qRo= sha512-mui6s3CwH1Oj5/1+y+YDcttLUKdvkyghmUioB6L7Hsix2yv3J0ju6JXRo+hCYisvKaPvLS7+1xQAd0mgYKKanA==", + "dev": true, + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/csf-plugin": "9.1.11", + "@storybook/icons": "^1.4.0", + "@storybook/react-dom-shim": "9.1.11", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^9.1.11" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha1-JL2n//zrL+JW+VRIISPNob5fX+8= sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "dev": true, + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/icons": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.6.0.tgz", + "integrity": "sha1-n6brnIKSK3n3Wiz4PDivMLp/1pY= sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + } + }, + "node_modules/@storybook/addon-links": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-9.1.11.tgz", + "integrity": "sha1-JhF1rQ0QgxTT2YEoND0a/bSfycA= sha512-HHejK5ivHYCxIK91efHo1i5g7eoUcj3IxdKhlUY7rMcgNulQoOzLuNqh8ZLd0aForumTM0C7mJIZLRzpz84WeA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^9.1.11" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-themes": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/addon-themes/-/addon-themes-9.1.11.tgz", + "integrity": "sha1-Ia9x0p055Hxao+aXFwrcXJEPy9k= sha512-Hsbw7zZiGLpgrzcO5geXp/EeCRDni+xAZgL12ijB1aUrRF4k0JatdYqE9h2C8Ui6Jb+Nk929M9YwNdmdrKvn6g==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^9.1.11" + } + }, + "node_modules/@storybook/builder-vite": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-9.1.11.tgz", + "integrity": "sha1-cH6wNyOgO7KQQMoav7lygcCU5OY= sha512-P3ZTZIN14Z6s8Xd6R9XtZdKEFWsxFlJ6N2JEGY46Hw8mqLFbCj+xRAvQE2Vz79wHX8Q0UP7yls243Hx9PG9NYw==", + "dev": true, + "dependencies": { + "@storybook/csf-plugin": "9.1.11", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^9.1.11", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-9.1.11.tgz", + "integrity": "sha1-II6ODbsjJXB8FpuvY5BfZyHaXCs= sha512-3K8ZhGHyzrbhhhfWDmjatMZRxHdskw74fKPrI8JS4PXxJulXJJQDR7SQmpSjWAe+vc1oCAqfr4tLSZwi6Lmstg==", + "dev": true, + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^9.1.11" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha1-t5PTS5T1csHX2eD0T6xODbyVcu0= sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true + }, + "node_modules/@storybook/react": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/react/-/react-9.1.11.tgz", + "integrity": "sha1-a1JxtCWHD/FWia9rcHTH7w/n5I4= sha512-qiJSusHJ3A//RSaG1/7OdIXcT1IWBUpVxzZ3PetPky2XZdXQKJb9ACSYzUrfeOyyidl85stg6KjLSXuDeaA7Bg==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "9.1.11" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^9.1.11", + "typescript": ">= 4.9.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-9.1.11.tgz", + "integrity": "sha1-av2aNviimr7sl7cSxWl3/rVKhP4= sha512-f9coD3PK/Avhtmo77B1WFU6ARRYLeuS1QoSo132BUCESyB0ak9BdimOSpIzNAXEZQrHYkNw6Ln3+0FD3vqnPrA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^9.1.11" + } + }, + "node_modules/@storybook/react-vite": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-9.1.11.tgz", + "integrity": "sha1-cfQsam0xUv1A+QDQUsMJzNmA+OI= sha512-PwvCEA8WM3prQEoRFmDr7Do4s/9WTd7Ifuvw3XUrPmMJpfCubqgk0/hWzwlGl4I6STbt0nXAls4sCm3SVKnMqg==", + "dev": true, + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "0.6.1", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "9.1.11", + "@storybook/react": "9.1.11", + "find-up": "^7.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^9.1.11", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@storybook/react-vite/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha1-6N7BRV90942IitZb98oT3StOZvs= sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-vite/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha1-acsXeb2Qs1qx53Hh8viaICwqioo= sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-vite/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha1-kUr2VE7TK/pUZwsGHK/L0EmEtkQ= sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-vite/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha1-PamknUk0uQEIncozAvpl3FoFwE8= sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/react-vite/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha1-pqrZSJIAsh+rMeSc8JJ35RFvuec= sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@storybook/react-vite/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha1-73jhkDkTNEbSRL6sD9ahYy4tEHw= sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/react-vite/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha1-NtfEc593Wzy8KOYTbiGqBXrexBg= sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha1-QAH11d2H+hMwPjbuEG4/86friyI= sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha1-aRd/eTcjPKyjoa+wUZBmmPL1kYY= sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha1-wsSBBM/X3NVX83O3Clbp472uHUQ= sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha1-j7trLpH6JqxdSqJca25PIPnAric= sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha1-HVuh0oE2P8Dy8ppg1tk2+bvGV7A= sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha1-NeCN8wDqix1By49iMJwkGwNp5QE= sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha1-kKi2OZi2iLKE8lXGpSSKvVso11Q= sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha1-ATtL/KiHeXEfDtJznz9+/O/PT34= sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha1-DocRmuzfHEJIQLnUVltxN8q/ns4= sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha1-QRRvm0CxoQvq9cxPNhoWo8GIXog= sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo= sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha1-aVL9nOD0cOGt7Sk7eSonBfr0/9Q= sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha1-lpafBKJLWLF07kzZdMYEday9aSg= sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha1-sRW3uWe1ZPiaxY/q6JuIw97NDwA= sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha1-FvG1NG8QL4n9puxzOLlqcB2L4MI= sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/core": { + "version": "1.15.43", + "resolved": "https://registry.yarnpkg.com/@swc/core/-/core-1.15.43.tgz", + "integrity": "sha1-ZT5lc5aP1cdBY7mIXqCpMwEsnyI= sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.27" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.43", + "@swc/core-darwin-x64": "1.15.43", + "@swc/core-linux-arm-gnueabihf": "1.15.43", + "@swc/core-linux-arm64-gnu": "1.15.43", + "@swc/core-linux-arm64-musl": "1.15.43", + "@swc/core-linux-ppc64-gnu": "1.15.43", + "@swc/core-linux-s390x-gnu": "1.15.43", + "@swc/core-linux-x64-gnu": "1.15.43", + "@swc/core-linux-x64-musl": "1.15.43", + "@swc/core-win32-arm64-msvc": "1.15.43", + "@swc/core-win32-ia32-msvc": "1.15.43", + "@swc/core-win32-x64-msvc": "1.15.43" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.43", + "resolved": "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.43.tgz", + "integrity": "sha1-OGKU+EJ93i3xpw3QpYJtZ69w6ZY= sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.43.tgz", + "integrity": "sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.43.tgz", + "integrity": "sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.43.tgz", + "integrity": "sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.43.tgz", + "integrity": "sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.43.tgz", + "integrity": "sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.43.tgz", + "integrity": "sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.43.tgz", + "integrity": "sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.43.tgz", + "integrity": "sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.43.tgz", + "integrity": "sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.43.tgz", + "integrity": "sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.43", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.43.tgz", + "integrity": "sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha1-zHRjvQKUlhHGMpWW/M0rDseCsOk= sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.27", + "resolved": "https://registry.yarnpkg.com/@swc/types/-/types-0.1.27.tgz", + "integrity": "sha1-EggLDEJt6kUGNPIC2aPIKsOW55M= sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha1-LDjHR6VzHBoHF0/adkucKx+16Rs= sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha1-KXdyfY/I36B5ES2fTUwBkRDxcyw= sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader": { + "version": "2.5.2", + "resolved": "https://registry.yarnpkg.com/@teamsupercell/typings-for-css-modules-loader/-/typings-for-css-modules-loader-2.5.2.tgz", + "integrity": "sha1-sp3u5ev22sSGk6IDmjtota2CHB0= sha512-3sqH2B4itcm5XgV1IHENt4NOaW7bOC1CwJr63vrdKWWyKVxNxtBM+ABVhJZYFCCVAwNy7ulA64z6HyQqw96m4A==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "loader-utils": "^1.4.2", + "schema-utils": "^2.0.1" + }, + "optionalDependencies": { + "prettier": "*" + } + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha1-Y9mNYPIbMTt3xNbaGL+mnYDh1ZM= sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha1-KalX86Y5c4g+toTxD/09FR/sAaM= sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@teamsupercell/typings-for-css-modules-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@testing-library/dom": { + "version": "8.20.0", + "resolved": "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz", + "integrity": "sha1-kUqoYs7w9eibmMxI40RcTJIQEPY= sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha1-B0SWkK1Fd30ZJKwquy/IiV26g2s= sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha1-WnQp5gZus2ZNkR4z+w5F3o6whFM= sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha1-IYGHn96lGnpYUfs52SD6pj8B2I4= sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA= sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha1-dhOgThRt0pdtJN3wGXMNV6idVsI= sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha1-ajHjv1lRYVWTrZhOlrnl4tk4CWY= sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "resolved": "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", + "integrity": "sha1-CSS71bVeDAwFAtF1RletpmlHyhI= sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha1-E+CaMteotwYP44MEeI6/QZfNIUk= sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha1-Na3GIi42YvoiIs4SO5YUdqdGueo= sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha1-30kH/AeohpImN7FeAtTOvEwAIbI= sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha1-7j3vHyfZ7WbaxuRqKVz/sBUuBY0= sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha1-5DhjFihPALmENb9A9y91oJ2r9sE= sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha1-C5LcwMwcgfbzBqOB8o4xsaVlNuk= sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha1-MoZ0H7jx4VgKwoeErdTHodSb37w= sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha1-PfFfJ7qFMZyqB7oI0HIYibs5wBc= sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha1-+DbGH0ixNG59Kw2TxtrMW5U106s= sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8= sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha1-B9cT1szg0mXJhJ2wy+YtP2Hzb3Q= sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha1-rqIFnii3ZYY5CBNHrE+rPeFm5vA= sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/body-parser/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha1-bxTOoYGA/8RBa8D9Er4F/dc73Ws= sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha1-R2oWroSMd0eAedZ0kjb9uYg3uSw= sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==" + }, + "node_modules/@types/classnames": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.4.tgz", + "integrity": "sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==", + "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "classnames": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha1-W6fzvE+73q/43e2VLl/yzFP42Fg= sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha1-Zq2TMfY/6KPT2djG45Bt0Q9kRug= sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha1-RO6+QL5XR2ytagzWqFsPV9VBhaI= sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha1-luEdUSVrr1vbL6c6F9MCmT553wc= sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha1-phCq1aHnbDdb5j4Rxe7h7Z/S+0A= sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha1-z28FrS2Pqq1STp5vRUtP0GsgCTA= sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha1-ZZTaF43tbHw4QvPMCshLFW8S8tQ= sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha1-2KDk0S7BT30rtuWfP7waUnRX0LI= sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha1-AGt72Di67BURJwy5AL9Pw3e7v0E= sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha1-svqAurO86taGgHZulm9ZzWy5pp8= sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha1-VWLaPnsz14LCwfnmXF6RuwHugs8= sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha1-xRo1Bc7kJlNFS3SgD4cT3DVIw2I= sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha1-wpkm+LWW+dra7KBioypFNlaB6uA= sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha1-/h8zUkPgfJvVIMmnF1b+2DMMVLE= sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha1-LVC9K2lfcJeX4XRWRPa8Ej5uX1o= sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha1-GU8TF6SZ7dflh2b5ZzW9wCFruJ0= sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha1-U15fJL4TcilkxSNUMBvgm3UvXW4= sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha1-s6RGtUN/rt7bMKwyt8wEhlWaseI= sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha1-59F/pKWDCtVv4izjtPrIVBqVctw= sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha1-k546eErk+Asf3oCYuRrxd2/xMSs= sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha1-UgCj+nk9dzb6EEKF+hmw28JCS5M= sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha1-QzESoXjrffEjqrLOEcZ/Ucr+j/U= sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha1-XI1Cs2zUyAuS5WJqJS+ZTKa/yVM= sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha1-eleA6TTlK29jrZwksQXjPdWBArU= sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha1-EDEkd36M3shbILUf0zl8aC7h6VQ= sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha1-J81Tt2ctQFAl4kFNmFMteTTBbr0= sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha1-FcxJd1HawxGS16705nqNLGI1S5U= sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha1-4awPPp4ZUTU2H6Gh1i95XYfm6Bk= sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha1-7ntueY+N6y2WQGdfiBHQJTqqGUY= sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha1-4lBfHCHsCL2okVI445f7cdL8VM4= sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha1-1Kw30IcD+wOch/koUaWYundABAI= sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", + "integrity": "sha1-Bnqmpuy8daeLdTzG96f59+Tn0Rc= sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha1-oVXyFpCHGVNBDfS2tvUxh/BQCRc= sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha1-M0MRlx06BxIefrkbaEpgXn7qnL0= sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true + }, + "node_modules/@types/detect-port": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/@types/detect-port/-/detect-port-1.3.2.tgz", + "integrity": "sha1-jAapdeRygDuTHuc3QK7r0KLrJ64= sha512-xxgAGA2SAU4111QefXPSp5eGbDm/hW6zhvYl9IeEPZEry9F4d66QAHm5qpUXjb6IsevZV/7emAEx5MhP6O192g==", + "dev": true + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha1-2GpfRSoV4+MRO5njlhapuqD5hj8= sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true + }, + "node_modules/@types/dompurify": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-3.2.0.tgz", + "integrity": "sha1-VmEL8+QlDfV3RNYfvZVCLgffuEA= sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==", + "deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "dompurify": "*" + } + }, + "node_modules/@types/electron-store": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/@types/electron-store/-/electron-store-3.2.0.tgz", + "integrity": "sha1-f7ciQluN81YOurhnCesDhkgz6ec= sha512-ocZSu4ZgE38kdAQ0a+QiMB8ZW/BO8HzXFt1YImoHDqN/JgFAOhaO4nL5H++GRuONFPTDJZzR66QmTmZ52E/GEg==", + "deprecated": "This is a stub types definition. electron-store provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "electron-store": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha1-1Xla1zLOgXFfJ/ddqRMASlZ1FYQ= sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha1-MQi9XxiwzbJ3yGez3UScntcHmsU= sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha1-lYuRyZGxhnztMYvt6g4hXuBQcm4= sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz", + "integrity": "sha1-LXJLLJkNy4yERAY/NYCpA/bVAMw= sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha1-Gnf6/+6VctORJJMyWb4lI4N9fqo= sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-serve-static-core/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha1-nuNCpdExS7CSg3VCSi8WL5fDEMc= sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha1-bfv16hcUL3+aBDgJ8c1MRIy2gkk= sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha1-Kga8D2iiCrN7PjaqI4vmq99J6LQ= sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha1-HWs5mTuCzqateDlFsFCMJZA+Fao= sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz", + "integrity": "sha1-VliLF66PUMU5g6Uk/DzEdDeWnWQ= sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha1-MG46OnOChSLvoTQRWdpIRudXOmw= sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/html-entities": { + "version": "1.3.4", + "resolved": "https://registry.yarnpkg.com/@types/html-entities/-/html-entities-1.3.4.tgz", + "integrity": "sha1-g1JyX+xWWjIkYXR5+zHlX1eOGk0= sha512-Ut62LV90H9tgXwyhmfR8U6yCw/6xeo26IlsbAJJfqPomaqDN2zoLb2Z+cbmy5AycJFhwNJDdH0zqjQp7Ox/eXg==", + "deprecated": "This is a stub types definition. html-entities provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "html-entities": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha1-T8M6AMHQwWmHsaIM+S0gYUxVrDU= sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha1-frR3JsORtzRabsNa1/TeRpz1uk8= sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/ioredis": { + "version": "4.28.10", + "resolved": "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha1-QM6xV6QUEIjROUu4fJjtCadaBv8= sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ioredis/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/is-glob": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/@types/is-glob/-/is-glob-4.0.2.tgz", + "integrity": "sha1-wkPdDQnqwpkhMBQkGf8jCP/ZiL8= sha512-4j5G9Y5jljDSICQ1R2f/Rcyoj6DZmYGneny+p/cDkjep0rkqNg0W73Ty0bVjMUTZgLXHf8oiMjg1XC3CDwCz+g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc= sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha1-UwR2FK5y4Z/AQB2HLeOuK0zjUL8= sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha1-DwPj0vZw+9rFhuNLQzeDBwzBb1Q= sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha1-K5EJEvodaFbK3NDB+Vr33x1gSeU= sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha1-zYI4LE+QL+2WkaLteexoxYmK9MI= sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha1-B8FLwZvS+RjBkpVBzarK6JR0SAg= sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/jsdom/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha1-IBBippkBGajMGAI8/h/tEvwvyKc= sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "dev": true + }, + "node_modules/@types/json-dup-key-validator": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/@types/json-dup-key-validator/-/json-dup-key-validator-1.0.2.tgz", + "integrity": "sha1-MBILVz5sz6Dqxcmj8H04SAX6nc4= sha512-zJSAGITlz2nFT7xcKsvns8UifwSJpKuhgsdZj7+WoxiixiGnIefNiLK2uNhEICRkI9S2ccU6RYdqPS7iJRtU7Q==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE= sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4= sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha1-tx6296D/Eb/1n8mHE0oJMCklinY= sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha1-fM9y7dLxqn3TQ34YDGQ3NYWATdY= sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha1-aPaHcEPTdwkokP9bKYFSsKIWcb0= sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o= sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha1-MbfKZAcSij0rvCf+LSGzRTl/YZc= sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/node": { + "version": "14.14.10", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz", + "integrity": "sha1-WVioLkGGPPxx8jB7N0jjSRugN4U= sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE= sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha1-5Dko8L2hCxabb37PmePd+Da46+Q= sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==" + }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha1-w1de+BJeF2w0X6DnswHB20EXDBU= sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", + "dev": true + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha1-57Wuu6wVD4tf3UpG5/C9jmXhkQk= sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha1-ocOAmwrWHGLKxtTgxW1hDJELdlQ= sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha1-XxnSuFqY6VWANvajysyIGUIPBc8= sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss= sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw= sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.1", + "resolved": "https://registry.yarnpkg.com/@types/react/-/react-18.2.1.tgz", + "integrity": "sha1-N/fUvkorT2HWGOTKEmgayrnljCA= sha512-KbNvY50AOVy1HBHbQc+iPK44HMaz6CRXuUFsu/L8yCP+nsuE1c1EQSdyaHhsPiI7gJQ3c3VRp+YuCL/5hzvcRw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha1-vOxy2nGcGMDYtKfLAOf7RDIR1tc= sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.1", + "resolved": "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.1.tgz", + "integrity": "sha1-ZjsmEv619kMacCB0MNfASIG4fyk= sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha1-ajNSEuf84eGk2lauIJXIxcNfv+Y= sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha1-3oQWMSBbJPnftJZ91KeQHgSPmog= sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz", + "integrity": "sha1-wI9DBoJsSbXp3JAd7gRS6o/OYZc= sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha1-iOzKoSKoJAXvPvvKql3N2fAhOHw= sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha1-6da0pm/NvWUaXxBsJlajAIjMHoM= sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-UKRWeBIrECaKhE4O//TSFhlgwntMwyiEIOA7WZoVkr52Jahv0dH6YIOorqc358N2V3oKFclsq5XxPmx2PiYB5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha1-sxh9rh38TBWIDJz8W0XycZ6m69Q= sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha1-KF/MXOpwPu942Q9JnhRX6bXAL8E= sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window-infinite-loader": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/@types/react-window-infinite-loader/-/react-window-infinite-loader-1.0.6.tgz", + "integrity": "sha1-17I7Svqh4OIFCHa3ZsPqGfdI9Uk= sha512-V8g8sBDLVeJJAfEENJS7VXZK+DRJ+jzPNtk8jpj2G+obhf+iqGNUDGwNWCbBhLiD+KpHhf3kWQlKBRi0tAeU4Q==", + "dev": true, + "dependencies": { + "@types/react": "*", + "@types/react-window": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha1-LUISjVn3j4TSx5n/xatcrby6LYI= sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha1-KUqq3ySsZYC4+9H+Ore1n+hfnvM= sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==" + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha1-5uYNrSnCyMIGwCbm3Y1tG92oULg= sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha1-zvCePsmvHWPSpsxbODpzfiTm3PU= sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/segment-analytics": { + "version": "0.0.34", + "resolved": "https://registry.yarnpkg.com/@types/segment-analytics/-/segment-analytics-0.0.34.tgz", + "integrity": "sha1-6I/VKG4n7vr7wbmMjH4UO5qrX7U= sha512-fiOyEgyqJY2Mv9k72WG4XoY4fVE31byiSUrEFcNh+MgHcH3HuJmoz2J7ktO3YizBrN6/RuaH1tY5J/5I5BJHJQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha1-POOvGlUk7zJ9Lank/YttlcjXBSg= sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz", + "integrity": "sha1-7UkyuKKoBfH+Nipw9OYtCsmU4wE= sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha1-1KRHUD6tDRZxEy0atr1YuAXY3mo= sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha1-YgkyHrLBcSp+dGZCK4yx/A2d1dg= sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha1-ZnSDFcyaltY0A7qoZxssEk+GM6o= sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true + }, + "node_modules/@types/styled-components": { + "version": "5.1.34", + "resolved": "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.34.tgz", + "integrity": "sha1-QQffjvin6rpPprBfePk/uk2vAwA= sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/superagent": { + "version": "4.1.17", + "resolved": "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.17.tgz", + "integrity": "sha1-yPAWK12KnFLTi4E5jvBlDvl0tFI= sha512-FFK/rRjNy24U6J1BvQkaNWu2ohOIF/kxRQXRsbT141YQODcOcZjzlcc4DGdI2SkTa0rhmF+X14zu6ICjCGIg+w==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/superagent/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha1-3bSgVoWXyarf+NvsWy6P3b6Gkvw= sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/text-encoding": { + "version": "0.0.40", + "resolved": "https://registry.yarnpkg.com/@types/text-encoding/-/text-encoding-0.0.40.tgz", + "integrity": "sha1-Op1uwq5ml/zuiWXeQwTZUTwNu08= sha512-dHzoIdwBfY7jcSTTt6XBkaeiuFQAQD7r/7aJySKDdHkYBCDOvs9jPVt4NYXuwBMn89PP6gSd29WubIS19wTiXg==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha1-Yoa0xyKNWKt4ZtGXFvNpbgOgk5c= sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha1-usywepcLkXB986PoumiWxX6tLRE= sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha1-rKqw+RnOaczmKcLU7S60rcG2wgw= sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha1-YL6NIbqrjDBRMuucuRLtSXhSqtw= sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha1-aQ5Grw/fwfn6rgDNBJzIiJV5J9U= sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "deprecated": "This is a stub types definition. vfile-message provides its own type definitions, so you do not need this installed.", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.18.4", + "resolved": "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.4.tgz", + "integrity": "sha1-YoebCpxlP5sRctQDuILyBF7M4DI= sha512-I6e+9+HtWADAWeeJWDFQtdk4EVSAbj6Rtz4q8fJ7mSr1M0jzlFcs8/HZ+Xb5SHzVm1dxH7aUiI+A8kA8Gcrm0A==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha1-BwE+RqpNfX1QpJ4VYEwcU0DU6yQ= sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha1-gV4wt4bS6PDc2F/VvPXhoE0AjxU= sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha1-sW088+52v1cv31EeecJIvexhnqM= sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha1-vKAc3nf5X8ao1bDby/s9bKS+RR8= sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha1-g5KNDxt/SvqXQJjGS1zm+QUflqA= sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha1-B74Obyf6kKF9jl9plu4CMpyajC4= sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha1-TFR5U47BC1UIuOmC4XKRHJh0Rtg= sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha1-ySjnqfwsCz7ZKrMRLGFNa9mVHIM= sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha1-JEBYiFYBdcbCCcOd8RrAai7++dc= sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha1-IWX/ruALH7vdLUCqhSMtq2mY9Ts= sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha1-vKAc3nf5X8ao1bDby/s9bKS+RR8= sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha1-uQpXzN6nF5f//6AyHnRPN57IOMk= sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha1-tYaNSGxRzo8xIwm6eb258zGzeTE= sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha1-BWRim2Ek1nYHN40PAzKgSVsl59c= sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha1-0Gu7OE689sUF/eHD0O1N3/4Kr/g= sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "deprecated": "Potential CWE-502 - Update to 1.3.1 or higher" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha1-ZHr057t1rTrdV452KtmEuQ9KJLk= sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha1-3JzRNjuvN4DzrT4KEqRqP/4MdSY= sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha1-t+V5w2V/I9BOzL5K0uWKjtUeflM= sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha1-g2ISTNgRpe4RxXaCB7nfU9NPJDM= sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha1-RHHE771i2w1PogPmXMawWKhcq9M= sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha1-Z8PlSexAKkh7T8GT0ZU6UkdSNA0= sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha1-PBAveegrIEomx6WSG/R9U0kZ07Q= sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha1-zBjyb0Dz8CjaZiAEaIH05FGMJZk= sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha1-wIE7xC2ZUn+4xbE4x6iFFrykb+o= sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha1-qfagfysDyVyNOMRTah/ftSH/VbY= sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha1-/Moe7dscxOe27tT8eVbWgTshufs= sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha1-4KFhUiSLw42u523X4h8Vxe86sec= sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha1-giqbxgMWZTH31d+E5ntb+ZtyuWs= sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha1-29kyVI5xGfS4p4d/1ajSDmNJCy0= sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha1-5VYQh1j0SKroTIUOWTzhig6zHgs= sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha1-lindqcRDDqtUtZEFPW3G87oFA0g= sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha1-HF6qzh1gatosf9cEXqk1bFnuDbo= sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha1-V8XD3rAQXQLOJfo/109OvJ/Qu7A= sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha1-kXog6T9xrVYClmwtaFrgxsIfYPE= sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha1-rGaJ9QIhm1kZjd7ELc1JaxAE1Zc= sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha1-mR5/DAkMsLtiu6yIIHbj0hnalXA= sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha1-5vce18yuRngcIGAX08FMUO+oEGs= sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha1-s+E/GJNgXKeLUsaOVM9qhl+Qufs= sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha1-O7PpY4qK5f2vlhDnoGtNn5qm/gc= sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha1-Oy+FLpHaxuO4X7KjFPuL70bZRkY= sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha1-zD+/Iu/riP9iMQz4hcWwn0SuD90= sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha1-Ml20I5XNSf5sFAV/mpAOQn34gQ4= sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha1-53qX+9NFt22DJF7c0X05OxtB+zE= sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz", + "integrity": "sha1-QbgPLIcdGWhiFrgjCSMc/Tyz0pE= sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha1-TOecib5Ar+ev6POtuQKh8c6awIo= sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha1-Db8FxE+nyUMykUwCBm1b7/YsQMM= sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha1-FuuFC6maBWy3y/6HL/uJcuGMi9c= sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc= sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha1-dBIQ8uJCZFRQiFOi9E0KuDt/acE= sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha1-48121MVI7oldPD/Y3B9sW5Ay56g= sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha1-bmaUAGWet0lzu/LjMycYCgmWtSA= sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0= sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha1-afvE1sy+OD+XNpNK40w/gpDxv0E= sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc= sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4= sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/app-builder-lib": { + "version": "26.15.7", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.7.tgz", + "integrity": "sha512-C7APoYISPExUmrEntNhDpz9Tccb4uWuEDfLaC0WPPc7/pwzz0WZGznCz/ycPfkkzw6tKOalceD8g6TgHmVz1QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.7", + "electron-builder-squirrel-windows": "26.15.7" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk= sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg= sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha1-k/gaQ0gOM6M48ZFjo9EKUMAdzVk= sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha1-OE0So3KVrsN2mrAirTI6GKUcz4s= sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha1-HwzKoI6Qzbw+tDMhD5A60PF8Pzo= sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0= sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha1-Pk+8swoVp/W/ZM8vquItE5wuSQQ= sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha1-z6EGXIHctk40VXybgdAS9qQhxWQ= sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha1-U0qvnm6N15+2uamRf4Oe8exjr+U= sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha1-cSzHkq5wNwrkBYYmRinjOqtd04s= sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha1-/pVGeP9TA05xfqM1KgPwsLhvf/w= sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha1-nXYNhNvdBtDL+SyISWFaGnqzGDw= sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz", + "integrity": "sha1-bZKiONBdwC50J8iB+4voHIRIst0= sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha1-9kGhlrM1aQsQcL8AtudZP+wZC/c= sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-metadata-inferer": { + "version": "0.8.1", + "resolved": "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz", + "integrity": "sha1-hQgb8wMIrNTDX7hpRli0xfbz7mA= sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==", + "dev": true, + "dependencies": { + "@mdn/browser-compat-data": "^5.6.19" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha1-ep2hYXyQgbwSH6r+kXEbTIu4HaI= sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha1-CoXhySaVdprBOkKLtlPnU4vqJ9Y= sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE= sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz", + "integrity": "sha1-LSLgD4zd61/eXdM1IrVtHPVpqBw= sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha1-UJyfymDq+FA0xoKYOBiOTkyP+ys= sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI= sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha1-wHoEWEMuptvJo1Bv/6QktIvMqv4= sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha1-ZGYTgJZgEQdJ6S8sEIM7cJaNkps= sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha1-pcw3XWoDwu/IelU/PgsVIt7xSEY= sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha1-FvdNZILjQ/8mPU9FA4KenukahrY= sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c= sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY= sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha1-KHaMdtDjz/IbxiqeLQtqwwBCoe4= sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha1-9DaZGSJbaExWCFmYrGPb0FvgINU= sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha1-+ojsWSMv2bTjbbvFQKjsmptH2nM= sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha1-0QyIhcISVXThwjHKyt+VVnXhzj0= sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4= sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha1-qtvpQ0ZBgqiSLDySfDBn/0DSRiY= sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha1-mh83x/Mu+Se0sAi1Kf60osgrEJI= sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-styled-components/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/babel-plugin-transform-vite-meta-env": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/babel-plugin-transform-vite-meta-env/-/babel-plugin-transform-vite-meta-env-1.0.3.tgz", + "integrity": "sha1-y/gb7MlbcdzBcO5IY8t/aRntmbs= sha512-eyfuDEXrMu667TQpmctHeTlJrZA6jXYHyEJFjcM0yEa60LS/LXlOg2PBbMb8DVS+V9CnTj/j9itdlDVMcY2zEg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.9", + "@types/babel__core": "^7.1.12" + } + }, + "node_modules/babel-plugin-transform-vite-meta-glob": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/babel-plugin-transform-vite-meta-glob/-/babel-plugin-transform-vite-meta-glob-1.1.2.tgz", + "integrity": "sha1-a8zXtpX0RdjHOl3Uf6UMhbpTlfM= sha512-o984FUo++WYnfgUaC8ymzmNPng5Kda5A6j6PFC0uOqhFXlAsD6mNhEBhaNzbUGfq/aPcyeGo67fYXlg20rh9aA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.9", + "@types/babel__core": "^7.1.12", + "glob": "^10.3.10" + } + }, + "node_modules/babel-plugin-transform-vite-meta-glob/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-transform-vite-meta-glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-transform-vite-meta-glob/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI= sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-transform-vite-meta-hot": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/babel-plugin-transform-vite-meta-hot/-/babel-plugin-transform-vite-meta-hot-1.0.0.tgz", + "integrity": "sha1-2AbeCx+YJus/4MToKZaXPYGIld8= sha512-qF7T46bDG5UPPOfy4MFgQJyd3mZvm1sGOR2gZ4lIHy6DEcxAVTIt39/adAn89il44CvwestshuEybKPMR+L/Tg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.9", + "@types/babel__core": "^7.1.12" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha1-mpKer+zkGWEu9K5PYLGGLrrY7zA= sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha1-+gX6UQ59STiW17DdIDNgHIQPFxw= sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-vite": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/babel-preset-vite/-/babel-preset-vite-1.1.3.tgz", + "integrity": "sha1-nLxoX+BNUs05VtCV5mTtHhJiNk8= sha512-xSt/EiezzeMd4RI2hjMCNyn/FGzGeroKODPMAUTsgpeHC4dFf2qiCQfyNuiNzn1OwoF4n+NYSsORhUN5G/2KTA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.9", + "@types/babel__core": "^7.1.12", + "babel-plugin-transform-vite-meta-env": "1.0.3", + "babel-plugin-transform-vite-meta-glob": "1.1.2", + "babel-plugin-transform-vite-meta-hot": "1.0.0" + } + }, + "node_modules/backslash": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/backslash/-/backslash-0.2.0.tgz", + "integrity": "sha1-bDwfzn5+cUzPwQ/XTw9zQQZ3N18= sha512-Avs+8FUZ1HF/VFP4YWwHQZSGzRPm37ukU1JQYQWijuHhtXdOuAzcZ8PcAzfIw898a8PyBzdn+RtnKA6MzW0X2A==" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz", + "integrity": "sha1-0m9c2P5db4MqMVF7n3w1YEC6bV0= sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", + "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha1-+W813qr480FEpBAmUbq88A0diBc= sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dev": true, + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha1-xN99xJa9hJ1MlGQ0TBqnQii02sY= sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg= sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==" + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k= sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli-dec-wasm": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/brotli-dec-wasm/-/brotli-dec-wasm-2.3.2.tgz", + "integrity": "sha512-5H+k8eVLIJY6B4olN2HP9QzJAxcplf0jV7mWnkpxvOSeUE9Npg3dQ2pgLn30a9MUFHNro1iSmtdu6VNdlb+TIw==", + "license": "MIT OR Apache-2.0" + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha1-6302UwenLPl0zGzadraDVK0za9g= sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz", + "integrity": "sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY= sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha1-MyLNMH2Cltqx9gRhhZOyYaP63o8= sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha1-yuYoEriYAellYzbkYiPgMDhr57Y= sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU= sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz", + "integrity": "sha1-gE4eb1Bu42PLDjzLsJytXdmHCVk= sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha1-BzapZg9TfjOIgm9EDV7EX3ROqkw= sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY= sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio= sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo= sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha1-ibfhaIQFYzGjXWta0GQzLJHapsM= sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha1-JGaH3rtgFHNRMb6KurLZOJj40EM= sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz", + "integrity": "sha1-3T2pVeJwkWpL0/Yl9LkZmWrafgY= sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE= sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8= sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs= sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha1-HxrblAyXGksiujndymthjcblays= sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha1-lLwYRdznClu50uzHSHJWYSk9j8E= sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA= sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha1-AF1mTyy9SWGIjS4sMsWmnlnY7sQ= sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha1-h+uHauce44j6BHH+Qj9JS+HZbMw= sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha1-lJwSapI4qAeSvpoCZZNPCYrzaaU= sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha1-mFXmTs0kCpzEJnzopKpdJKHaFeQ= sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha1-3/whTtDBH6ju/KLDZlHY5Xy/srA= sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha1-QnmmICinsfJi80c/yWBfXiGMWbQ= sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha1-cOzH1NQRSSH10pg0n/hqMamXUiQ= sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha1-JKSDHs9aawHd6zL7caSyCIsNzjg= sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha1-HxH21IxOW8aEn8tO+g3Jj55ymeo= sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha1-w54ovwXtzeW+O5iZKiLe7Vork8c= sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha1-QtqsQdPCVO84rYrAN2chMBc2kcU= sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo= sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha1-DdxKIKVJtZyTpBFrsm9SlMoX3BI= sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha1-5jYpwAFmZXkgYNu+t5xCI50sUoc= sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha1-wLKbzTO80HeaE0TCE2BR5q/T2ek= sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-alpha": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/color-alpha/-/color-alpha-2.0.0.tgz", + "integrity": "sha1-/69mYQIqLLfvVmwiT1f8PWU0rmQ= sha512-AFicJNV27HMw2l3KZPngmoL9euIe+7YDVprQHuJbChyh1x/R4AjKdL9WKvfE5/nXIok+WfYhm+I6GsXaFgB7Xg==", + "dependencies": { + "color-parse": "^2.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-parse": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/color-parse/-/color-parse-2.0.2.tgz", + "integrity": "sha1-N7RpMEJJJAYJiO3yWyTm/7Sh3D8= sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", + "dependencies": { + "color-name": "^2.0.0" + } + }, + "node_modules/color-parse/node_modules/color-name": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-2.0.0.tgz", + "integrity": "sha1-A/9rG1rsm7PPHtgkAMJ5DfzQHS0= sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha1-nreT5oMwZ/cjWQL807CZF6AAqVo= sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha1-YyuAthF4Z6FY8QgK1Jiy++fj9eo= sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc= sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha1-fQB6fgfFjEtNX0MxMaGRQbKfEeA= sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", + "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz", + "integrity": "sha1-g451e+lj8aI4bf4Eipj49p97VdY= sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha1-rkDptXzdORVAiigF69OlWFYI3IE= sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/connection-string": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/connection-string/-/connection-string-4.4.0.tgz", + "integrity": "sha512-D4xsUjSoE8m/B5yMOvCIHY+2ME6FIZhCq0NzBBT57Q8BuL7ArFhBK04osOfReoW4KFr5ztzFwWRdmnv9rCvu2w==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/construct-style-sheets-polyfill": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/construct-style-sheets-polyfill/-/construct-style-sheets-polyfill-3.1.0.tgz", + "integrity": "sha1-xJCr1579s1n6+mLsFOpVIyvg7s8= sha512-HBLKP0chz8BAY6rBdzda11c3wAZeCZ+kIG4weVC2NM3AXzxx09nhe8t0SQNdloAvg5GLuHwq/0SPOOSPvtCcKw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co= sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha1-O7m9/II2nbnC9pyTycPOsxDIizw= sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha1-7macH+os9C3DFYVGnRk/7w1ldxs= sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha1-0tz/YKqtEBXwnQtm5/Dxxc08XaU= sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08= sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34= sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.7" + }, + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.41.0", + "resolved": "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha1-NJ/srRaNYIB6Meg8mdc9eG/oCBE= sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha1-Bgorhx1m26bIU46hEYuhrBb1+uM= sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha1-o1XFs8seGvAroXf+ev1/7uSaUyA= sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM= sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha1-hlJkspZ33AFbqEGJGJZd0jL8VM8= sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8= sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha1-WZUdO4H9ayB0pi1JREQVsNK018E= sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha1-bewclSO8SmQ+CIqrjwnmelSWECQ= sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha1-m58RHt9vsr5dxiUlZEy8nCMgZK4= sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-8.0.0.tgz", + "integrity": "sha1-6OiB3RcexYbSIpEkF3NJyMo7Y8M= sha512-9bEpzHs8gEq6/cbEj418jXL/YWjBUD2YTLLk905Npt2JODqnRITin0+So5Vx4Dp5vyi2Lpt9pp2QHzQ7fdxNrw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "cssnano": "^7.0.4", + "jest-worker": "^30.0.5", + "postcss": "^8.4.40", + "schema-utils": "^4.2.0", + "serialize-javascript": "^7.0.3" + }, + "engines": { + "node": ">= 20.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha1-e99p/Fo2ilq9tJ/ZEDbFUiWEZHM= sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.yarnpkg.com/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha1-ytqADTI8t0lFwkrHRhX9sxKmyF8= sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha1-TxNpI08uz2k4ZkdsOy4bVNKp1o4= sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY= sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha1-fVTv+fVLRbYkAcJgMmlutZyL0Yw= sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.yarnpkg.com/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha1-laT7rPLawg52ji8XRLcFGfK6eYA= sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha1-rk3B8dk9DLoUFWJPztrsQOp2TxQ= sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha1-WxhQkS+jHfkHFpY9RdkSH9/An0Y= sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha1-uOvWVUw2N8zHZoiAStP2pv2uqKY= sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha1-5BuALh7t+fbK4YPOXmIteJ19jlM= sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha1-zDhff3UfHR/GUMITdIBCVFOMfTE= sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha1-xH9VEnjT3EsLGrjLtC11Gm8Ngk4= sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha1-zdgJn3ECThSeT2/hen1G7NVfHjI= sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha1-ECZM4eVELoVy/IL75JBkT/VLXCA= sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha1-+17/z3bx3eosgb36pN5E55uscPQ= sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.1.7", + "resolved": "https://registry.yarnpkg.com/cssnano/-/cssnano-7.1.7.tgz", + "integrity": "sha1-FSZY7J0k8ICFHDAQ5hZz1Tl2Wvc= sha512-N5LGn/OlhMxDTvKACwUPMzT34SSj1b022pvUAE/Vh6r2WD1aUCbc+QNIP/JjX9VVxebdJWZQ3352Lt4oF7dQ/g==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^7.0.15", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.15", + "resolved": "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.15.tgz", + "integrity": "sha1-RkUBzJCN6KnBi4pZrzaiHh2VVwU= sha512-60kx7lJ40//HA85cIfQXSOJFby2D2V1pOMNHVCxue3KFWCjRzmiQyL9OvI+NAhwUlaojOfF9eK3nGvrJLCBUfQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.2", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.9", + "postcss-convert-values": "^7.0.11", + "postcss-discard-comments": "^7.0.7", + "postcss-discard-duplicates": "^7.0.3", + "postcss-discard-empty": "^7.0.2", + "postcss-discard-overridden": "^7.0.2", + "postcss-merge-longhand": "^7.0.6", + "postcss-merge-rules": "^7.0.10", + "postcss-minify-font-values": "^7.0.2", + "postcss-minify-gradients": "^7.0.4", + "postcss-minify-params": "^7.0.8", + "postcss-minify-selectors": "^7.1.0", + "postcss-normalize-charset": "^7.0.2", + "postcss-normalize-display-values": "^7.0.2", + "postcss-normalize-positions": "^7.0.3", + "postcss-normalize-repeat-style": "^7.0.3", + "postcss-normalize-string": "^7.0.2", + "postcss-normalize-timing-functions": "^7.0.2", + "postcss-normalize-unicode": "^7.0.8", + "postcss-normalize-url": "^7.0.2", + "postcss-normalize-whitespace": "^7.0.2", + "postcss-ordered-values": "^7.0.3", + "postcss-reduce-initial": "^7.0.8", + "postcss-reduce-transforms": "^7.0.2", + "postcss-svgo": "^7.1.2", + "postcss-unique-selectors": "^7.0.6" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.2", + "resolved": "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.2.tgz", + "integrity": "sha1-kpOe2jj7k0FRqMh71gdk0aJ8VZc= sha512-kt41WLK7FLKfePzPi645Y+/NtW/nNM7Su6nlNUfJyRNW3JcuU3JU7+cWJc+JexTeZ8dRBvFufefdG2XpXkIo0A==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz", + "integrity": "sha1-+bf+bMasC32QeBuxbV6YdDA+LKY= sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha1-NhFdOC1gr9Jx43f5xfZ9Ar1IwDI= sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha1-XsSOe+8SBlRTkGnhrk3cgcpJDro= sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha1-0lT6ks2Lb72DgRufuu00ZjzBfDY= sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha1-/2ZaDdvcMYZLCWR/NBY0Q9kLCFI= sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o= sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha1-HUv51XLxHBQDHwQ24cELwfVx9Qs= sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/csv-parser": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/csv-parser/-/csv-parser-3.2.1.tgz", + "integrity": "sha1-rz729ZGn7b2Z6S4P6X8yXYNwG3s= sha512-v8RPMSglouR9od735SnwSxLBbCJqEPSbgm1R5qfr8yIiMUCEFjox56kRZid0SvgHJEkxeIEu3+a9QS3YRh7CuA==", + "dev": true, + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/csv-stringify": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.8.3.tgz", + "integrity": "sha512-gIeSCvq5F4VtXV3naV3VAewLhBkiZBz+PPhTOA8H3Y8h/ELa+R1ml0GZck/4/Nzo9ep2lvOluilJ6MJlbZsKMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.3", + "resolved": "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha1-OfH0lU5KCf9prFl8LWGQawToR0A= sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha1-xCpKE+gTHWN7dF/Clzgkz+r5MyI= sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha1-b3Z8Ttjct53n7ePhwPieY+9k0xw= sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha1-0VbWH0hfzoMn5qvzOctB2Mu6aWY= sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha1-OVsoM9+scVB/EqwvevI7+BneJOI= sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha1-u5IGO8jFZjrLJCL5nHPLtsauO8w= sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha1-mBaQOHM6ClurvtpVBU95W7nkpYs= sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha1-X8dShOnCN1w2yDlBGgz1UMv8TV4= sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha1-mUqunNI8cZ9TteEOOgphCMaWB7o= sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha1-xjr5ePTWoNCEpSpnOSK+IWB4m3M= sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha1-llisOKIUDVnTRhYPH2ww/aC9EvQ= sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha1-gxQb/5hWoO21443onNz+Y9CmCiI= sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha1-Piuhph5wiI/j2RlOMNbRTuzhVcQ= sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha1-kmDiOijqXLEJ6TshoG4k4uvVVkE= sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha1-dP1U4fTOvVGFrCA5IXqY05sKTA4= sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha1-sBzULB7tPUbbd6WWbPcm+MCRYMY= sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha1-PEeqWzLFs9+1bvP9Q0IHimMrQA0= sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha1-It+TkDL7WnGuixgA1h3beFHEJSY= sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha1-C0XT3RxIopyOBX5hNWk+yAvxY5g= sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha1-bco+i+Kzk8mp1RTau9gKkt7vGk8= sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha1-1JJjeNMz2cC/0eb6AZTTCuuqIPQ= sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha1-grOOjo/3CAdk+Nzsd71L45Nok5Y= sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha1-FbTOuMorsNy20aZB7gPVnDtiN2o= sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha1-wlM4IH76csxbm9FFihpBkB8eGzE= sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha1-oag5y9m6RfKGdMadf4Vbz5HfxqU= sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha1-kxDbVumS48AXXh7zheVF5Iqbtcc= sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha1-erUlelBB0R7LT+cKXH0WoZW7QIo= sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha1-YoTSonCChbGrt+IB7aQ4CvNeY7A= sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha1-aGn93hRIhoB3/dWYkgDLYbKhZF8= sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha1-0T9BZccyF//qpUKVzWlps+eu6PM= sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha1-tD0obMvTa8Wy9+1ByvLQq6H4puc= sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha1-2P6ysogeak9YwuCKz9Dig04mIi4= sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha1-nPJKR3riK871zV9vC/vB0tO+kUM= sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha1-IRoDupXsr3eYqMcZjXlTYhH4hXA= sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha1-noD3ylJFPOPpPSWjUxh2fqdwRzU= sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha1-BoMH+bcat2274QKROJ4CCFZgYZE= sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha1-8gyk/pT4t1SVGyQkBnboYYwCBr8= sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha1-ZH3FbTisM6Pje2Xp1cTNpa9eWOY= sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha1-OIgdj0FmpcWEgCDBGCe4NLyz4KU= sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha1-7XbSBtilDmDeDdZtSU2Cg1/+Ycc= sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha1-ZXVRRbvz42lUuUnBZFBCdFHVynQ= sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo= sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha1-EEQJKITSRdG39lcl+krUxveBzCM= sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha1-2quslpCHTDlMgeQWKgMEs12CTw4= sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha1-LQnC5yzZUjB2zLIRV9/2atQ/zCI= sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha1-ma7hnrm65VpnMncXtuhI0L93flo= sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha1-S3VtjXcKklcwCCXVKiws/5nDo0E= sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha1-bffvA1rWoMqkRHnFNu17AlcPRZU= sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo= sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha1-iU3BQbt9MGCuQ2b2oBB+aPvkjF4= sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8= sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha1-EHgcxhbrlRqAoDS6/Kpzd/avK2w= sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha1-YPBSsovZHJtFZoUOv3dW7+gh2Bs= sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha1-JkQhTxmX057Q7g7OcjNUkKesZ74= sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE= sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha1-FjrN9kMzDKoLTNfCHn7ndV1vpJM= sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha1-TbfCyk3G4Og0wwvnDJS7yXbccBg= sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha1-dRI1JgRpCEwTIVffqFfzhtTDPYE= sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0= sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha1-q7WE1fEM0Rlt/FWqA3AVkq4/ezc= sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha1-Ter4lNEUB8Ue/IQYAS+ecLhOqSE= sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dmg-builder": { + "version": "26.15.7", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.7.tgz", + "integrity": "sha512-rfo1YyAWO0L3cZLKCqKQiLYbW6ZXebRUfK0kWp4oXxO7dDFLrf7alRkWImNuXvZVQhs6Idzy++cwOk8I+xPDhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.7", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha1-mT6SXMHXPyxmLn113VpURSWaj9g= sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha1-2UAFNrK/giWtmP4FLgKUUaxA6QI= sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha1-3l1Bsa6ikCFdxFptrorc8dMuLTA= sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha1-XEXo6GmVJiYzHXqrMm0B2vZdWJ0= sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha1-StG+VsytyG/HbQMzU5magDfQNnM= sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha1-jXkgM0FvWdaLwDpap7AYwcqJJ5w= sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", + "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E= sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha1-/CazzxQrnlm3Tb057WbOYgxoEIM= sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha1-dz8OaVJ6gxXHKF1e5zxEWdIKgCA= sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo= sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY= sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s= sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8= sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha1-aauDWLFOiW+AzDnmIIe4hQDDrDs= sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "43.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-43.3.0.tgz", + "integrity": "sha512-nLlvu0WFjftWsSaTkV2B/c4NDuJBspTyXu8vKSQ6vLvFt8uG3NgN49LLKcXddwX0GqVvAQDhciWp+4xOdTdhew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.15.7", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.7.tgz", + "integrity": "sha512-DBpaNzxsPs1BvEblzFoNriSbzsBqDCy/gseIngeEhYzQG1IxfB7Hvc2tBBVmpWE2BTQGP9J1RrAvDT+Vc/uAxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.7", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.7", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-notarize": { + "version": "1.5.2", + "resolved": "https://registry.yarnpkg.com/electron-builder-notarize/-/electron-builder-notarize-1.5.2.tgz", + "integrity": "sha1-VAGFtXozb8buwBv+CSo7R2RFklU= sha512-vo6RGgIFYxMk2yp59N4NsvmAYfB7ncYi6gV9Fcq2TVKxEn2tPXrSjIKB2e/pu+5iXIY6BHNZNXa75F3DHgOOLA==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0", + "electron-notarize": "^1.1.1", + "js-yaml": "^3.14.0", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "electron-builder": ">= 20.44.4" + } + }, + "node_modules/electron-builder-notarize/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/electron-builder-notarize/node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s= sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-builder-notarize/node_modules/js-yaml": { + "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": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/electron-builder/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha1-fVTv+fVLRbYkAcJgMmlutZyL0Yw= sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-context-menu": { + "version": "3.6.1", + "resolved": "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-3.6.1.tgz", + "integrity": "sha1-QvEX4VMJaHsiKD5vj3oNlaGa/oQ= sha512-lcpO6tzzKUROeirhzBjdBWNqayEThmdW+2I2s6H6QMrwqTVyT3EK47jW3Nxm60KTxl5/bWfEoIruoUNn57/QkQ==", + "dependencies": { + "cli-truncate": "^2.1.0", + "electron-dl": "^3.2.1", + "electron-is-dev": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-context-menu/node_modules/electron-is-dev": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz", + "integrity": "sha1-gzSHoGm42tIUJcZ6GYR9kGSrGb0= sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-debug": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/electron-debug/-/electron-debug-3.2.0.tgz", + "integrity": "sha1-RqFbVVw7EYciGMZeoB0FiqCBSSA= sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", + "dev": true, + "dependencies": { + "electron-is-dev": "^1.1.0", + "electron-localshortcut": "^3.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-devtools-installer": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.1.tgz", + "integrity": "sha512-FaCi+oDCOBTw0gJUsuw5dXW32b2Ekh5jO8lI1NRCQigo3azh2VogsIi0eelMVrP1+LkN/bewyH3Xoo1USjO0eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "tslib": "^2.1.0", + "unzip-crx-3": "^0.2.0" + } + }, + "node_modules/electron-dl": { + "version": "3.5.0", + "resolved": "https://registry.yarnpkg.com/electron-dl/-/electron-dl-3.5.0.tgz", + "integrity": "sha1-eoC/E/Fo9+UgR3Tu6J28fIbelXs= sha512-Oj+VSuScVx8hEKM2HEvTQswTX6G3MLh7UoAz/oZuvKyNDfudNi1zY6PK/UnFoK1nCl9DF6k+3PFwElKbtZlDig==", + "dependencies": { + "ext-name": "^5.0.0", + "pupa": "^2.0.1", + "unused-filename": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns= sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==", + "dev": true + }, + "node_modules/electron-is-dev": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha1-LlzqChs8zxyG9XfO53Nj71XesF4= sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==", + "dev": true + }, + "node_modules/electron-localshortcut": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", + "integrity": "sha1-z8g6Pv9eKPr5jdzIf4Cizk9iPNM= sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", + "dev": true, + "dependencies": { + "debug": "^4.0.1", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", + "keyboardevents-areequal": "^0.2.1" + } + }, + "node_modules/electron-log": { + "version": "4.4.8", + "resolved": "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.8.tgz", + "integrity": "sha1-/Ln3FNvK77aseYTEaDkSx0cwJIo= sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==" + }, + "node_modules/electron-notarize": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.2.tgz", + "integrity": "sha1-6/KyWOjgjByfj/YdxT1bFrQ52vQ= sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw==", + "deprecated": "Please use @electron/notarize moving forward. There is no API change, just a package name change", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0= sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/electron-store": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", + "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", + "license": "MIT", + "dependencies": { + "conf": "^10.2.0", + "type-fest": "^2.17.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-store/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha1-iAaAFbszA2pZi5UuVekxGmD9Ops= sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.403.tgz", + "integrity": "sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-updater": { + "version": "6.8.9", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.8.9.tgz", + "integrity": "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig==", + "license": "MIT", + "dependencies": { + "builder-util-runtime": "9.7.0", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "~7.7.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0= sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI= sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang= sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha1-wAjKfXYg+sdC/hv0r4/4/tFUrn8= sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.6.tgz", + "integrity": "sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.21.0", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha1-ANxbl7HyM6I8k5jQIJUEz1+U2S8= sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha1-ZodEahXpaeqmPC+iaUUQ4Xrm2Xw= sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha1-XSaOpecRPsdMTQM7eepaNaSI+0g= sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI= sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha1-Bjd+Pl9NN5/qesWS1a2JJ+DE1HU= sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz", + "integrity": "sha1-jobGaxgPNjx6sxF4fgJZZl9FqfE= sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8= sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha1-IpywHNv6hEQL+pGHYoW5RoAYgoY= sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha1-xEcy0r6wrMHtYN+ECGnjEG568yg= sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo= sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8= sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha1-0d0PWBKQVMCtki5qmh5l7vQ1/nU= sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha1-HE8sSDcydZfOadLKGQp/3RcjOME= sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha1-8x274MGDsAptJutjJcgQwP0YvU0= sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha1-Q43zVSDaxdEF85Q9knVJ6jsA9LU= sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha1-lsicgsxJ/YeUokg1uj4f+H8hThg= sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha1-DzG4LzNWUlgPde9ol7uoGWLZrj0= sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/esbuild-plugin-react-virtualized": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/esbuild-plugin-react-virtualized/-/esbuild-plugin-react-virtualized-1.0.4.tgz", + "integrity": "sha1-uJEc6PrkY22qh8+omHUhcPXUVgk= sha512-/Y+82TBduHox0/uhJlTgUqi3ZWN+qZPF0xy9crkHQE2AOOdm76l6VY2F0Mdfvue9hqXz2FOlKHlHUVXNalHLzA==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha1-zycM+md7rrvAAQrAJLgjy/cjo20= sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U= sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU= sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ= sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha1-upO7t6Q5htKdYEH5n1Ji2nc+Lhc= sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha1-ffEJZUq6fju+XI6uUzxeRh08bKk= sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha1-hNTDSQrXCg/6VxE4683qarCF/cM= sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha1-awmt2QrHnC+NcjolgOB/OSWv0jY= sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "18.0.0", + "resolved": "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha1-sWRttBNIWNcEsdK+5H4dcsGAMV8= sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha1-FXNM5K+MJ3jMMvCwGzewtc0ey5c= sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha1-1OqsUrii58PNGQPrAPfgUzVhGKw= sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.13.10", + "resolved": "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.10.tgz", + "integrity": "sha1-1bacpUgZC9b9UX5XMtKxbPiEIno= sha512-ciVTEg7sA56wRMR772PyjcBRmyBMLS46xgzQZqt6cWBEKc7cK65ZSSLCTLVRu2gGtKyXUb5stwf4xxLBfERLFA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "hasown": "^2.0.2", + "interpret": "^1.4.0", + "is-core-module": "^2.15.1", + "is-regex": "^1.2.0", + "lodash": "^4.17.21", + "resolve": "^2.0.0-next.5", + "semver": "^5.7.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha1-aw7DEH5nHlK2jNBo7zJxc7kNwDw= sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha1-920yIL+4PAV2UTWSlatYVOqtdf8= sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-compat": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz", + "integrity": "sha1-NIQMlwR7WPGuAS1hpGq7Ca97sKs= sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==", + "dev": true, + "dependencies": { + "@mdn/browser-compat-data": "^5.5.35", + "ast-metadata-inferer": "^0.8.1", + "browserslist": "^4.24.2", + "caniuse-lite": "^1.0.30001687", + "find-up": "^5.0.0", + "globals": "^15.7.0", + "lodash.memoize": "^4.1.2", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=18.x" + }, + "peerDependencies": { + "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-compat/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz", + "integrity": "sha1-fEdhKZ1BwysHVxWkzh7eeJf/cqg= sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha1-YCtV+qbkyuql6XDBmLXACjdwiYA= sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", + "integrity": "sha1-Atp33CfXtMVIDfNVLqJt4FaFezY= sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha1-WQ3S5l6Vr2Rr2vUK3q6a854l6ME= sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha1-TFR5U47BC1UIuOmC4XKRHJh0Rtg= sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha1-HBRlc7lC6+YJwVbCF86v3HqI5u0= sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha1-xXIYTZIn1msQqVS5AkmiDEiyJFI= sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha1-2jXx1Y7EB0GdaIR8/TWLMnRqwxU= sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha1-TP6mD+fdCtjoFuHtAmwdUlG1EsE= sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-jest/node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha1-WV9wlORu7TZME/0j51+VE9Kbr5E= sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha1-0oErsjvxq0Zl8XGOpELoNy5jhIM= sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.1", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", + "integrity": "sha1-Rwgglk3prts36c5iwyZtLSbQjRU= sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha1-oGUhlXAK6kC5Jtw8dLOONzN3v7A= sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha1-KXVRFHK92hsnKzTXeTNcmw6HcGU= sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha1-G+AICQHmrDHOeXG+7T0+wKQj2eM= sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha1-aw7DEH5nHlK2jNBo7zJxc7kNwDw= sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-4.2.0.tgz", + "integrity": "sha512-bqADfuNtTL7VK6RU29eoiFTtaaBKIpVPuX3bOl+rBpWSBa0zIBVZlqZNZQjfP6s4iXkAJokv5IsD8OsACkwApg==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "builtin-modules": "^3.3.0", + "bytes": "^3.1.2", + "functional-red-black-tree": "^1.0.1", + "globals": "^17.7.0", + "jsx-ast-utils-x": "^0.1.0", + "lodash.merge": "^4.6.2", + "minimatch": "^10.2.5", + "scslre": "^0.3.0", + "semver": "^7.8.5", + "ts-api-utils": "^2.5.0", + "typescript": ">=5 <6.1.0", + "yaml": "^2.9.0" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "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": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha1-0d5ntr73fEGCP4It+PCzvP9gpaA= sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/eslint-plugin-storybook": { + "version": "9.1.11", + "resolved": "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.11.tgz", + "integrity": "sha1-dm6laRfPwa0NovrnwDQgLsEaP/8= sha512-T2yef3AuBHpg78o8ipMk+r8AX3nzHnaqaXS61VQWy9JNvp6Zr91u+E6UIHK1PSB3NwonX23fdcy+K8MTBXjO/A==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^8.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "eslint": ">=8", + "storybook": "^9.1.11" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha1-WQ3S5l6Vr2Rr2vUK3q6a854l6ME= sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha1-TFR5U47BC1UIuOmC4XKRHJh0Rtg= sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha1-HBRlc7lC6+YJwVbCF86v3HqI5u0= sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha1-xXIYTZIn1msQqVS5AkmiDEiyJFI= sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.1", + "resolved": "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha1-2jXx1Y7EB0GdaIR8/TWLMnRqwxU= sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha1-TP6mD+fdCtjoFuHtAmwdUlG1EsE= sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha1-WV9wlORu7TZME/0j51+VE9Kbr5E= sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha1-DNcv6FUOPC6uFWqWpN3c0cisWAA= sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha1-3rT5JWM5DzIAaJSvYqItuhxGQj8= sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha1-oqF7jkNGkKVDLy+AGM5x0zGkjG8= sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE= sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM= sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw= sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha1-qG1mFwQzcS3egUcHrFK1JxzrH+s= sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.yarnpkg.com/execa/-/execa-9.6.1.tgz", + "integrity": "sha1-W5Cs7ca9wPqbmm3fj5y7DHWnxHE= sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha1-N1z4keFtLkuuwlC4WSbP/BRyDZs= sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz", + "integrity": "sha1-V4h0WQ3LMhRRQITAgRXYruYeEbw= sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha1-ZKx1Jv40GrGKOQFs0ix4fQHgC/Y= sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha1-C5jmTtgvWs8PKTG6v2khLvUt3Tc= sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha1-cHgZgdGD7hXROZPIgiBFxQbI8KY= sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha1-7OQH+lUKZNY4U2zXJ+EpxhYW4PA= sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg= sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha1-I6/g2mfXUsoHJ1OPHmlndZcozkk= sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha1-FturtJHOVYW17LZ1tlwWXXFojus= sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.yarnpkg.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha1-lelSoBRbzj9ZrVbhefhMSNQHKTU= sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha1-IQ5htv8YHekeqbPRuE/e3UfgNOU= sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha1-0E0HxqKmj+RZn+qNLhA6k3+uazo= sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha1-6VJO5rXHfp5QAa8PhfOtu4YjJVw= sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha1-7Sq5Z6MxreYvGNB32uGSaE1Q01A= sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha1-8JuNS71Frcbwwgt+eH55PjCdzOk= sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz", + "integrity": "sha1-k1R59Rhl+nR59vqU/G/HrBTmLEo= sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc= sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha1-uu98+OGEDfMl5DkLRISHlIDuvk0= sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha1-1hz+LOBZ9BTYmendbUEH7iVnDDg= sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha1-WexPJ6pbrwhB6cY4XIOGvvTRixc= sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha1-94l4oelEd1/55i50RCTyFeWDUrU= sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI= sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ= sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw= sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha1-9H+40jnJAOt4F5qoG2ZnPqyI970= sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/fishery": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/fishery/-/fishery-2.3.1.tgz", + "integrity": "sha1-lLiWoKj2xsf1mH+Nr83QuLGqgck= sha512-eKgpAfx88/dFnLUGhJmq9eslN6nsHUcCR13Th1z6tLZixUtKjW/33MqKuzxGtYmhzUh2yLYZxq4jHxIQd3F04A==", + "dev": true, + "dependencies": { + "lodash.mergewith": "^4.6.2" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz", + "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE= sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE= sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha1-9cI8EH8PN96NvfJPE3IrO5jVJyY= sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true + }, + "node_modules/focus-lock": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz", + "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha1-KEdKFZ07nRHvYgUKFO1g5N9tYbw= sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha1-1lBogCeCaSD+6wr3R+57lCGkHUc= sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28= sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha1-JIB8McnUAuACqz2McgFEzriEhCM= sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha1-0qUdYBYrvJtKBV2EV6fHUxXRoWg= sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/formik": { + "version": "2.4.9", + "resolved": "https://registry.yarnpkg.com/formik/-/formik-2.4.9.tgz", + "integrity": "sha1-fluB6cniFdDOKsj+2AjPf7oM0gQ= sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/formik/node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha1-XT/yKgHAD2RUBaL7wX0HeKGAEXA= sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha1-Aoc8+8QITd4SfqpfmQXu8jJdGr8= sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha1-ysZAd4XQNnWipeGlMFxpezR9kNY= sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw= sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha1-5o4d97JZpclJ7u+Vzb3lPt/6u3g= sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha1-BAT+TuK6L2B/Dg7DyAuumUEzuDQ= sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fzstd": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/fzstd/-/fzstd-0.1.1.tgz", + "integrity": "sha512-dkuVSOKKwh3eas5VkJy1AW1vFpet8TA/fGmVA5krThl8YcOVE/8ZIoEA1+U1vEn5ckxxhLirSdY837azmbaNHA==", + "license": "MIT" + }, + "node_modules/gaxios": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.0.tgz", + "integrity": "sha1-irCK2/nMYANopXVF9Y4ATM+DHMs= sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha1-5i4zc930H8cnzMMcVcaHt5i+6Jg= sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dev": true, + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.yarnpkg.com/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha1-M6W3jixcAc9aXRf1jdGIg5hn/Jw= sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha1-0eiJus33M7T/OyskPrehKGagt4s= sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha1-znAI/jRe3PVJem9VfPpUvDGKnOc= sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha1-/fPwJ4Bzgg0s6UJsGPB0gbHgzfM= sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro= sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/get-port/-/get-port-7.2.0.tgz", + "integrity": "sha1-2w1S6y2JiQzcAQ7Q6aby1LeMu+c= sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE= sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha1-lRV9Id+OuQ0WRxArYwObHfYOvSc= sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha1-N1z4keFtLkuuwlC4WSbP/BRyDZs= sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha1-e91U4L7+j/yfO04gMiDZ8eiBtu4= sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys= sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM= sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha1-x1KXCHyFG5pXi9IX3VmpL1n+VG4= sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha1-hDKhnXjODB6DOUnDats0VAC7EXE= sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ= sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha1-dDDtOpddl7+1m8zkH1yruvplEjY= sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha1-vUvpi7BC+D15b344EZkfvoKg00s= sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-auth-library": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.1.tgz", + "integrity": "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-auth-library/node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.yarnpkg.com/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha1-M6W3jixcAc9aXRf1jdGIg5hn/Jw= sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-auth-library/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha1-0eiJus33M7T/OyskPrehKGagt4s= sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha1-F7cfH5XSZtLd01a48AF4Qz8EGxc= sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis": { + "version": "125.0.0", + "resolved": "https://registry.yarnpkg.com/googleapis/-/googleapis-125.0.0.tgz", + "integrity": "sha1-0IRWXlZwgdzq9areDE9RIq5T4IM= sha512-KsMe3gdbiI6bj4M+Zuwcl7xL0Koz8m0kaq0XQj99YT/4zHsZdaLJqGmYMDyWI4SAScVqkW7TvQftzL7L74x1uQ==", + "dev": true, + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-7.0.0.tgz", + "integrity": "sha1-p7UmLjIMkiwlsSPt6io5WPFcPt0= sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.0.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/gcp-metadata": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.0.0.tgz", + "integrity": "sha1-KuEgCL74yqhybLox/QpkHrrV+1Y= sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==", + "dev": true, + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis-common/node_modules/google-auth-library": { + "version": "9.0.0", + "resolved": "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.0.0.tgz", + "integrity": "sha1-sVnSJGTGeaaiXLRtSKSsl/n0JqI= sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.0.0", + "gcp-metadata": "^6.0.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis-common/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/googleapis-common/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha1-WS9VBlACSjjOsMVi8vaqQ1dh77U= sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "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, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/googleapis/node_modules/gcp-metadata": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.0.0.tgz", + "integrity": "sha1-KuEgCL74yqhybLox/QpkHrrV+1Y= sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==", + "dev": true, + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis/node_modules/google-auth-library": { + "version": "9.0.0", + "resolved": "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.0.0.tgz", + "integrity": "sha1-sVnSJGTGeaaiXLRtSKSsl/n0JqI= sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.0.0", + "gcp-metadata": "^6.0.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE= sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM= sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha1-+y8dVeDjoYSa7/yQxPoN1ToOZsY= sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.yarnpkg.com/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha1-TStz31eWsgHxvCdl9dcGf2ictV8= sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/gtoken": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha1-tkvQHYgmjqOjVyyQdqhdHEjxpFU= sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", + "dev": true, + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha1-BlNn/VDCOcBnHLy61b4+LusQ5GI= sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha1-Mey9MuZIo00DDYattn1NR1R/5xA= sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha1-CHG9Pj1RYm9soJZmaLo11WAtbqo= sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha1-lj7X0HHce/XwhMW/vg0bYiJYaFQ= sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha1-XeWm6r2V/f/ZgYtDBV6AZeOf6dU= sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg= sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha1-LNxC1AvvLltO6rfAGnPFTOerWrw= sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha1-m2f9GI5MgeitZvgDhVM0FzkgIY0= sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-to-hyperscript/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha1-VU40q97qJax29b2VCh8BgOCzvCo= sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha1-Oz7VFZonB8YTe0hjf7/gaOF1pCU= sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha1-1Xwj9NoWrjxjs7bKRhZoMxNJnDo= sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha1-4Wo8JkL2XMfEgMFlQApA1gSrddA= sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha1-iqXvksEX0g2XSoK9+2pkiwjAuvw= sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws= sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-raw/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/hast-util-raw/node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha1-zMZzpVu46Fd1sIrCg4D3LUcWcAU= sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha1-F6O/gjAuCHDW2kOgExGovAKj7PU= sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha1-TonJRYrLYbyP7xn0UplzsjkoOe4= sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha1-/J29hK+edHJJA01NYmAt72UX8dc= sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha1-1/+EykmaV+LAYK5nVIrZUOaJoFM= sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha1-tiLoZG4CtYAgVBVYa0CATT6L/V0= sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha1-Hs2dI1CjhEVyw/SjErzrAYNIhZ8= sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha1-Z48gq1yhIHqX1+qKOINzyc+Ja+Q= sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha1-NlKrHEllMYUr9VprrFevmB68OKs= sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha1-yCfUsKy3b8PmhaTG7CkC1RBw6dc= sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha1-HsRGULYx1ylSBmzqmxRF32mfhHk= sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha1-d3jtnTyS3Z6MXI9kiknCH8UctiE= sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha1-6HaNfqxWw/3qyKkoMNWOgR5b9kA= sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha1-iqXvksEX0g2XSoK9+2pkiwjAuvw= sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8= sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha1-kioBVd4w7MH3hbzwS+d4RMqVrQc= sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz", + "integrity": "sha1-MzcaZeOoOyZ0NOKz87G0xYqtTPM= sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U= sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hotkeys-js": { + "version": "3.9.4", + "resolved": "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.9.4.tgz", + "integrity": "sha1-zhqkw6EytqY6ndVkT8kripucv7k= sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==" + }, + "node_modules/html-dom-parser": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-1.2.0.tgz", + "integrity": "sha1-j2ibg1mC/78kXtqZcw6SuEYsER4= sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==", + "dependencies": { + "domhandler": "4.3.1", + "htmlparser2": "7.2.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha1-LLGozw21JBR3blsqegTV3ZgVjek= sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM= sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha1-v8gYk0zAeRj2s2afV3Ts39SPMqs= sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha1-SDfqGy2me5xhamevuw+v7lZ7ymY= sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha1-38EBc0fOn3fIFBpQfyMwQMWcVdI= sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-react-parser": { + "version": "1.4.14", + "resolved": "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-1.4.14.tgz", + "integrity": "sha1-V3t6kL4MYe67vEiNkUrQg5jHnvU= sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==", + "dependencies": { + "domhandler": "4.3.1", + "html-dom-parser": "1.2.0", + "react-property": "2.0.0", + "style-to-js": "1.1.1" + }, + "peerDependencies": { + "react": "0.14 || 15 || 16 || 17 || 18" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha1-zpFZSU6G2V5FeVsWbCAhws/KRIM= sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha1-2MsPft/3dFrn1szLC/9ZLp9/eVk= sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha1-iBfN6ji7wyQ5KpCxmQkI6Bpl9aU= sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz", + "integrity": "sha1-K4h8piWF6W2zkDSC0zbBAGwwAdQ= sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha1-2o3+rH2hMLBcK6S1nJts1mYRprk= sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha1-8Iu1k7bR2zU5M9BhVs7eyQq+Ufs= sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.yarnpkg.com/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha1-OuE3PTRMI5P0ZVVvOUq6WpIzuTo= sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-cli": { + "version": "1.67.8", + "resolved": "https://registry.npmjs.org/i18next-cli/-/i18next-cli-1.67.8.tgz", + "integrity": "sha512-v1/lw078Eu5CZfkHqk6mmqJw3tuBCl6IRpjnHrb5fnrheLyBTHNK/p9onUkqbP4QAxSXHQF6WCdBkmVf64QS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@croct/json5-parser": "^0.2.2", + "@swc/core": "^1.15.41", + "chokidar": "^5.0.0", + "commander": "^14.0.3", + "execa": "^9.6.1", + "glob": "^13.0.6", + "i18next": "^26.3.1", + "i18next-resources-for-ts": "^2.1.0", + "inquirer": "^14.0.2", + "jiti": "^2.7.0", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "minimatch": "^10.2.5", + "ora": "^9.4.0", + "react": "^19.2.7", + "react-i18next": "^17.0.8", + "yaml": "^2.9.0" + }, + "bin": { + "i18next-cli": "dist/esm/cli.js" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/i18next-cli/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o= sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/i18next-cli/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/i18next-cli/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz", + "integrity": "sha1-Ql15tI+a+C/Nnk/B6or2xewHu8I= sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/i18next-cli/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz", + "integrity": "sha1-B4ZmVmpCUUfMrPvS4zLetmor5x0= sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/i18next-cli/node_modules/i18next": { + "version": "26.3.1", + "resolved": "https://registry.yarnpkg.com/i18next/-/i18next-26.3.1.tgz", + "integrity": "sha1-lHYoV/Wq4MYoLYf48AOcu8n3tC0= sha512-txQqd5EULsqEh9OJqRH15aCaOuy/nLJyhw5EHCSKLKJE1aBbb3Zve2+uQIxgWhPm1QqUQoWyQBm2kfmmIrzkcQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "peerDependencies": { + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-cli/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/i18next-cli/node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.yarnpkg.com/react/-/react-19.2.7.tgz", + "integrity": "sha1-H0ehv8BvjsiFdSxvSvFDaan4Jgs= sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/i18next-cli/node_modules/react-i18next": { + "version": "17.0.8", + "resolved": "https://registry.yarnpkg.com/react-i18next/-/react-i18next-17.0.8.tgz", + "integrity": "sha1-o4gN2/2VaEb0YAAEMTsEjBxwWu4= sha512-0ooKbGLU8JXhe1zwpQUWIeXSgLPOfwJmgheWRIUpcoA0CpyabpGhayjdG+/eA5esC1AQ8h2jWpXjJfzQzeDOCw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.29.2", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 26.2.0", + "react": ">= 16.8.0", + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-resources-for-ts": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/i18next-resources-for-ts/-/i18next-resources-for-ts-2.1.0.tgz", + "integrity": "sha1-RtHQwdtLkOXwwIr6BtxWIb4Ag58= sha512-n5UexwEVt0OoIAhG2MWpSnAVJW1U8mQrQTmXyxc5DMAx+NLhcLZhSMJo/FnUsA5JQ3obTYqTgB7YIuZKWpDgow==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.28.6", + "@swc/core": "^1.15.18", + "chokidar": "^5.0.0", + "yaml": "^2.8.2" + }, + "bin": { + "i18next-resources-for-ts": "bin/i18next-resources-for-ts.js" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE= sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4= sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha1-PNQOcp82Q/2HywTlC/DrcivFlvU= sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/immer": { + "version": "11.1.8", + "resolved": "https://registry.yarnpkg.com/immer/-/immer-11.1.8.tgz", + "integrity": "sha1-CKZCb3AZ286Nbf+MSkO7JcVQpXU= sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.9.tgz", + "integrity": "sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs= sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "1.3.4", + "resolved": "https://registry.yarnpkg.com/import-from-esm/-/import-from-esm-1.3.4.tgz", + "integrity": "sha1-Oel8hAheMI/mbPhypmcEa0VEnfA= sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=16.20" + } + }, + "node_modules/import-in-the-middle": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.3.3.tgz", + "integrity": "sha512-AiohS3H80sXO6owEltjGX+glb7qXaDhBoJb9XcQVH4UI207xu/bDLUcadVKp7Qe576reg9yr/PXZjV5qx8gfbA==", + "license": "Apache-2.0", + "dependencies": { + "cjs-module-lexer": "^2.2.0", + "es-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha1-w9XHRXmMAqb4uJdyarpRABhu4mA= sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha1-CxGVkVaJ9gqwD4MK8PFcyEHokZ4= sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha1-7Io7QpJ06cCh8cT/qUU6f+9yzqE= sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/inquirer": { + "version": "14.0.2", + "resolved": "https://registry.yarnpkg.com/inquirer/-/inquirer-14.0.2.tgz", + "integrity": "sha1-H+pJRJMzScuLypCtBelTXuPbtUo= sha512-VsSx1JneSNp3ld1veMTLe+UDcUD8Tw2/jjOthhkX3/IX2q+xHhVELifeb/hsb1fBw31pabEPNUf/xUOyb+KZjA==", + "dev": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/prompts": "^8.5.2", + "@inquirer/type": "^4.0.7", + "mute-stream": "^3.0.0", + "run-async": "^4.0.6" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha1-HqyRdilH0vcFa8g42T4TsulgSWE= sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha1-ZoXyN1XkPFJOJR0py8lySOMGEAk= sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4= sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0= sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha1-frmiQx+FX2se8aeOMm31FWlsTb8= sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha1-ZXQuHmh70sxmYlMGj9hwf+TUQoA= sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha1-PmkBjI4E5ztzh5PQIL/ohLn9NSM= sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha1-3aejRF31ekJYPbQihoLrp8QXBnI= sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha1-cGf0dwmAmjk8cf9bs+E12KkhXZ4= sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE= sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha1-O8KoXqdC2eNiBdys3XLKH9xRsFU= sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha1-KpiAGoSfQ+Kt1kT7trxiKbGaTvQ= sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha1-uuCkG5aImGwhiN2mZX5WuPnmO44= sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha1-rYVUGZb8eqiycpcB0ntzGfldgvc= sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U= sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha1-7v3NxslN3QZ02chYh7+T+USpfJA= sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha1-fRQK3DiarzARqPKipM+m+q3/sRg= sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha1-vz7tqTEgE5T1e126KAD5GiODCco= sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha1-zDXJdYjaS9Saju3WvECC1E3LI6c= sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA= sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha1-7elrf+HicLPERl46RlZYdkkm1i4= sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha1-BDpUreoxdItVts1OCara+mm9nh0= sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha1-ztkDoCespjgbd3pXQwadc3akl0c= sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha1-6gKhuQ3bOTShmupBTojt734R0TQ= sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha1-FEsh6VobwUggXcwoFKkTTsQbJUE= sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM= sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha1-1lAl7ew2V84DL9fbY8l4g+rtcfA= sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha1-Fx7W8Z46xVQ5Tt94yqBXhKRb67U= sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha1-dtcKPtEO+b5I61d4h9dCBb8MrSI= sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha1-irIJ6kJGCBQTct7W4MsgDvHZ0B0= sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha1-m2eES9m38ka6BwjDqT40Jpx3T28= sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc= sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha1-kuo/PVxbbgOcqGd+WsjQfqdzy7k= sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha1-9HdhJ59TLisFpwJKdQbbvtrNBjQ= sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha1-S/tKRbYc7oOlpG+6d45OjVnAzgs= sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha1-CfCrDebTdE1I0mXruY9l0R8qmzo= sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha1-v3JhXWSd/l9pkHnFS4PkfRrhnP0= sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha1-7qQwGCvo1kF0vZa/+8RvIb8/kpM= sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha1-yfXesLwZBsbW8QJ/KE3fRZJJ2so= sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha1-CFjt2UqVWUx8ndC1wXTsbkXuSqc= sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha1-zg5zIW+YWZBgWS9i/zE1TdvrAjA= sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM= sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y= sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha1-+hVAHfbBWHS8shBfdzMl14xmZ2U= sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0= sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE= sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs= sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha1-EslZop3jLeCqO7u4AfTXdwZtrjk= sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo= sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz", + "integrity": "sha1-8hg9LFk4LLJ0ImA0VDucA7gWTEY= sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/java-object-serialization": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/java-object-serialization/-/java-object-serialization-0.1.2.tgz", + "integrity": "sha1-Ip7ktw6onnIgbjKoJq+s0J2brf0= sha512-l0V2a/E7r6ScqG+ne09KR7G1npbiVdDf3Vdk6fcn8jy5TQiTTOQbDg9OfBriv2NmnCxcm4NmFW2dAD9QaN/htw==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz", + "integrity": "sha1-mUZ2/CQXfwiPHF43N/VpcgT/JhM= sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha1-HAbQfnfHjhWF0CBCTe3BDW4XrDo= sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo= sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk= sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha1-toF6RfzINdixbVli0MAmRz7jZoo= sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha1-VZLJQHmODK5nfuwWkmTy2DmjeZU= sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha1-vL2ogG28wBseMWpGu3QIWoSwJF8= sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha1-AXk0pm67fs9vIF6EaZvhCv1wRYo= sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo= sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha1-FiqbPyMovdmRvqq/+7dHReVld9E= sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha1-0gb6NVGTPD/VGeXf21ig9ROag38= sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha1-C5PhEd2o7BILyDAObR+5V24WQ3Y= sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-fixed-jsdom": { + "version": "0.0.10", + "resolved": "https://registry.yarnpkg.com/jest-fixed-jsdom/-/jest-fixed-jsdom-0.0.10.tgz", + "integrity": "sha1-b0BC1C8hMKDevIXsC540jEwt5Xs= sha512-WaEVX+FripJh+Hn/7dysIgqP66h0KT1NNC22NGmNYANExtCoYNk1q2yjwwcdSboBMkkhn0NtmvKad/cmisnCLg==", + "dev": true, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "jest-environment-jsdom": ">=28.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha1-NvSZ/c6hl8EEWhJzGcBIFyOQj9E= sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha1-PCOWUkSC9aBQY3bmyFjDu8wXsQQ= sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-html-reporters": { + "version": "3.1.7", + "resolved": "https://registry.yarnpkg.com/jest-html-reporters/-/jest-html-reporters-3.1.7.tgz", + "integrity": "sha1-2MtvXRX9UY5gGEH5AWXzd2Xn/zQ= sha512-GTmjqK6muQ0S0Mnksf9QkL9X9z2FGIpNSxC52E0PHDzjPQ1XDu2+XTI3B3FS43ZiUzD1f354/5FfwbNIBzT7ew==", + "dev": true, + "dependencies": { + "fs-extra": "^10.0.0", + "open": "^8.0.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha1-W37A2t/f7Ayjg9yaoBbTa16kxyg= sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha1-ro/sef8kn9WSzoDj7kdOg6bETxI= sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha1-i8OS4gTpXf51ZKu+cqQE4o5R9/M= sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha1-ToNs9g6Zxvz6vp+Z0Bfz/dUKY0c= sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha1-kwsVRhZNStWTfVVA5xHU041MrS4= sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha1-SlVtnHdq9o4cX0gZT00DJ9JOilI= sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha1-ZNaomS3Sb2NasMAeXu9Dmca8vDA= sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha1-GwTywJXzf8d2/0CAPckpIbHohCg= sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha1-gJrwctQIpT3P0uhJpMl20xMvcY4= sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner-groups": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/jest-runner-groups/-/jest-runner-groups-2.2.0.tgz", + "integrity": "sha1-6KxFMyLB8AEIb06gKZuMTFvYkWY= sha512-Sp/B9ZX0CDAKa9dIkgH0sGyl2eDuScV4SVvOxqhBMxqWpsNAkmol/C58aTFmPWZj+C0ZTW1r1BSu66MTCN+voA==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "jest-docblock": ">= 24", + "jest-runner": ">= 24" + } + }, + "node_modules/jest-runner/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI= sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha1-7+yzFBz303Z6OgzI98mZBYfT2Bc= sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-runtime/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha1-D3lzHrjP4exyrNQGbvrJ1hmRsA0= sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg= sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha1-wsV0w/UYZdobsykDZ3imm/iKa+U= sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha1-I8K2K/sivoK0TemAVYAv83EPwLw= sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha1-e/cFURxk2lkdRrFfzkFADVIUfZw= sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo= sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "2.2.2", + "resolved": "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz", + "integrity": "sha1-VRbTzQBkhcqlz8m9HeQPH4sTar8= sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.0.0", + "chalk": "^5.2.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha1-dsVM6bCB2tOazsS11TN3kTgl+w8= sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha1-sSOLbiPqM3r3HH+KKV21rwwViuo= sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha1-gThbsHGvTfd0v/hyHQyhXvKeoLs= sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz", + "integrity": "sha1-vjrd3N8JrDjuvo3Nx7GlenWwlc4= sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha1-PWR/SXtujo1B5CL34LI7xTbIOB4= sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM= sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha1-eBDTDWGcOmIJMiPOa7NZyhsoovI= sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jest-when": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/jest-when/-/jest-when-4.0.2.tgz", + "integrity": "sha1-sF0LisOixzkK12tDavyKrX5X/rI= sha512-v003MeNF+J2TNPT1wy2QCUBPK8CdMJg8bTMy+8ibuK7SetCTM3cgjPBXWydTsactk6Ko5+wtcuM1xWM6G1R4AQ==", + "dev": true, + "peerDependencies": { + "jest": ">= 27" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha1-rK0HOsu663JivVOJ4bz0PhAFjUo= sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha1-l0Io8vTKK8IYhaF5e0X+po6VDGQ= sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk= sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha1-iGpBuh1HJvZ6iFgCjJlIn+1q1Ns= sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c= sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha1-USmAAgNSDUNPFCvHj/PBcIAPK0M= sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY= sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha1-l7mtsHKLQigKo9gUtrmZsv8DGL8= sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha1-ZFF2BWb6hXU0dFqx3elS0bF2G+A= sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha1-rlR4I6wMrYOYZn+M2e9HMPWwH/E= sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-dup-key-validator": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/json-dup-key-validator/-/json-dup-key-validator-1.0.3.tgz", + "integrity": "sha1-7BR+RX72AL0qeUEh6I9OyfPt74U= sha512-JvJcV01JSiO7LRz7DY1Fpzn4wX2rJ3dfNTiAfnlvLNdhhnm0Pgdvhi2SGpENrZn7eSg26Ps3TPhOcuD/a4STXQ==", + "dependencies": { + "backslash": "^0.2.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI= sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha1-I/9IG4tO680soSO0+gQJ5mRpotk= sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha1-iQPPrELqGg+X811jpM4FGPDManA= sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM= sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha1-8qUktPf9EePXkeVZl3rWC5i3mLQ= sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4= sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha1-KqMRHa49NKDxUcY/OkXZldlCCXg= sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha1-R2a9BajioRryIr7NGeFVdeUqhTo= sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jsx-ast-utils-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", + "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha1-NK7nDrGOofrsL1iSCKFX0f6wkcI= sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha1-v4F20a0M1y4PP1gzhZWhPhELyAQ= sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz", + "integrity": "sha1-B+3Bvo+sIOZ3soPs4mFJi9OPBpA= sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyboardevent-from-electron-accelerator": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", + "integrity": "sha1-rOIbGqTkcUiBXRYAV/nttmVnxQw= sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==", + "dev": true + }, + "node_modules/keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha1-iBkexzjOn3WRwl6QVt6Si0AncZQ= sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha1-H9LP1W67YlAYERTwpYEWcJnCsow= sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha1-LhUAhhsuRX66fnroaHfL0I+h/R0= sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha1-H/3NDsD6+0sb5/ixHzBq0PnAh3c= sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha1-bPO59bwxzufuPjacCDK3WD3Nkj0= sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4= sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-checker": { + "version": "25.0.1", + "resolved": "https://registry.yarnpkg.com/license-checker/-/license-checker-25.0.1.tgz", + "integrity": "sha1-TRRQRHilJAqFe7PCHNBJGgDXYfo= sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" + }, + "bin": { + "license-checker": "bin/license-checker" + } + }, + "node_modules/license-checker/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/license-checker/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/license-checker/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o= sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha1-obz9Ylf5WFv1rhTO7rt7VZAl5MQ= sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha1-7KKE910pZQeTCdwK2SVauy68FjI= sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "16.4.0", + "resolved": "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha1-oAsOOr/1kjnO9tfZNB6PhHMwjiM= sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "dev": true, + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz", + "integrity": "sha1-Ql15tI+a+C/Nnk/B6or2xewHu8I= sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.yarnpkg.com/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha1-kt98RBam2mMOue9G2kabcN6XsxY= sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE= sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha1-yOcqrKgznHc9Eow24KF8YxW2lOs= sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha1-FlCJz6UnzIj7wj3XMxP14zSvHqE= sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0= sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha1-BGsqbU9rFWsiM9MgfUtal4OZm5g= sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha1-ItC2bRi8XFf0iL/PNsveO+9zFTc= sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw= sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM= sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg= sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha1-bHbtKbDMzprzeSCCmfB/h23nN+M= sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha1-i1yzi1w0qaAY7h/A5qBm0d/MUow= sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY= sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw= sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha1-uWLuuA2dmDqQC/NClh+3QYyhCx0= sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead." + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA= sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo= sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha1-YXEh+JrFX1kEfHrsHM1mVMZZD1U= sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha1-9S5oA32W9Yn8Vy/yGT3EJNSMGVs= sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha1-GgT/OBZvlGR64a9WL0vWoVsbfNQ= sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha1-U5W7dLIVCkodbjwlZfSuynjShic= sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE= sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0= sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha1-BGsqbU9rFWsiM9MgfUtal4OZm5g= sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha1-rfe+cKptchYtkHzQ5tXBH1B7VAM= sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw= sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM= sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg= sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha1-YvpnzZWHQqFXSvnzmGY2QQLZDNQ= sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha1-AJXPVtxbepp8CP9bGoeW7IrRfnY= sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha1-b6I3xj29xKgsoP2ILkci3F5jTig= sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk= sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha1-watQ93iHtxJiEgG6n9Tjpu0JmUE= sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/lz4js": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz", + "integrity": "sha1-CfGjl8shWPZ1FGwzUd3oUFjLMi8= sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha1-VnY+wJoPqAkd8nh5/ZTRkHjADZE= sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4= sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha1-yVQV70UUmddgK5EJXzyOiXX3hTU= sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha1-5jMdMOSTEn4DHdOFSItb0ybkpr0= sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k= sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha1-xcGoTbeZFztNz3ZDzamZ5EDCTbI= sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha1-cKMXTIlOFN9yKr9DvCUMuuRLEd8= sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha1-RoMSa1ALYXYvLb66zhgG6L4xscg= sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha1-0KP4by3Q23rNfYwkeAgLXGf5xqk= sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha1-yVgiuRqrdfGKTL6LL1G4c+0s8Mc= sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha1-RJxuIaiA4IVb9aq63rOnQDFKusI= sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha1-LN9juSwqMxQGsPsNtMB3wbAzF1E= sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha1-q9VXYwM3vTCm1aS9glLhwtwIddU= sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha1-F6O/gjAuCHDW2kOgExGovAKj7PU= sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha1-d3jp2co99yOMwr0/orG/amWxlAM= sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha1-1E756O0oOsjBFlqw0N/QWMJ2TBY= sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha1-ekNftiI6crCGKzOvvXErba6HjTg= sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha1-5oCV0vikMD7yQJSrZC4QR7mRqTY= sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha1-fMCo3sMOrwS3salmGpKtszgqpuM= sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha1-0KP4by3Q23rNfYwkeAgLXGf5xqk= sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha1-YYdVJqAX2IV7cavJMzlCcAstNgQ= sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha1-3BMPfn2TBhJChvbWzuQM9NFKPcA= sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/mdast/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha1-rKqw+RnOaczmKcLU7S60rcG2wgw= sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha1-+RD/5giX8Eu0t+fuQ0SG92KINhs= sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha1-yCfUsKy3b8PmhaTG7CkC1RBw6dc= sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha1-elEhR1VWoE5+3etnsmSq550xKBQ= sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha1-zk32+Ar2z74hjs1cVSuhPE36CMw= sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha1-gzeqPEM1WBg57AHD1ZQJDOvo8A4= sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA= sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/meriyah": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-6.1.4.tgz", + "integrity": "sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==", + "license": "ISC", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha1-kTlaPhiEoZjmIRbjPJxWjjmTb9s= sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha1-xpFjDkhQIaaM8o28Kyyifr9njNQ= sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha1-PhM3arld16XP0OKVYN/pmWV7PFs= sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha1-Yoau6WhsRGLB41UqnVBf7dzuuTU= sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha1-TatW1OOYuYU/b+TvrE/JNh8+B1A= sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha1-hhBt+LOmkrX2qSKA04eb5r5G2SM= sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha1-+scLy/Uf5l9fRAMxGNOb6Km1lAs= sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha1-8m2KeAe1mF+6E89hRltYyl/33Fc= sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha1-vMNNgFY5gpmQ7BdcPuoSu1t4Hyw= sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha1-j++OD3CB8EdPvdkt61DJkKAmRjk= sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha1-UmfvqX8eUlTvx/ILRZo4yyEFi6E= sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha1-NtAhLpYrKzEh+FJfx6PHwCnzNPw= sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha1-I35KpdWKlYY/AQMtnumwkPHebpQ= sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha1-BrJrKYPE0nv8xlezPiUTTUhosLE= sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha1-L5h4MaQNTFEKwmHomFLE6XA8zaY= sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha1-R/vNk0caP8yrhs/wOEf8NVLbEFE= sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha1-05n6+cRcoUyLS+mLHqSBvO2Htik= sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha1-Kg9JCrCL/1zC/V7sbdDKBPibMKk= sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha1-/PFbZgl5OI5vEYzba/fXnXPSb+U= sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha1-bLmVguXScehO/KjmGoB5lNcWHrI= sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha1-DVHRwJVVHPqsNoMmljz1XxX1QLg= sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha1-5AQDCWSBmGtBwQZif5j3LU0QuCU= sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha1-ww13sugyrPZSb4vxqke8nJQ4wW0= sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha1-4aLWLN0jcjCirhGDkCexk4HjHos= sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha1-q4l4m4GKWHUrc9a1UjhiG3+qj9c= sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha1-2K3lug8xl6HPaimZ+7/mNXoaGe4= sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha1-5dpJTo6ysHGg0I+zT2zv7GwKGbg= sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha1-8AIl9fWg68MlT5bDa2YFxLOTkI4= sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI= sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A= sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo= sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha1-rL4rM0n5m53qyn+3Dki4PpTmcHY= sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk= sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha1-XIXslFDAXSbjJTG0ZaFaCMOlclM= sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY= sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha1-WxhQkS+jHfkHFpY9RdkSH9/An0Y= sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw= sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha1-eTibTrG7LQA6m7qH1JLyvTe9xls= sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha1-atdsOo8QInybUdHJrI4wsn9aJRw= sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY= sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/modern-normalize": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-3.0.1.tgz", + "integrity": "sha1-Ti3I2igquFTVPXDXFVqAJ/WfvtY= sha512-VqlMdYi59Uch6fnUPxnpijWUQe+TW6zeWCvyr6Mb7JibheHzSuAAoJi2c71ZwIaWKpECpGpYHoaaBp6rBRr+/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE= sha512-EickqnKq3kVVaZisYuCxhtKbZjInCuwgwZWyAmRIp1NTMhri7r3380/uqwrUHfaDiPzLVTuoNy4whX66bxPVog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/monaco-editor": { + "version": "0.48.0", + "resolved": "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.48.0.tgz", + "integrity": "sha1-nlRUG74Lo/K7I4R31bmBooIgXqA= sha512-goSDElNqFfw7iDHMg8WDATkfcyeLTNpBHQpO8incK6p5qZt5G/1j41X0xdGzpIkGojGXM+QiRQyLjnfDVvrpwA==" + }, + "node_modules/monaco-languageserver-types": { + "version": "0.3.2", + "resolved": "https://registry.yarnpkg.com/monaco-languageserver-types/-/monaco-languageserver-types-0.3.2.tgz", + "integrity": "sha1-Xnye5Q0Bxopk4otAw4Zs5KRqdS0= sha512-KiGVYK/DiX1pnacnOjGNlM85bhV3ZTyFlM+ce7B8+KpWCbF1XJVovu51YyuGfm+K7+K54mIpT4DFX16xmi+tYA==", + "dependencies": { + "monaco-types": "^0.1.0", + "vscode-languageserver-protocol": "^3.0.0", + "vscode-uri": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/monaco-marker-data-provider": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/monaco-marker-data-provider/-/monaco-marker-data-provider-1.1.1.tgz", + "integrity": "sha1-DKafNnFS9aoSzsK9qV8yt0A+h28= sha512-PGB7TJSZE5tmHzkxv/OEwK2RGNC2A7dcq4JRJnnj31CUAsfmw0Gl+1QTrH0W0deKhcQmQM0YVPaqgQ+0wCt8Mg==", + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "monaco-editor": ">=0.30.0" + } + }, + "node_modules/monaco-types": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/monaco-types/-/monaco-types-0.1.0.tgz", + "integrity": "sha1-OjBmq6SZy1kjzWDvxzbz8UoWnhA= sha512-aWK7SN9hAqNYi0WosPoMjenMeXJjwCxDibOqWffyQ/qXdzB/86xshGQobRferfmNz7BSNQ8GB0MD0oby9/5fTQ==", + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/monaco-worker-manager": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/monaco-worker-manager/-/monaco-worker-manager-2.0.1.tgz", + "integrity": "sha1-9nxU38o07UsiXV3oTneyS0423oo= sha512-kdPL0yvg5qjhKPNVjJoym331PY/5JC11aPJXtCZNwWRvBr6jhkIamvYAyiY5P1AWFmNOy0aRDRoMdZfa71h8kg==", + "peerDependencies": { + "monaco-editor": ">=0.30.0" + } + }, + "node_modules/monaco-yaml": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/monaco-yaml/-/monaco-yaml-5.1.1.tgz", + "integrity": "sha1-kyrTeQcH1lmO6i9xEC5ACpptwHQ= sha512-BuZ0/ZCGjrPNRzYMZ/MoxH8F/SdM+mATENXnpOhDYABi1Eh+QvxSszEct+ACSCarZiwLvy7m6yEF/pvW8XJkyQ==", + "dependencies": { + "@types/json-schema": "^7.0.0", + "jsonc-parser": "^3.0.0", + "monaco-languageserver-types": "^0.3.0", + "monaco-marker-data-provider": "^1.0.0", + "monaco-types": "^0.1.0", + "monaco-worker-manager": "^2.0.0", + "path-browserify": "^1.0.0", + "prettier": "^2.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.0.0", + "vscode-uri": "^3.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "monaco-editor": ">=0.36" + } + }, + "node_modules/monaco-yaml/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha1-6MXX6YpDBf/j3i4fxKyhpxwosdo= sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha1-FRCCpuBuWamjm0az4U1c/pKzq7Q= sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/msgpackr": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", + "integrity": "sha1-4F7Bu0RT3fAgVRvNXarwCSosJ50= sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.7" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" + } + }, + "node_modules/msw": { + "version": "2.13.2", + "resolved": "https://registry.yarnpkg.com/msw/-/msw-2.13.2.tgz", + "integrity": "sha1-QQYfNE60EF/HkdyNLTZyAg4WRGk= sha512-go2H1TIERKkC48pXiwec5l6sbNqYuvqOk3/vHGo1Zd+pq/H63oFawDQerH+WQdUw/flJFHDG7F+QdWMwhntA/A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha1-zYAU3SrLcuHpG7Z8dPABnmILotE= sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8= sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0= sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abi": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.33.0.tgz", + "integrity": "sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==", + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha1-GbrVT21lYoy+5OYHoyXkSIrOLek= sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha1-aIjbRqH3HAt2s/dVUBa2P+ZHZuU= sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha1-aaAVDmlG4vEV6dfqTfeXHiYoMBw= sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0= sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.yarnpkg.com/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha1-LQF7bqHKkpTbvudb5TNyj0klcCQ= sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.0.7", + "resolved": "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", + "integrity": "sha1-XSYyu94KsvbiLxu6whmbByRK4LM= sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", + "optional": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha1-7JM/Die2zWDom1xrKjBK9CIJuwU= sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha1-SPZXavjoehj+t5a37V4uWQO0Pco= sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.yarnpkg.com/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha1-a/8INrKWTSRQi2tBtamknE9KH5Y= sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha1-GFGUgqN9UZjiMRM6cBRKUPIfAhU= sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/which/-/which-6.0.1.tgz", + "integrity": "sha1-AhZCRDoZj7k7eEpWBnIcsYz8v84= sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha1-o3XK2dAv2SEnjZVMIlTVqlfhXkg= sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha1-bnmkHyP9I1wGIyGCKNp9nCO49uI= sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha1-Jc/cTq4El28zScCxr8CJBSw2JTc= sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha1-KVWI3DruZBVPh3rbnXgLgcVUvxg= sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha1-Tv1FyFpp4N1XbSVTL7+iKqXIoQQ= sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha1-yeq0KO/842zWuSySS9sADvHx7R0= sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY= sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "engines": { + "node": "*" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha1-c44HB9MSjLdQ3dz+kORhBILfDzA= sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM= sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w= sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4= sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha1-jBTKGkJMalYbC7KiL2b1BJqUXT0= sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha1-5HcKahREr7Yb05+YQBi1vt4l+LM= sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha1-9xldipuXvZXLwZmeqTns0aKwDGU= sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha1-mxJcNiOBKfb3thlUoecXYUjVAC4= sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha1-3u1SClCAn/f3Wnz9S8ZMegOMYhY= sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz", + "integrity": "sha1-W1/+Ko95Pc0qrXPlUMuHtZywhPk= sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz", + "integrity": "sha1-XTfh81B3udysQwE3InGv3rKhNZg= sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha1-fqHBpdkddk+yghOciP4R4YKjpzQ= sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "9.4.1", + "resolved": "https://registry.yarnpkg.com/ora/-/ora-9.4.1.tgz", + "integrity": "sha1-unZE88fJKo+DD7xIyncLnq9LxVw= sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", + "dev": true, + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.2", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha1-sSOLbiPqM3r3HH+KKV21rwwViuo= sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha1-FlCJz6UnzIj7wj3XMxP14zSvHqE= sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM= sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M= sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA= sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha1-Ihwb/Ak+j+xwdUl+d5n9v0PRSHM= sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha1-5ABpEKK/kTWFKJZ27r1vOQz1E1g= sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ= sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU= sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU= sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha1-U8brW5MUofTsmfoP33zgHs2gy+g= sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha1-wMBY7dR8KlkBUacYmQUz/WKAPfQ= sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha1-Bza+u/13eTgjJAojt/xeAQt/jjI= sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs= sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha1-edAvlT9xHgbR+JScihPl09e6GmA= sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz", + "integrity": "sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE= sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz", + "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q= sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha1-2YRUqcN1PVeQhg8W9ohnueRr4f0= sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha1-a+DQ7gKhDZ4N56mLrmXhgskGH4U= sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha1-89qjVAhHuXN+vAJJnds2dl5U20o= sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha1-K2omozdzeo4UFvknLtB2axwDifQ= sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha1-iFXFooma8HLWrAXRHkYEWtDcYF0= sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/php-serialize": { + "version": "5.1.3", + "resolved": "https://registry.yarnpkg.com/php-serialize/-/php-serialize-5.1.3.tgz", + "integrity": "sha1-lbbh2Rlb2ZWaGAsocMzNcu8+4QU= sha512-p7zXX8xjGgddgP6byN+KmGKM0x6uoMZBRZteBa9LonqgrDV3LyMxUeGVX7RTFYwWaUAnTEsUWJfHI3N7eKvJgw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/pickleparser": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/pickleparser/-/pickleparser-0.2.1.tgz", + "integrity": "sha1-egPx6SBOkeybjvvTui8etZVbmU0= sha512-kMzY3uFYcR6OjOqr7nV2nkaXaBsUEOafu3zgPxeD6s/2ueMfVQH8lrymcDWBPGx0OkVxGMikxQit6jgByXjwBg==", + "bin": { + "pickleparser": "bin/pickletojson.js", + "pickletojson": "bin/pickletojson.js" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s= sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha1-MBiuMuz8/2wpuiJny/IRZqwfNrk= sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha1-EA7CNcwVDk/UJRlBJZaihRKg3vU= sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/polished/-/polished-4.3.1.tgz", + "integrity": "sha1-WgCuMnFWCfg9ifbzHQ8CYcYXBUg= sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha1-ibtjxvraLD6QrcSmR77us5zHv48= sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha1-UrOF8uYoI5aG6246FiB6Q/NgZMo= sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.9", + "resolved": "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.9.tgz", + "integrity": "sha1-aItPIlmcmu3TEm+XhYC0OkztAJ8= sha512-EZpoUlmbXQUpe+g4ZaGM2kjGlHrQ7Bjzb3xHcNrC9ysI1tGoib6DAYvxg6aB7MGxsjgLF+Qx/jwZQkJ5cKDvXA==", + "dev": true, + "dependencies": { + "@colordx/core": "^5.2.0", + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.11", + "resolved": "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.11.tgz", + "integrity": "sha1-0TyA50cy2EGJS6MVQQv6rpvnlUU= sha512-H+s7P0f9jJylSysAHs3/5MhAx7GthDO05uw1h56L2xyEqpiLTFLEqBNw3PUYzD5p/AKwWaigCXf6FGELpOw9lw==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.7", + "resolved": "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.7.tgz", + "integrity": "sha1-boIm6OgY43qYx7avXGaqe3MODRc= sha512-FJhE3fSte7HaRNL4iwD8LTG9vWqj3puxXIdig6LfrFqc1TJRUhY4kXOkeTXZZfTXYny+k+SO7fd2fymj1wduJg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.3.tgz", + "integrity": "sha1-ShxRIZofNHg4dEgp2xBk3rB1h3A= sha512-9cRxXwhEM/aNZon1qZyToX4NmjbFbxOGbww+0CnbYFDbbPRGZ8jg4IbM8UlA+CzkXxM35itxyaHKNqBBg/RTDg==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.2.tgz", + "integrity": "sha1-SvbnywiO+AdWSn5gv+jbMv64q80= sha512-NZFouOmOwtngJVgkNeI1LtkzFdYqIurxgy4wq3qNvIiXFURTZ3b/K7q3dP3QitlWQ5imHDQL0qSorItQhoxb1g==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.2.tgz", + "integrity": "sha1-qhKxj6Hy3H5tblH+Bi7YOWOTKcA= sha512-Ym01X4v6U3sY8X0P1J9P+RTar+7JyLTOzDrxKSeaArFsLmkVu4KcAKPBWDYRIyZ/q4jwpSPnOnekeSSqXSXKUw==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.6", + "resolved": "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.6.tgz", + "integrity": "sha1-sk8d+yl7GubRujOqiBdrI8IGnTw= sha512-lDsWeKRsssX/9vKFpingoRiuvGajtOGCJhs1kyaTJ5fzaVzs0aPPYe38UZ/ukMFEA5iuRIjQJHIkH2niYO3ubQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.10" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.10", + "resolved": "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.10.tgz", + "integrity": "sha1-a40sHg+nLPXARTVmEMhhCOta85c= sha512-UXYKxkg8Cy1so/evF7AE/25PNXZb3E0SrvjdbtbGf+MW+doLenKqRLQzz6YZW469ktiXK2MVLFWtel/DftCV0Q==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.2", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.2.tgz", + "integrity": "sha1-jYMdjd/nXVBiRR1W8Q02ox5cvqM= sha512-Z82NUmnvhPrvMUaHfkaAVBmWQq9F8Dox4Dy0LiwbaTxfmDUWLQtS+0WCgKViwdWCPPajiY9YzoQftgqKdXkM5g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.4", + "resolved": "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.4.tgz", + "integrity": "sha1-FFYVwjgunCbngKSDs+4JOWiEGbU= sha512-g8MNeNyN+lbwKy8DCtJ6zU6awBL0InBsSOaKmgZ1MdRLVItLQUNFNAzzzBnOp4qowOcyyB6GetTlQ0/0UNXvag==", + "dev": true, + "dependencies": { + "@colordx/core": "^5.2.0", + "cssnano-utils": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.8", + "resolved": "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.8.tgz", + "integrity": "sha1-XX9uMDu/I+vGiJnAsUQ6MMxDIdY= sha512-DIUKM5DZGTmxN7KFKT+rxt0FdPDmRrdK/k3n3+6Po+N/QYn06juwagHcfOVBG0CfCHwcnI612GAUCZc3eT+ZEg==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "cssnano-utils": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.1.0", + "resolved": "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.1.0.tgz", + "integrity": "sha1-V44qtfsbUVbE8Y19ZIYf9lb9Cuo= sha512-HYl/6I0aL+UvpA10t65BSa7h+tVjBgE6oRI5N/3ylX3vtwvlDL67G3FT3vYDPnTksxr0riiyJcT0tBtyRVoloA==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-api": "^3.0.0", + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha1-tEl8uFqcDEtaq+t1m7JejYnxUAI= sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha1-0VD0ODeDHa4l5AhVluhPb11uw2g= sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha1-G7zN3LOY8delEeCi0dBHcYr0B4w= sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw= sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.2.tgz", + "integrity": "sha1-DQs56i3yQK9JhfMf+kdpBnmnqaU= sha512-YoINoiR4YKlzfB95Y93b0DSxWy7FLw+1SADIaznMHb88AKizpzfF80tolmiDEbYr1UM4r4Hw+NZq37SwT5f3uw==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.2.tgz", + "integrity": "sha1-qQ9uxQOyxkQfBAQBCMWhI9fgq+E= sha512-wu/NTSjnp8sX5TnEHVPN+eScjAtRs18ELtEduG+Ek3GxjeUDUT+VAA3PJjVIXBcVIk6fiLYFj2iKH0q99S3T2Q==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.3.tgz", + "integrity": "sha1-edGFCZ2m0GsOtBeQjhVkupcIJZQ= sha512-1CJI++oA3yK/fQlPUcEngUfcSWS08Pkt9fK+jVgL53mmtHDBHi0YiuB0m3D9BXwZjmfvCc2GQmFqCAF/CVcPzQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.3.tgz", + "integrity": "sha1-R5x5w3HWhVM8c+9JHXrfmpdZ50w= sha512-RvImJ2Ml4LZSx31qC2C8LDiz65IgBNATtwEr9r3Aue+D0cCGbj4rjNojb/uGpEm4QxnOTzFqMvaDYuKiT1Cmpg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.2.tgz", + "integrity": "sha1-otIRHzILiPqFkhKGe+uN0fX56MA= sha512-FqtrUh2BU2MnVeLeWBbJ2rwOjuDnA91XvoImc1BbgMWIxdxiPTaquflBHsmFBA3xh3pC3wPZO9W5MaIc7wU/Xw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.2.tgz", + "integrity": "sha1-ULWxD5nwW8HZIMb/Rx8quXlLP78= sha512-5H5fpXBnMACEXzn7k9RP7qWZ1eWg8cuZkUuFygStY7icOj+UucwMWXeMmdkF/iITvTVa7fP85tdRCJeznpdFfQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.8", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.8.tgz", + "integrity": "sha1-MVsvAIqkqU0C3mfshNnpsc2Z+b8= sha512-imCM3cwK3hvlAG4z1AzYM24m8BPA3/Jk/S71wfbn2I6+E2b+UwFaGvlNqydihXTSl3OFPeQXztqCzg+NGeSibQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.2.tgz", + "integrity": "sha1-XVMKpySjHP1raLkE61Qv0a+ct9M= sha512-bLnNY7t76NLRb9QQyCVmCN4qwoHxiq6vABH/CXav9wTuR6dNGHGQ72AyO/+h2quWxZk3l7BqxNL1vtDi9H6y1g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.2.tgz", + "integrity": "sha1-65G9tz8EVw5PtwVUk+YbWu3Wn7c= sha512-TNSVkuhkeOhl36WruQlflxOb7HweoeZowSusNpfsM1+ZvqJ24Mc+xksu05ecMQxlu+0zgI8pyznO2EWqDCQbLA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.3.tgz", + "integrity": "sha1-itTMN1uSWJBPiO77/mqfE/P+Mbc= sha512-FTt6R9RF7NAYfpOHa2XFPm89FVuo5GiIbcfwOXFy1MYF38BeiNW9ke8ybw9Pk62eEsUlRVVbxHWA3B7ERYqOOA==", + "dev": true, + "dependencies": { + "cssnano-utils": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.8", + "resolved": "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.8.tgz", + "integrity": "sha1-gaOsl3ItVfQVy9GHNuWWsvyTMOQ= sha512-VeVRmbgpgTZuRcDQdqnsB4iYTeS2dBRV07UdwK6V3x61F1xTQ2pgIzHBIR4rQYRlXRNKBTGYYhEL1eNA7w9vaQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.2.tgz", + "integrity": "sha1-9A1jWlb2QXx+ArvrsL8ILU+E2Yg= sha512-OV5P9hMnf7kEkeXVXyS5ESqxbIls7a3TqFymUAV5JICO/9YCBEU+QQhQjZiDHaLwFdV7/CL481kVeBUk5FdY3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha1-510uDYQ/Yg5d9pB2Fm9OFviRy58= sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.1.2", + "resolved": "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.1.2.tgz", + "integrity": "sha1-Z//rspEFI8ujIYhzK76NgJW9qcI= sha512-ixExc8m+/68yuSYQzV/1DgtTup/7nI2dN9eiDS5GMRUzeCH4q9UcqeZPwcSVhdf8ay9fRwXDUHwcY5/XzQSszQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz", + "integrity": "sha1-Yv3OdgBqaOXBqzMU3JLoAOuD2QY= sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha1-hsrHARVhJysw5rHgQrps4EeqdRg= sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha1-43ucUIgLdTZsTUCsY9m7ys22Hw4= sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", + "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.6", + "resolved": "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.6.tgz", + "integrity": "sha1-/bsUxX67OvpLecCGhBzyPn0Uc7Y= sha512-cDxnYw1QuBMW5w3svZ0BlYF0IA4Amr+1JoTLXzu6vDFPNwohN2QU+sPZNx15b930LR7ce+/600h28/cYoxO9vw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha1-cjwJkgg2um0+WvAZ+SvAlxwC5RQ= sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y= sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.2", + "resolved": "https://registry.yarnpkg.com/prettier/-/prettier-3.5.2.tgz", + "integrity": "sha1-0GbGBTIA2gI0v4+h70UWir7YuRQ= sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s= sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha1-kKcD9G3XI0rbRtD4SCPp0cuPENY= sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha1-ykLHWDEPNlv6caC9oKgHFgt3aBI= sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha1-B0SWkK1Fd30ZJKwquy/IiV26g2s= sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234= sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha1-3SUk/LPDJrSTGyJy39HhqO2an1o= sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha1-2XCZadnU4WQD9vNIxjVTsZ8Jdak= sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I= sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg= sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha1-e1fnOzpIAprRDr1E90sBcipMsGk= sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha1-Z9h78aaU9IQ1zzMsJK8QIUoxQLU= sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha1-YWdVRfsjAC8kXGVA7EYHfU2j7Wk= sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha1-p0h1aK2tV3z6qn6IxJyrOrMIGro= sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz", + "integrity": "sha1-0N8qE38AeUVl/K87LADNCfjVpac= sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha1-9n+mfJTaj00M//mBruQRgGQZm48= sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha1-9ej9SvwsXZeCj6pSNUnth0SiDWI= sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha1-0XPPIyWCMZdsy9sFJHyXh5V2BPI= sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz", + "integrity": "sha1-/VVCbXEEA93MxF4PnqsW23cn7Ok= sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "dev": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM= sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha1-XWw070b4sqDogKj823Q+/Fv9vBo= sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "node_modules/rawproto": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/rawproto/-/rawproto-0.7.15.tgz", + "integrity": "sha512-SgrJHkOb5fxuVFMgzkhRoc7ZW5VYOW8bloZxmdWjnq24S1b2RJYKbOcJPiOKm6MpceiD0MP6D01YHOfJD1vQkA==", + "license": "MIT", + "dependencies": { + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "rawproto": "rawproto.cjs" + } + }, + "node_modules/rawproto/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08= sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/rawproto/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rawproto/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/re-resizable": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", + "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha1-eYKZ/VLd86PcySr8WGVThGNUTwE= sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha1-sPMIelhAkgq/i7IyXx/6RtjE0KI= sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-beautiful-dnd/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA= sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-beautiful-dnd/node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha1-CUiPu5QWpO/jc1tyNQVUQrBCSB0= sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-beautiful-dnd/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz", + "integrity": "sha1-wI9DBoJsSbXp3JAd7gRS6o/OYZc= sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/react-children-utilities": { + "version": "2.9.0", + "resolved": "https://registry.yarnpkg.com/react-children-utilities/-/react-children-utilities-2.9.0.tgz", + "integrity": "sha1-A97qAJ/J+hhXoU+zUa+mjYcPZG8= sha512-B3enhwcibIziobkMVccLd+6uIRoiCC9OZ1nR2B5sFCTnUYoGOCqgPOWUL+IC4S8IYaaN5AeF+SS0X1wernPdZA==", + "peerDependencies": { + "react": "18 || 17 || 16 || 15" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz", + "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-contenteditable": { + "version": "3.3.7", + "resolved": "https://registry.yarnpkg.com/react-contenteditable/-/react-contenteditable-3.3.7.tgz", + "integrity": "sha1-GN0fKBhBuiwrMG4tKCeLwxt5Ke0= sha512-GA9NbC0DkDdpN3iGvib/OMHWTJzDX2cfkgy5Tt98JJAbA3kLnyrNbBIpsSpPpq7T8d3scD39DHP+j8mAM7BIfQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "prop-types": "^15.7.1" + }, + "peerDependencies": { + "react": ">=16.3" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha1-R2LsKYhlkZuT7Am6aWIVgINbjoA= sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-docgen": { + "version": "8.0.2", + "resolved": "https://registry.yarnpkg.com/react-docgen/-/react-docgen-8.0.2.tgz", + "integrity": "sha1-RQ78rHWBPj1hTXvRXrQGbi57y/U= sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@types/babel__core": "^7.20.5", + "@types/babel__traverse": "^7.20.7", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.9.0 || >=22" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "resolved": "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", + "integrity": "sha1-AzQotKamOdBQrIuvKlGVxZZSFxM= sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", + "dev": true, + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha1-q6E94YnUrZoX9gUOdlVKwnWFx68= sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-draggable": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.1.tgz", + "integrity": "sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-draggable/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha1-OFG7dbJq8L8bF84USf2YDmQ7k1Y= sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha1-JV25KyMZcQh1eoiLAeW3KZGaveA= sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha1-6EtNRVsP7BE+BALDKTUnFRlvgfk= sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "node_modules/react-focus-lock": { + "version": "2.13.7", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.7.tgz", + "integrity": "sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.7", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.10.2.tgz", + "integrity": "sha512-Ytdx2dh6yoCc2HI4Y7u5bI1xF1oeeRud52v8zQdGsyxyVC5W/dwcgQGp+CCpoLGQegwKHybH8diVj+Qn23y+hA==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.5", + "react-focus-lock": "^2.13.7", + "react-remove-scroll": "^2.6.4", + "react-style-singleton": "^2.2.3", + "tslib": "^2.3.1", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-hotkeys-hook": { + "version": "3.4.7", + "resolved": "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz", + "integrity": "sha1-4WoKhfWf7tn0jRLPrxZtffTJa3o= sha512-+bbPmhPAl6ns9VkXkNNyxlmCAIyDAcWbB76O4I0ntr3uWCRuIQf/aRLartUahe9chVMPj+OEzzfk3CQSjclUEQ==", + "dependencies": { + "hotkeys-js": "3.9.4" + }, + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" + } + }, + "node_modules/react-i18next": { + "version": "13.5.0", + "resolved": "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.5.0.tgz", + "integrity": "sha1-RBmPdHYoJnoRXFZfDHNqUKdrGrA= sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha1-/KpwIFaOwga8BL429Oto5kfE2MI= sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha1-TxonOv38jzSIqMUWv9p4+HI1I2I= sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loading-skeleton": { + "version": "3.5.0", + "resolved": "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", + "integrity": "sha1-2iCQNVtN7crVxTyz8O02Tjp21so= sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha1-c9iLiSxsaMu3pm4IAPqjdPTDiwY= sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/react-monaco-editor": { + "version": "0.59.0", + "resolved": "https://registry.yarnpkg.com/react-monaco-editor/-/react-monaco-editor-0.59.0.tgz", + "integrity": "sha1-o83vSkf9DLiZ9BLJ1ms2XFGnYJY= sha512-SggqfZCdUauNk7GI0388bk5n25zYsQ1ai1i+VhxAgwbCH+MTGl7L1fBNTJ6V+oXeUApf+bpzikprHJEZm9J/zA==", + "peerDependencies": { + "monaco-editor": "^0.52.0", + "react": ">=16.8.0 <20.0.0", + "react-dom": ">=16.8.0 <20.0.0" + } + }, + "node_modules/react-property": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha1-IVa6nYX6R0H68ZGLOO/B6uPGoTY= sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.yarnpkg.com/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha1-owETu22VwKcV1U3aQwjUUPymzgk= sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha1-cYYzN63D5cL4pr/d0Srjv+Mqr78= sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha1-mcIPkI7kZ7OFtoo0abSj51ABIiM= sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable-panels": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz", + "integrity": "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==", + "license": "MIT", + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-rnd": { + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.5.3.tgz", + "integrity": "sha512-s/sIT3pGZnQ+57egijkTp9mizjIWrJz68Pq6yd+F/wniFY3IriML18dUXnQe/HP9uMiJ+9MAp44hljG99fZu6Q==", + "license": "MIT", + "dependencies": { + "re-resizable": "^6.11.2", + "react-draggable": "^4.5.0", + "tslib": "2.6.2" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha1-jKJS1w/MN4QeMUc8ehUc93eIe7U= sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha1-LtYv/YjK5tsTREX0oMCui5HS5eY= sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha1-XcB1Osv4Uhyi4PE3tFeLkXsQzyQ= sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha1-QmVgi+aaTXDP4wR/LGyIssOs44g= sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-toastify": { + "version": "10.0.4", + "resolved": "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.4.tgz", + "integrity": "sha1-bs27+SOgf8RYUOabBWbvx79zMoM= sha512-etR3RgueY8pe88SA67wLm8rJmL1h+CLqUGHuAoNsseW35oTGJEri6eBTyaXnFKNQ80v/eO10hBYLgz036XRGgA==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha1-7tOXyf2L2IK/sY3qtxAgSaLzKZk= sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-virtualized": { + "version": "9.22.5", + "resolved": "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha1-v7lv7VGd43i1DYwAZLkplLO5FiA= sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", + "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-vtree": { + "version": "3.0.0-beta.3", + "resolved": "https://registry.yarnpkg.com/react-vtree/-/react-vtree-3.0.0-beta.3.tgz", + "integrity": "sha1-mi38MfpzDDnRmw3/ep34Hq2Ba9U= sha512-BGC8kOT2Ti3rne0Nwu+n90TAo8lbYiWT36Cu47aj6bz+Bs7k5p3EVgBTinyuCdU5+n4a9wJOXHAdop/zsR1RAA==", + "dependencies": { + "@babel/runtime": "^7.11.0", + "react-merge-refs": "^1.1.0" + }, + "peerDependencies": { + "react": ">= 16.8", + "react-dom": ">= 16.8", + "react-window": ">= 1.8.5" + } + }, + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-window-infinite-loader": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/react-window-infinite-loader/-/react-window-infinite-loader-1.0.10.tgz", + "integrity": "sha512-NO/csdHlxjWqA2RJZfzQgagAjGHspbO2ik9GtWZb0BY1Nnapq0auG8ErI+OhGCzpjYJsCYerqUlK6hkq9dfAAA==", + "license": "MIT", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha1-lZxGN9qpMigKm5EbGmdmp+RCiPw= sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-installed": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc= sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha1-aZKytmxxdyWf646qxzw6zSi5Iio= sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc= sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s= sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps= sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha1-jUVAe0+HCg3K68DihnDRjnRRQwk= sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha1-+/H3GnJ4kdaFuxeG+bp0CE9uL5E= sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz", + "integrity": "sha1-iIVXC7KM93O6HcYA2n9QL3iD9z8= sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "dev": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha1-Sfhm4NMhRhQto62PDv81KzIV/yI= sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz", + "integrity": "sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8= sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz", + "integrity": "sha1-l/omiBzldGUAElWF1WQsd7bpRHs= sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-mock-store": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.5.tgz", + "integrity": "sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.isplainobject": "^4.0.6" + }, + "peerDependencies": { + "redux": "*" + } + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha1-lKpuBJd8MOFOiS6uhJeMGvYFj/M= sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.yarnpkg.com/refa/-/refa-0.12.1.tgz", + "integrity": "sha1-2sE8R4LcIra65szoGiuGOIjqOcY= sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha1-xikhnnijMW2LYEx2XvaJlpZOe/k= sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha1-rDGPWgcV6teQ/PsMcfTdg9l3k1o= sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.yarnpkg.com/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha1-wOJMsqkPbq3Uy6q6EpMX4p0pxII= sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha1-GtbGLUSiWQB+VbOXDgD3Ru+8qhk= sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha1-ZtXo1xiK2i0xvBN7wZoQAM8sa34= sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha1-m5vxiEUa1vY3lreE/h9RFlxntzo= sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha1-LsHrxWxqugeQXTtEcL3w9oTzC3U= sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha1-HHAgkKFSXaW4DhWo+WPvLII2ysc= sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-emoji/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/remark-emoji/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha1-MyJ7KnQ5dnDTV78FwJjq+FE/DWs= sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha1-qmB0P8s36/awaSBOtNowTkDbRaE= sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha1-Kt2q3agMqb2aoNp2PnTRYydoOzc= sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha1-1/+EykmaV+LAYK5nVIrZUOaJoFM= sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha1-Z48gq1yhIHqX1+qKOINzyc+Ja+Q= sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha1-NlKrHEllMYUr9VprrFevmB68OKs= sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha1-TFsB3XEcJp3xqq4RdD634udjb9M= sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha1-X9gj5NaVHTc1jsyaWLHwaDa2Joo= sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha1-23EpsoRmYv2GKM/ElquytZ5BUps= sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc= sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha1-84DvdmQzLSbqBsHLoEvbvcqpVfE= sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==" + }, + "node_modules/resolve": { + "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" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0= sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha1-mdAiJNPPJjaJvsuzk7xWAxMCXc0= sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha1-+Mk0uOahP1OeOLcJji42E08B6AA= sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha1-B2bZVpnvrLFBUJk/VbrwlT6h6+c= sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha1-nxbJLYye9RIOOs2d2ZV8zuzBq2A= sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rettime": { + "version": "0.10.1", + "resolved": "https://registry.yarnpkg.com/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha1-zIu5hwND8oKxguWidomcCLlJFL4= sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha1-d492xPtzHZNBTo+SX77PZMzn9so= sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha1-7N4HUET38wEYaCvZ+z8SMQlXf5o= sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.yarnpkg.com/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha1-tKoryzpeFDe1+tQNQ/5C1L3npC0= sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.12.0", + "resolved": "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", + "integrity": "sha1-ZhVCGRznjuTzeJlSlyYNDB77EwI= sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", + "dev": true, + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha1-qbvnBcnYhG9OCP9nZazw8bCJhlY= sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha1-1TuGrLcfQmUP4j3is8G2trNLkpQ= sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha1-lVvEc+2K8RoAKivlIHG/R1Y4YHs= sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha1-yeVOxPYDsLu45+UAel7nrs0VOMM= sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha1-AYUOmBwWAtOYyFCB82Dk5tA9J/U= sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha1-f4fftnoxUHguqvGFg/9dFxGsEME= sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sass": { + "name": "sass-embedded", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.75.0.tgz", + "integrity": "sha512-8ZhQYJSCcjMRClyPpA09ZQ9p0Q9NtYxfMbhifBgUoQZC47Co5QJa0ykhfV/SY6mIqK7aAhMF7NAD5h0MEe2vpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^1.0.0", + "buffer-builder": "^0.2.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.75.0", + "sass-embedded-android-arm64": "1.75.0", + "sass-embedded-android-ia32": "1.75.0", + "sass-embedded-android-x64": "1.75.0", + "sass-embedded-darwin-arm64": "1.75.0", + "sass-embedded-darwin-x64": "1.75.0", + "sass-embedded-linux-arm": "1.75.0", + "sass-embedded-linux-arm64": "1.75.0", + "sass-embedded-linux-ia32": "1.75.0", + "sass-embedded-linux-musl-arm": "1.75.0", + "sass-embedded-linux-musl-arm64": "1.75.0", + "sass-embedded-linux-musl-ia32": "1.75.0", + "sass-embedded-linux-musl-x64": "1.75.0", + "sass-embedded-linux-x64": "1.75.0", + "sass-embedded-win32-arm64": "1.75.0", + "sass-embedded-win32-ia32": "1.75.0", + "sass-embedded-win32-x64": "1.75.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.75.0.tgz", + "integrity": "sha512-3GNCfVEw2D34aEntYHv1+VFb0fOsU2nJdz/kpHXDlE7m/zIsi9ySn9WhvYlXkNQKBXvHRf8mWrU2/mC0QXTxxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.75.0.tgz", + "integrity": "sha512-puVKsTovpqntG0b/jjxg6+jWD907UEnc/oJ1ia89KRkvLOPD8kE+EYzxxRYrgaG2tiGSMZNuOmYcAKfQNdLdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.75.0.tgz", + "integrity": "sha512-SObSy6USALhGQoX/Lu1Gctwsb6Ob4Hkg1ISHSV8SNHeWIko4ZiHbAb1r9UMJtRznyawvZ6fjKgOY5fLJAfk3xQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.75.0.tgz", + "integrity": "sha512-CCroBmmwbVZbwOXzFg6GdbOwcczhtjJ/75cfpAoku0InDJzxCP+sVJz8LL16rLWDsVveDoXX7JKFw9Nb9zQyjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.75.0", + "resolved": "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.75.0.tgz", + "integrity": "sha1-CCQ5G7eIS1U0qKLjuek7RAJtcDE= sha512-lb7Wkq69+AfD/tnopRX9RSu3d99Gsu1iIAhs3GyMh2N2AnVooASqKJ6I3IAbKnGh+MkXOISsoeyTP4hSnPyuqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.75.0.tgz", + "integrity": "sha512-Lw02PAS0bY7Q4v2fWxlFUU/T/1AV49H2+Oirxtij5nF8rTgjNHlr/7cOQp/f8bRdG5SnPhJspy//c6K8X7cF9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.75.0.tgz", + "integrity": "sha512-s4yDbv/MEMVWr6E6uk7T/Fh4iX71NQDBDVQ/tbq4+VgF/SAo2YdnW1p97zwJjqwxNgIo76o21HaZO4rs66Ur8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.75.0.tgz", + "integrity": "sha512-v1d1Zzje46dXzRFm594RfkwdFnbPz1vlxM5vtLoz2d/r+TijhpVzNyy4dY4Dz0MEIcAU+edzB2P9MIHdX9yP9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.75.0.tgz", + "integrity": "sha512-fxpWoX9Bc4rSA863aehnPPibiIRisSBktqKY5vkQnTg4L7SDxPwXMvHeL0LZQOG1t6+baSnjhOUZSjfwbl09MQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.75.0.tgz", + "integrity": "sha512-mVczW2hkGxXAs8I7H+m4bfZZIHd9tFR+UA2mHI+XkLE+cjyPC2FuWokc+WXyaWpqbE/KDSwqgSqY08zND7gcbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.75.0.tgz", + "integrity": "sha512-5ZlghwIG82spTNvutXbyXRC2cOMx7TZdWoiEqZ5QXuhChB35AHk43Ex1CdItPOLX0JjRv5eSuSelCY4nBGDe8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.75.0.tgz", + "integrity": "sha512-8RjKtvc1F9xP1hr+ht72CawkSr7/fZMSAhE/TORFncsPKpwN2WGqkoTBXdL22WGwi95ZAz5Zr2ZnGy8OXMDprQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.75.0.tgz", + "integrity": "sha512-bsuOEy6rjIwfc7qihDSrEnmaePUn8bR5NAAzeljlfQkRFRxivB1gysQfRPjLPbheJfChFDLiiFX2z2CQkcdKuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.75.0.tgz", + "integrity": "sha512-L7x3orLODCRds6PpDfrb6bbh6IdqHDzcwyt6VkcbTN+KtbMI4PfNGKHeo7f2K8wMbCiFK3BGJqMSPxNRuVp19A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.75.0.tgz", + "integrity": "sha512-wdVHtJBVykRWA2YEYsJ1bLf9sjcwa9BhHRzf03nSwS88Vc7GmflY6HyuY2Ynz+dWoth7MelgJL/XlonOs5y6/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.75.0.tgz", + "integrity": "sha512-q/uE8q8PLG7Y7mcP1Lsiwg+6FwShj8dLk76Fa2FB68odLn42/aZ2eDHbpy+bbMgAqZqlcDDsqbCDHF9O3d0KrA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.75.0.tgz", + "integrity": "sha512-lIT3ziKm2L9XGwP3S1D0Kk9ySJ6lVBLm+GZ2goQi8cAWepHSnmRz+mcd/AEqxDGEvrgNmmmvu3ylwlJ/6Nrm9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.5.0.tgz", + "integrity": "sha1-tVSbZxBpt6o5LfVex1dM9BEXnrg= sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha1-/ltKR2jfTxSiAbG6amXB89mYjMU= sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha1-9QqIh3w8AWUqFbYirp6Xld96YP4= sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha1-wyEem/xVR/yGseq6o07RplcGAVU= sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, + "node_modules/semifies": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semifies/-/semifies-1.0.0.tgz", + "integrity": "sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==", + "license": "Apache-2.0" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "7.0.5", + "resolved": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha1-x5jMBVL/uwiYGRSkKodW4znQ1bE= sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "dev": true, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha1-qscjFBmOrtl1z3eyw7a4gGleVEk= sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha1-FqcFxaDcL15jjKltiozU4cK5CYU= sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha1-B2Dbz/MLLX6AH9bhmYPlbaM3Vl4= sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M= sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha1-GI1SHelbkIdAT9TctosT3wrk5/g= sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k= sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0= sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I= sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo= sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ= sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha1-1wuSvat9bZDf1zkxGVowtuPXzrs= sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha1-XdmnJcV4405EnzMnA+sqdORqKbA= sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha1-E01oEpd1ZDfMBcoBNw06elcQde0= sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha1-Md3BCTCht+C2ewjJbC9Jt3p4l4c= sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw= sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha1-YnF+3UajGMkYEltX6S3H+Ltxw0w= sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-mock": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/socket.io-mock/-/socket.io-mock-1.3.2.tgz", + "integrity": "sha1-P29W+bwqKFJ4O9iq6FFZ3vXNGUI= sha512-p4MQBue3NAR8bXIHynRJxK/C+J3I3NpnnpgjptgLFSWv4u9Bdkubf2t0GCmyLmUTi03up0Cx/hQwzQfOpD187g==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0= sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4= sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM= sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha1-HOVlD93YerwJnto33P8CTCZnrkY= sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8= sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha1-hfMsPRDZaCAH6RdBTdxcJtGqaJk= sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz", + "integrity": "sha1-LFXxFzYgeNdAnm17CM5wqFfNPtc= sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha1-T1qwZo8AWeNPnADc4zF4ShLeTpw= sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha1-cYmkdMRvjUfHsNpLmHu0XpCL0tU= sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz", + "integrity": "sha1-h1c5J7pR6Ss/RVCrYL/IPdB7rCA= sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", + "dev": true + }, + "node_modules/spdx-satisfies": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz", + "integrity": "sha1-mgmmjYD18aMc+uuzhLDGAJ5Jaf4= sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==", + "dev": true, + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08= sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha1-uIGgBMjBSaXo7+831RsW5BKUMxA= sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha1-4SOxaojhQxObCcaFIiG8mBWRff4= sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha1-j3XuzvdlteHPzcCA2llAntQk44I= sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha1-mYqzuamIZh5gNqm/3Jb0Nkno6D4= sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha1-9IH/cKVI9hJNAxLDqhTL+nqlQq0= sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "9.1.19", + "resolved": "https://registry.yarnpkg.com/storybook/-/storybook-9.1.19.tgz", + "integrity": "sha1-ULd1BTTIxh+TTZwh/m2QTaaMfVQ= sha512-P7K/b+Pn1sXJzwYCF6hH5Zjdrg4ZlA5Bz9rdOJEdvm6ev27XESDGI+Ql+dfUfUcGOym3Aud4MssJIDEF2ocsyQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/spy": "3.2.4", + "better-opn": "^3.0.2", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", + "esbuild-register": "^3.5.0", + "recast": "^0.23.5", + "semver": "^7.6.2", + "ws": "^8.18.0" + }, + "bin": { + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha1-FgLs6BxRV0yjnGgV4J8aPoVQvZM= sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha1-K20O8ktlYnTZV9VOCku/YVPcArY= sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha1-qKjce9XBqCubPIuH4SX2aHG25Xo= sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha1-7O7yEoNkB2GoHb4W1scXGk7ffZI= sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha1-bIh0DkmtSVaxMyqRHpSVg6J11MA= sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha1-6Qhy7gMIspQ1qiYnX24bdi2u4Bo= sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha1-QLLdXulMlZtNz7HWXOcukNpIDIE= sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha1-YuJzEnLNKFBBs2WWBU6fZlabaUI= sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha1-fug03ajHwX7/MRhHK7Nb/tqjTd4= sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha1-z6vXA50irTDzzENbDKLBV0/Ijvg= sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha1-dryDqQc4kB17wiOp6TdZ/dVgEls= sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha1-NaNp7CrEPfNW4+3V3Ou2Qpqh+lw= sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE= sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha1-lmlgL9RpB0DqrsE3eZoDrdu8OTw= sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-to-js": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.1.tgz", + "integrity": "sha1-QXeGmGzaYdRSXICu2dESOmp6+bg= sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==", + "dependencies": { + "style-to-object": "0.3.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha1-sbeQ0gWZHMeDgBlnIUl57hmnbkY= sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "5.3.11", + "resolved": "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha1-n9p78RCOOb8/PmEvzBgXDe3NV6g= sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "7.0.10", + "resolved": "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.10.tgz", + "integrity": "sha1-H96re7QMhQdOYChvgFNwDZ10Nsw= sha512-sRJ7klmhe/Fl5woJcbJUa2qP1Ueffsl1CQI4ePvqXLkZmcIuAt09aP9uT/FOFPqXh9Rh8M5UkgEnwTdTKn/Aag==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.2", + "postcss-selector-parser": "^7.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.5.10" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha1-Y3fplnlauwttNI6bPh37JDRajkI= sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/superagent": { + "version": "3.8.3", + "resolved": "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha1-Rg6g29t9WxG8T3jeulZfhqF44Sg= sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/supertest": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz", + "integrity": "sha1-wiNNvdbcebbxW5nI1ld7kOTOPzY= sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw= sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha1-btpL00SjyUrqN21MwxvHcxEDngk= sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha1-/cLinhOVFzYUC3bLEiyO5mMOtrU= sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.4.tgz", + "integrity": "sha512-GsNRis4e8jxn2Y9ENz/8lbJ93CstG8svtMnuRaHbiF2LTJ5tK0/q3t/URPq9Zc7zVWBJnNnJMIp6bevK7bSmNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I= sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.11.8", + "resolved": "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz", + "integrity": "sha1-sqqumYpO9H3tYHc60G58uCH1VFc= sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha1-8tFszNAfQA44Y1xxga3+CtllpKI= sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==" + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha1-oLWRfChky6VIQUlav6P2sT7c9NY= sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha1-XafJmSxGA4IhJnmFqyhCGoh58WA= sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.20", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", + "integrity": "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-mini": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/tar-mini/-/tar-mini-0.2.0.tgz", + "integrity": "sha1-KyzcIV9bg7CrjONj3J3tIt5RhJs= sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==", + "dev": true + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha1-AOLeRDY57Q14/YfeDSdGn7z/tTM= sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz", + "integrity": "sha1-6++45bhXnZMRG/38OdLPY4efSoI= sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha1-2SuOLIkt0JxoPDgSA5Qmfo2GYO8= sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@types/node": { + "version": "24.13.0", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz", + "integrity": "sha1-jTV7uur8zWNp2d5ChGfWm+/cyxk= sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY= sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha1-jRRvCQDolzsQa29zzB6ajLhvjbA= sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha1-WxhQkS+jHfkHFpY9RdkSH9/An0Y= sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha1-ILO6SQasIJlOJ1u8r9aNUQJkwqI= sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI= sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha1-bBBZBUNeM3hXN1ydL2ymPkU/9WU= sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==" + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha1-+JXoNuRZkGJAhmAXmOqY6PNu5kM= sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "deprecated": "no longer maintained", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha1-RmgLeoc6DV0QAFmV65CnDXTWASc= sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha1-s7An/dOJ/4GhUsjoR+4vW+n617U= sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q= sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tinyexec": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha1-4f9F36YNHe25G3NJVrePbCo+ghs= sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha1-4ijdHmOM6pk9L9tPzS1GAqeZUcI= sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha1-lQmyFiQ2MV6A4+7g/M5EdNJEQpQ= sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha1-13oAL7U6iKoUKbQZwckkkuDIH3g= sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.17", + "resolved": "https://registry.yarnpkg.com/tldts/-/tldts-7.0.17.tgz", + "integrity": "sha1-ps3AZ7noDqBfO+RxwOpBBojMeLI= sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==", + "dev": true, + "dependencies": { + "tldts-core": "^7.0.17" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.17", + "resolved": "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.17.tgz", + "integrity": "sha1-2t/uN1DdJy7SGdc2e+t8uy/ynrg= sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.yarnpkg.com/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha1-JvTbEdFgHOgBLcuKeY7OHAapkFk= sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha1-ujo9YAyRWxqXhyNI95wSdHX2rPg= sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha1-pJX4M4NmCe2YPBm8ZWOc+861THY= sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha1-VVxOKXqVBhfo7t3vYzyH1NnWy/k= sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha1-TKCakJLIi3OnzcXooBtQeweQoMw= sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha1-TjHGpGOszQlDh58wZnxP2v9BG7g= sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim": { + "version": "0.0.3", + "resolved": "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz", + "integrity": "sha1-BSQ6R6OkET5rSTZ4gKnMpZaXogs= sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg==", + "deprecated": "Use String.prototype.trim() instead" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha1-2ALjMqB9+GHEiALAQyEBexvYczg= sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha1-vUq77HzIgEYvELLItc4djR7HwsA= sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz", + "integrity": "sha1-D3tRGk/eZaRvGEd6s4hJsixVSHY= sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha1-v8IhX+ZSj+yrKw+6VwouikJjsGQ= sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha1-OeS9KXzQNikq4jlOs0Er5j9WO7U= sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha1-WRo8EI4fXr0BPTFSFCy1Rys5nWM= sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha1-Y9WRKoYxLx++Ms7whZ+4shk9m4k= sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha1-qbvnBcnYhG9OCP9nZazw8bCJhlY= sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-mockito": { + "version": "2.6.1", + "resolved": "https://registry.yarnpkg.com/ts-mockito/-/ts-mockito-2.6.1.tgz", + "integrity": "sha1-vJ7iYZAzk05vrRxEVayltazjTnM= sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.5" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha1-UpnsYF5VsauyPsk57xXtr0gwcNQ= sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha1-PGiSxecxnBRu7h5zAu2ebyvk92M= sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha1-73jhkDkTNEbSRL6sD9ahYy4tEHw= sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha1-Y9mNYPIbMTt3xNbaGL+mnYDh1ZM= sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8= sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsx": { + "version": "4.23.11", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.11.tgz", + "integrity": "sha512-Ry2oTEUnhBdeEdWIztY8kf3/nBGnPnjMLVGL0YfdRXMORuPER5NlKmayqxtxRxwB1xBN+RivRaJfe7PM1rtiyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha1-rkUyWWDVlQzWlR5PlzlvTh/32NM= sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha1-Xe40f/s+OHQhKjWmmDawd7HObZY= sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE= sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha1-UC96ADtzCelqfhcFLMKrLH5cejE= sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha1-pyOVRQpIaewDP9VJNxtHrzou5TY= sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha1-hAegT314aE89JSqhoUPSt3tBYM4= sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha1-rjaYuOyRqKuUUBYQiu8A1b/xI1U= sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha1-7k3v+YS2S+HhGLDejJyHfVznPT0= sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha1-CVl5+bzA0J2jJNWNA86Pg3TL5lo= sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha1-jZ0snt7qhGDH81AzqIhnlEk00eI= sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha1-KTV6iee3ykrvO/D9P9DNc4hCKek= sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha1-bJtQPytBsmIzDIDpHIYUq9qmnCI= sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha1-G7mlHII6r51zqL/NPRoj3elLDOQ= sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz", + "integrity": "sha1-9mZ3YQpcCp7pDKsrjU1mA3Am2eE= sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha1-NlKrHEllMYUr9VprrFevmB68OKs= sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha1-d2SHEbXYavCULzNDl6M8XpFRZDY= sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha1-WrUfaJ4pkqRyvrGzXyzn/y8yTUs= sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha1-l25fRip6Xec9lLcGusG5BnG1d5c= sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha1-HELuYwH41S9H0U9iu9t5ZXH6LUc= sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha1-XRnKef26cSMBmZsrc1U8qPOzUsw= sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha1-w3A4kxRt9HIDu4qXla9H17lxIIw= sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha1-ZabOaY94prD1aqDojxOAGIbNrvY= sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha1-zOO/oc34W6c3XR1bF73Eytqb2do= sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha1-mioosKp2oV4NpwoIpYY6LwYOJGg= sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha1-d333+5hlLOFrS3zZmdChpA76OgI= sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha1-0KP4by3Q23rNfYwkeAgLXGf5xqk= sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha1-0KP4by3Q23rNfYwkeAgLXGf5xqk= sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc= sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.yarnpkg.com/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha1-qETS48OxSkrClFxCvoBAkyG2EZk= sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha1-RH8VMf3XuytMepiGm9saTCojhl8= sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha1-K8lHuVNlJIfkYAlJ+wkeOujNkZs= sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/unused-filename": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/unused-filename/-/unused-filename-2.1.0.tgz", + "integrity": "sha1-M3GcTo2WRPMtLewbyFJcaq60ulE= sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg==", + "dependencies": { + "modify-filename": "^1.1.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unzip-crx-3": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", + "integrity": "sha1-1TJBR7EEqK7ZroY5yVUh9vfNopI= sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", + "dev": true, + "dependencies": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + } + }, + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", + "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha1-KFBekFyuFYzwfJLKYi1/I35wpOI= sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha1-nTwvc2wddd070r5QfcwRHx4uqcE= sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE= sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha1-mNn6sGcHWEHFssaFIJDV0P6r4r8= sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha1-L9LkOiFp6rx0lpYKzox57++XXpk= sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha1-EOf9iX0TC4luLFRsY6XoIz0A79s= sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha1-sXS/plyytSZzLZ8qwKQIAnh28y0= sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz", + "integrity": "sha1-XxemBZtz22GodWaHgaHCsTa9b7w= sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util-extend": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha1-CviDIgFj0mT/4MCE9riom5Zmlm0= sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha1-Yzbo1xllyz01obu3hoRFp8BSZL8= sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU= sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo= sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha1-Hgt5THNMXAyt4XnEN9NW2TGjTWw= sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz", + "integrity": "sha1-mIHrDOj+rqZRJDnRnd+Ev1UWYdA= sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ= sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha1-2OQfvL1AYGNmnr9sM9Vq6HIdDzw= sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha1-h7RN3de3DwZBwuPtCGS6c+LqjfQ= sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha1-RJxuIaiA4IVb9aq63rOnQDFKusI= sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo= sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/virtua": { + "version": "0.36.3", + "resolved": "https://registry.yarnpkg.com/virtua/-/virtua-0.36.3.tgz", + "integrity": "sha1-GttFiq+kU7ukQDzDt+FtJHDzsF4= sha512-W5LovCjIJPT7plfka9r6XZIlsHxNbEyw9m9uTKdlB+R9+AoldsT+RFVW2/iVqHU8pmHv8csc3yw25A77OD5wwg==", + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0", + "solid-js": ">=1.0", + "svelte": ">=5.0", + "vue": ">=3.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "solid-js": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.yarnpkg.com/vite/-/vite-6.4.3.tgz", + "integrity": "sha1-haFk23znBvKndoEu+is0DxchhY4= sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-bundle-visualizer": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/vite-bundle-visualizer/-/vite-bundle-visualizer-1.0.1.tgz", + "integrity": "sha1-Vt2IlCyUFZISE9R/DngnQyUznHg= sha512-JdUu5viGyw7K1HMstqaAN7y1rnNz93srGeF7FJgFCzM7NL1nH/QlpywDA296qv/KjPPPsq60mOJhtXddikVKSA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "import-from-esm": "^1.3.3", + "rollup-plugin-visualizer": "^5.11.0", + "tmp": "^0.2.1" + }, + "bin": { + "vite-bundle-visualizer": "bin.js" + } + }, + "node_modules/vite-plugin-compression2": { + "version": "2.5.3", + "resolved": "https://registry.yarnpkg.com/vite-plugin-compression2/-/vite-plugin-compression2-2.5.3.tgz", + "integrity": "sha1-zYtPjg/Lwh2TezuPOYlb3UdcXdk= sha512-ItPgqQWkcnBbVw7is9OKwiZ8v6+ju9rYROl5Lp6QfQDEx/d55AwJQb/KLpsQqsU9HoigYBsZ8tK6I02UwJNvEw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "tar-mini": "^0.2.0" + } + }, + "node_modules/vite-plugin-ejs": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/vite-plugin-ejs/-/vite-plugin-ejs-1.7.0.tgz", + "integrity": "sha1-wCKXKdWibp61e4q63HX3Bw1HDSM= sha512-JNP3zQDC4mSbfoJ3G73s5mmZITD8NGjUmLkq4swxyahy/W0xuokK9U9IJGXw7KCggq6UucT6hJ0p+tQrNtqTZw==", + "dev": true, + "dependencies": { + "ejs": "^3.1.9" + }, + "peerDependencies": { + "vite": ">=5.0.0" + } + }, + "node_modules/vite-plugin-electron": { + "version": "0.28.6", + "resolved": "https://registry.yarnpkg.com/vite-plugin-electron/-/vite-plugin-electron-0.28.6.tgz", + "integrity": "sha1-mLzykRed+9/vQH+IHLseHVgknFc= sha512-DANntooA/XcUQuaOG7tQ0nnWh8iP5yKur2e9GDafjslOPAVZehRyrbi2UEI6rlIhN6hHwcqAjY+/Zz8+thAL5g==", + "dev": true, + "peerDependencies": { + "vite-plugin-electron-renderer": "*" + }, + "peerDependenciesMeta": { + "vite-plugin-electron-renderer": { + "optional": true + } + } + }, + "node_modules/vite-plugin-electron-renderer": { + "version": "0.14.6", + "resolved": "https://registry.yarnpkg.com/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.14.6.tgz", + "integrity": "sha1-RfpQctKtObyqbT7t8J9bueBKwKQ= sha512-oqkWFa7kQIkvHXG7+Mnl1RTroA4sP0yesKatmAy0gjZC4VwUqlvF9IvOpHd1fpLWsqYX/eZlVxlhULNtaQ78Jw==", + "dev": true + }, + "node_modules/vite-plugin-istanbul": { + "version": "7.1.0", + "resolved": "https://registry.yarnpkg.com/vite-plugin-istanbul/-/vite-plugin-istanbul-7.1.0.tgz", + "integrity": "sha1-8avUPTjLCUodrp04OyjmahEUH5E= sha512-md0774bPYfSrMbAMMy3Xui2+xqmEVwulCGN2ImGm4E4s+0VfO7TjFyJ4ITFIFyEmBhWoMM0sOOX0Yg0I1SsncQ==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.1.0", + "espree": "^10.3.0", + "istanbul-lib-instrument": "^6.0.3", + "picocolors": "^1.1.1", + "source-map": "^0.7.4", + "test-exclude": "^7.0.1" + }, + "peerDependencies": { + "vite": ">=4 <=7" + } + }, + "node_modules/vite-plugin-istanbul/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha1-TP6mD+fdCtjoFuHtAmwdUlG1EsE= sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vite-plugin-istanbul/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz", + "integrity": "sha1-1U9JSdRikAWh+haNk3w/8ffiqDc= sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vite-plugin-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha1-qbvnBcnYhG9OCP9nZazw8bCJhlY= sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/vite-plugin-react-click-to-component": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/vite-plugin-react-click-to-component/-/vite-plugin-react-click-to-component-3.0.0.tgz", + "integrity": "sha1-vSLQIQyiRb8AtROtT28oBlzJiIA= sha512-ErVBJDIpq2WfjIrBKwIvGVN7QlsXb2MEqO+IBy15akoVpL4J0b7hBNQzPS74ZrJAmtNkvmE0lHyaQk7Whj1YGQ==", + "dev": true, + "peerDependencies": { + "react": ">=16", + "vite": "^4 || ^5" + } + }, + "node_modules/vite-plugin-svgr": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", + "integrity": "sha1-nzv1IGsOxRAoflbRbxkV5ym7Tms= sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4 || 5" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha1-9D36NftR52PRfNlNzKDJRY81q/k= sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha1-hkqLjzkINVcvThO9n4MT0OOsS+o= sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha1-CCKgAOfU3AgzElgNdXX+njui4r8= sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha1-MnNnbwzy6rQLP0TQhay7fwijnYo= sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha1-F3CTjT5yWIZZoXLQ/UZCeACD/58= sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha1-rr3ISSDYBiIpNuPNzkCOMkiKMHM= sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz", + "integrity": "sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha1-RzvacvCFBFPaZCUIHqRvwNdgKUc= sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha1-vJij3mDa3X+u/EA9EHbVKfXgMOw= sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha1-IHO5Gi/bH7+9QB594KyfghTOy0s= sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha1-JWtOGIK+feu/AdBfCqIDl3jqCAo= sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.yarnpkg.com/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha1-lL1B612/Buk74WW6i+QbgmDU+xo= sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha1-YzryhiwhNzC+Pb30BFbbFxtg1b0= sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.12", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.12.tgz", + "integrity": "sha512-1xGnbYN3zbog9CwuNDQULNRrTCLIn46/WmpR1f0w6PsCYQHkylZr5vkd6kfMZYV6pRnQkcPNRyiA8LsrNKyhpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha1-yOBGun6q5JEdfnHislt3b8w1dZs= sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz", + "integrity": "sha1-iB7ka0930cHczFgjQzqjmwIsvgY= sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha1-W+DO7WfKecbEvFzw1+6EPc6hEMQ= sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha1-o61ddzJB6caCgDq/Yo1M1iuKQXc= sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha1-1L9/mQlnXXoHD/FNDvKk88mCxyM= sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha1-BX+qkGXIrPSPJMtXrA53c5q5p+g= sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY= sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha1-WxhQkS+jHfkHFpY9RdkSH9/An0Y= sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha1-52NfWX/YcCCFhiaAWicp+naYrFM= sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha1-X6GnYjhn/xr2yj3HKta4pCCL66c= sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha1-CoSe67X68hGbkBu3b9eVwoSNQBg= sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha1-127Cfff6Fl8Y1YCDdKX+I8KbF24= sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha1-iRg9obSQerCJprAgKcxdjWV0Jw4= sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha1-Yn73YkOSChB+fOjpYZHevksWwqA= sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha1-3wOELocLa4jhF1JKSzZLb8aJ+VY= sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha1-WrENAkhxmJVINrY0n3T/+WHhD2c= sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha1-y0tQ7JrKVwq9H1LzPNRbbGFzmp8= sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM= sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha1-qd8Brlt3hYoCf9LoB2juQzVV/P0= sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk= sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha1-eaAG4uYxSahgDxVDDwpHJdFSSDU= sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs= sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha1-DQRcOyurrY59sa9a8JP10NYN+Zo= sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaku": { + "version": "0.16.7", + "resolved": "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz", + "integrity": "sha1-HRlceKqbW/hHnIlblQT9TwhHmE4= sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha1-eCdK/ZNZih391hMN9qVm3vy/mqQ= sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk= sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU= sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A= sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs= sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha1-15X1TRc0lOfY25MVDOwO1/Z4yDo= sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha1-fklk6o7EIrekCskX06NEz9IwS6o= sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA= sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 80836276a3..b233f5563e 100644 --- a/package.json +++ b/package.json @@ -5,29 +5,29 @@ "license": "SSPL", "private": true, "scripts": { - "dev:ui": "cross-env yarn --cwd redisinsight/ui dev", - "dev:ui:coverage": "cross-env COLLECT_COVERAGE=true yarn --cwd redisinsight/ui dev", - "dev:api": "cross-env yarn --cwd redisinsight/api start:dev", - "dev:electron:ui": "cross-env RI_APP_PORT=8080 RI_APP_TYPE=ELECTRON NODE_ENV=development yarn --cwd redisinsight/ui dev", - "dev:electron:api": "cross-env RI_APP_PORT=5540 RI_APP_TYPE=ELECTRON NODE_ENV=development USE_TCP_CLOUD_AUTH=true yarn --cwd redisinsight/api start:dev", - "dev:electron": "cross-env RI_APP_TYPE=ELECTRON RI_AUTO_BOOTSTRAP=false NODE_ENV=development USE_TCP_CLOUD_AUTH=true yarn --cwd redisinsight/desktop dev", - "dev:desktop": "concurrently \"yarn dev:electron:api\" \"yarn dev:electron:ui\" \"yarn dev:electron\"", - "build:ui": "cross-env NODE_ENV=production RI_APP_TYPE=web yarn --cwd redisinsight/ui build", - "build:renderer": "cross-env NODE_ENV=production RI_APP_TYPE=ELECTRON yarn --cwd redisinsight/ui build --emptyOutDir && copyfiles ./redisinsight/desktop/splash.html ./redisinsight/dist/renderer -f", - "stats:ui": "yarn --cwd redisinsight/ui stats", - "build": "cross-env NODE_ENV=development concurrently \"yarn build:main\" \"yarn build:renderer\"", - "build:stage": "cross-env NODE_ENV=staging TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./configs/tsconfig.json concurrently \"yarn build:api:stage && yarn build:main:stage\" \"yarn build:renderer\"", - "build:prod": "cross-env NODE_ENV=production concurrently \"yarn build:api && yarn build:main\" \"yarn build:renderer\"", - "build:api": "yarn --cwd redisinsight/api/ build:prod", - "build:api:stage": "yarn --cwd redisinsight/api/ build:stage", + "dev:ui": "cross-env npm run dev --prefix redisinsight/ui", + "dev:ui:coverage": "cross-env COLLECT_COVERAGE=true npm run dev --prefix redisinsight/ui", + "dev:api": "cross-env npm run start:dev --prefix redisinsight/api", + "dev:electron:ui": "cross-env RI_APP_PORT=8080 RI_APP_TYPE=ELECTRON NODE_ENV=development npm run dev --prefix redisinsight/ui", + "dev:electron:api": "cross-env RI_APP_PORT=5540 RI_APP_TYPE=ELECTRON NODE_ENV=development USE_TCP_CLOUD_AUTH=true npm run start:dev --prefix redisinsight/api", + "dev:electron": "cross-env RI_APP_TYPE=ELECTRON RI_AUTO_BOOTSTRAP=false NODE_ENV=development USE_TCP_CLOUD_AUTH=true npm run dev --prefix redisinsight/desktop", + "dev:desktop": "concurrently \"npm run dev:electron:api\" \"npm run dev:electron:ui\" \"npm run dev:electron\"", + "build:ui": "cross-env NODE_ENV=production RI_APP_TYPE=web npm run build --prefix redisinsight/ui", + "build:renderer": "cross-env NODE_ENV=production RI_APP_TYPE=ELECTRON npm run build --prefix redisinsight/ui -- --emptyOutDir && copyfiles ./redisinsight/desktop/splash.html ./redisinsight/dist/renderer -f", + "stats:ui": "npm run stats --prefix redisinsight/ui", + "build": "cross-env NODE_ENV=development concurrently \"npm run build:main\" \"npm run build:renderer\"", + "build:stage": "cross-env NODE_ENV=staging TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./configs/tsconfig.json concurrently \"npm run build:api:stage && npm run build:main:stage\" \"npm run build:renderer\"", + "build:prod": "cross-env NODE_ENV=production concurrently \"npm run build:api && npm run build:main\" \"npm run build:renderer\"", + "build:api": "npm run build:prod --prefix redisinsight/api", + "build:api:stage": "npm run build:stage --prefix redisinsight/api", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./configs/tsconfig.json webpack --config ./configs/webpack.config.main.prod.ts", "build:main:stage": "cross-env TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=./configs/tsconfig.json webpack --config ./configs/webpack.config.main.stage.ts", - "build:defaults": "yarn --cwd redisinsight/api build:defaults", + "build:defaults": "npm run build:defaults --prefix redisinsight/api", "generate:api-client": "node ./scripts/generate-api-client.js", "i18n:extract": "i18next-cli extract", "i18n:check": "node ./scripts/check-i18n-locales.js", - "build:statics": "yarn build:defaults && sh ./scripts/build-statics.sh", - "build:statics:win": "yarn build:defaults && ./scripts/build-statics.cmd", + "build:statics": "npm run build:defaults && sh ./scripts/build-statics.sh", + "build:statics:win": "npm run build:defaults && .\\scripts\\build-statics.cmd", "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir redisinsight", "lint": "eslint . --ext .js,.jsx,.ts,.tsx --cache --cache-strategy content", "lint:ui": "eslint ./redisinsight/ui --ext .js,.jsx,.ts,.tsx --cache --cache-strategy content", @@ -36,29 +36,32 @@ "prettier": "prettier --check .", "prettier:update": "prettier --write .", "prettier:fix": "prettier --write", - "package": "yarn package:dev", - "package:prod": "node ./scripts/prebuild.js dist && yarn build:prod && electron-builder build -p never", - "package:stage": "node ./scripts/prebuild.js dist && yarn build:stage && electron-builder build -p never -c.mac.bundleVersion=$GITHUB_RUN_ID", + "package": "npm run package:dev", + "package:prod": "node ./scripts/prebuild.js dist && npm run build:prod && electron-builder build -p never", + "package:stage": "node ./scripts/prebuild.js dist && npm run build:stage && electron-builder build -p never -c.mac.bundleVersion=$GITHUB_RUN_ID", "package:mas": "electron-builder build -p never -m mas:universal -c.mac.bundleVersion=$GITHUB_RUN_ID -c ./electron-builder-mas.js", "package:mas:dev": "electron-builder build -p never -m mas-dev:universal -c ./electron-builder-mas.js", - "package:dev": "yarn build && cross-env DEBUG=electron-builder electron-builder build -p never", - "package:win": "yarn build:prod && electron-builder build --win --x64 -p never", - "package:mac": "yarn build:prod && electron-builder build --mac -p never", - "package:mac:arm": "yarn build:prod && electron-builder build --mac --arm64 -p never", - "package:linux": "yarn build:prod && electron-builder build --linux -p never", - "postinstall": "patch-package && vite optimize -c ./redisinsight/ui/vite.config.mjs && skip-postinstall || yarn-deduplicate yarn.lock", - "test": "jest ./redisinsight/ui -w 1", - "test:api": "yarn --cwd redisinsight/api test", - "test:api:integration": "yarn --cwd redisinsight/api test:api", - "test:watch": "jest ./redisinsight/ui --watch -w 1", - "test:cov": "cross-env NODE_OPTIONS='' jest ./redisinsight/ui --testLocationInResults --json --outputFile=\"report/coverage/report.json\" --silent --coverage --no-cache --forceExit -w 3", - "test:cov:unit": "jest ./redisinsight/ui --group=-component --coverage -w 1", - "test:cov:component": "jest ./redisinsight/ui --group=component --coverage -w 1", - "type-check": "yarn --cwd redisinsight/ui type-check && yarn --cwd redisinsight/api type-check && yarn --cwd redisinsight/desktop type-check && tsc --project configs/tsconfig.json --noEmit", - "tscheck": "yarn --cwd redisinsight/ui tscheck && yarn --cwd redisinsight/api tscheck && yarn --cwd redisinsight/desktop tscheck", - "tscheck:force": "yarn --cwd redisinsight/ui tscheck:force && yarn --cwd redisinsight/api tscheck:force && yarn --cwd redisinsight/desktop tscheck:force", + "package:dev": "npm run build && cross-env DEBUG=electron-builder electron-builder build -p never", + "package:win": "npm run build:prod && electron-builder build --win --x64 -p never", + "package:mac": "npm run build:prod && electron-builder build --mac -p never", + "package:mac:arm": "npm run build:prod && electron-builder build --mac --arm64 -p never", + "package:linux": "npm run build:prod && electron-builder build --linux -p never", + "postinstall": "patch-package && vite optimize -c ./redisinsight/ui/vite.config.mjs", + "test": "jest -w 1", + "test:api": "npm run test --prefix redisinsight/api", + "test:api:integration": "npm run test:api --prefix redisinsight/api", + "test:watch": "jest --watch -w 1", + "test:cov": "cross-env NODE_OPTIONS='' jest --testLocationInResults --json --outputFile=\"report/coverage/report.json\" --silent --coverage --no-cache --forceExit -w 3", + "test:cov:unit": "jest --group=-component --coverage -w 1", + "test:cov:component": "jest --group=component --coverage -w 1", + "type-check": "npm run type-check --prefix redisinsight/ui && npm run type-check --prefix redisinsight/api && npm run type-check --prefix redisinsight/desktop && tsc --project configs/tsconfig.json --noEmit", + "tscheck": "npm run tscheck --prefix redisinsight/ui && npm run tscheck --prefix redisinsight/api && npm run tscheck --prefix redisinsight/desktop", + "tscheck:force": "npm run tscheck:force --prefix redisinsight/ui && npm run tscheck:force --prefix redisinsight/api && npm run tscheck:force --prefix redisinsight/desktop", "sb": "storybook dev -p 6006", - "build-sb": "storybook build" + "build-sb": "storybook build", + "deps:audit": "node scripts/dependency-audit-report.mjs", + "test:scripts": "node --test scripts/lib/*.test.mjs", + "test:security": "node --import tsx --test tests/security/*.test.mts" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -92,34 +95,41 @@ "vite" ], "homepage": "https://github.com/RedisInsight/RedisInsight#readme", - "resolutions": { - "**/trim": "0.0.3", + "overrides": { + "trim": "0.0.3", "word-wrap": "1.2.4", - "**/semver": "^7.5.2", - "rawproto/protobufjs": "^7.2.5", + "semver": "7.7.4", + "eslint-plugin-sonarjs": { + "semver": "^7.8.5" + }, + "rawproto": { + "protobufjs": "^7.6.5" + }, "@electron/notarize": "2.3.2", - "webpack-bundle-analyzer/ws": "^7.5.10", - "msw/path-to-regexp": "^6.3.0", - "**/cross-spawn": "^7.0.5", - "styled-components": "^5", - "@elastic/eui/**/prismjs": "~1.30.0", - "vite/esbuild": "^0.25.0", - "react-router-dom/react-router/path-to-regexp": "^1.9.0", - "**/form-data": "^4.0.4", + "@elastic/eui": { + "prismjs": "~1.30.0" + }, + "react-router-dom": { + "react-router": { + "path-to-regexp": "^1.9.0" + } + }, + "form-data": "^4.0.6", + "@sentry/core": "10.69.0", "@types/react": "18.2.1", "@types/react-dom": "18.2.1" }, "devDependencies": { "@aivenio/tsc-output-parser": "2.1.1", "@babel/plugin-proposal-decorators": "^7.29.7", - "@babel/preset-env": "^7.23.2", - "@babel/preset-react": "^7.28.5", - "@babel/preset-typescript": "^7.23.2", - "@electron/rebuild": "^4.0.1", + "@babel/preset-env": "^7.29.7", + "@babel/preset-react": "^7.29.7", + "@babel/preset-typescript": "^7.29.7", + "@electron/rebuild": "^4.2.0", "@faker-js/faker": "^8.4.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", - "@sentry/vite-plugin": "^5.3.0", - "@sentry/webpack-plugin": "^5.3.0", + "@sentry/vite-plugin": "^5.4.0", + "@sentry/webpack-plugin": "^5.4.0", "@storybook/addon-a11y": "^9.1.19", "@storybook/addon-docs": "^9.1.11", "@storybook/addon-links": "^9.1.11", @@ -131,8 +141,8 @@ "@testing-library/react": "^13.3.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.4.3", - "@types/classnames": "^2.2.11", - "@types/d3": "^7.4.0", + "@types/classnames": "^2.3.4", + "@types/d3": "^7.4.3", "@types/detect-port": "^1.3.0", "@types/dompurify": "^3.2.0", "@types/electron-store": "^3.2.0", @@ -144,14 +154,13 @@ "@types/jest": "^29.5.14", "@types/js-yaml": "^4.0.9", "@types/json-bigint": "^1.0.1", - "@types/jsonpath": "^0.2.0", "@types/lodash": "^4.14.171", "@types/node": "14.14.10", "@types/pako": "^2.0.4", - "@types/react": "^18.0.20", - "@types/react-dom": "^18.0.5", + "@types/react": "18.2.1", + "@types/react-dom": "18.2.1", "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized": "^9.21.10", + "@types/react-virtualized": "^9.22.3", "@types/react-window-infinite-loader": "^1.0.6", "@types/segment-analytics": "^0.0.34", "@types/semver": "^7.7.0", @@ -165,22 +174,22 @@ "@vitejs/plugin-react-swc": "^3.6.0", "assert": "^2.1.0", "babel-preset-vite": "^1.1.3", - "concurrently": "^9.0.1", + "concurrently": "^9.2.4", "construct-style-sheets-polyfill": "^3.1.0", "copyfiles": "^2.4.1", - "core-js": "^3.6.5", + "core-js": "^3.50.0", "cross-env": "^7.0.2", "css-loader": "^5.0.1", "css-minimizer-webpack-plugin": "^8.0.0", "csv-parser": "^3.2.1", - "csv-stringify": "^6.4.0", + "csv-stringify": "^6.8.3", "deep-object-diff": "^1.1.9", "dotenv": "^16.4.5", - "electron": "^41.7.2", - "electron-builder": "26.14.0", + "electron": "^43.3.0", + "electron-builder": "26.15.7", "electron-builder-notarize": "^1.5.2", "electron-debug": "^3.2.0", - "electron-devtools-installer": "^3.2.0", + "electron-devtools-installer": "^3.2.1", "esbuild-plugin-react-virtualized": "^1.0.4", "eslint": "^8.57.1", "eslint-config-airbnb": "^19.0.4", @@ -195,11 +204,11 @@ "eslint-plugin-promise": "^7.1.0", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-sonarjs": "^2.0.4", + "eslint-plugin-sonarjs": "^4.2.0", "eslint-plugin-storybook": "^9.1.11", "file-loader": "^6.0.0", "fishery": "^2.3.1", - "google-auth-library": "^10.6.2", + "google-auth-library": "^10.9.1", "googleapis": "^125.0.0", "html-webpack-plugin": "^5.6.0", "i18next-cli": "^1", @@ -209,23 +218,22 @@ "jest-fixed-jsdom": "^0.0.10", "jest-html-reporters": "^3.1.7", "jest-runner-groups": "^2.2.0", + "jest-watch-typeahead": "^2.2.2", "jest-when": "^4.0.2", "json-stable-stringify": "^1.3.0", "license-checker": "^25.0.1", "lint-staged": "^16.4.0", "mini-css-extract-plugin": "2.10.2", - "moment": "^2.29.3", + "moment": "^2.30.1", "msw": "2.13.2", "patch-package": "^8.0.1", - "postinstall-postinstall": "^2.1.0", "prettier": "3.5.2", "react-refresh": "^0.9.0", - "redux-mock-store": "^1.5.4", + "redux-mock-store": "^1.5.5", "redux-thunk": "^3.1.0", - "regenerator-runtime": "^0.13.5", + "regenerator-runtime": "^0.14.1", "rimraf": "^3.0.2", - "sass": "npm:sass-embedded", - "skip-postinstall": "^1.0.0", + "sass": "npm:sass-embedded@1.75.0", "socket.io-mock": "^1.3.2", "source-map-support": "^0.5.19", "storybook": "^9.1.19", @@ -236,10 +244,10 @@ "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "ts-mockito": "^2.6.1", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "tsconfig-paths": "^3.9.0", "tsconfig-paths-webpack-plugin": "^4.1.0", - "tsx": "^4.19.2", + "tsx": "^4.23.11", "typescript": "^4.0.5", "url-loader": "^4.1.0", "vite": "^6.4.3", @@ -255,8 +263,7 @@ "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", "webpack-merge": "^5.10.0", - "whatwg-fetch": "^3.6.2", - "yarn-deduplicate": "^6.0.2" + "whatwg-fetch": "^3.6.20" }, "dependencies": { "@elastic/datemath": "^5.0.3", @@ -266,71 +273,70 @@ "@redis-ui/styles": "^15.0.0", "@redis-ui/table": "^3.7.0", "@reduxjs/toolkit": "^2.12.0", - "@sentry/electron": "^7.8.0", - "@sentry/react": "^10.39.0", - "@stablelib/snappy": "^1.0.2", + "@sentry/electron": "^7.16.0", + "@sentry/react": "^10.69.0", + "@stablelib/snappy": "^1.0.3", "@types/json-dup-key-validator": "^1.0.2", - "ajv": "^8.18.0", - "axios": "^1.16.1", - "brotli-dec-wasm": "^2.3.0", + "ajv": "^8.20.0", + "axios": "^1.19.0", + "brotli-dec-wasm": "^2.3.2", "buffer": "^6.0.3", - "classnames": "^2.3.1", - "connection-string": "^4.3.2", - "d3": "^7.6.1", + "classnames": "^2.5.1", + "connection-string": "^4.4.0", + "d3": "^7.9.0", "date-fns": "^3.6.0", "date-fns-tz": "^3.2.0", - "dompurify": "^3.4.11", + "dompurify": "^3.4.13", "electron-context-menu": "^3.1.0", "electron-log": "^4.2.4", - "electron-store": "^8.0.0", - "electron-updater": "^6.6.2", + "electron-store": "^8.2.0", + "electron-updater": "^6.8.9", "file-saver": "^2.0.5", "formik": "^2.4.9", - "fzstd": "^0.1.0", + "fzstd": "^0.1.1", "get-port": "^7.2.0", - "html-entities": "^2.3.2", + "html-entities": "^2.6.0", "html-react-parser": "^1.2.4", "i18next": "^23.16", "java-object-serialization": "^0.1.2", - "js-yaml": "^4.2.0", + "js-yaml": "^4.3.1", "json-bigint": "^1.0.0", "json-dup-key-validator": "^1.0.3", - "jsonpath": "^1.2.1", "jszip": "^3.10.1", "lodash": "^4.18.1", "lz4js": "^0.2.0", "modern-normalize": "^3.0.1", "monaco-editor": "^0.48.0", "monaco-yaml": "^5.1.1", - "msgpackr": "^1.10.1", - "node-abi": "^4.31.0", - "pako": "^2.1.0", + "msgpackr": "^1.12.1", + "node-abi": "^4.33.0", + "pako": "^2.2.0", "php-serialize": "^5.1.3", "pickleparser": "^0.2.1", - "rawproto": "^0.7.6", - "react": "^18.2.0", + "rawproto": "^0.7.15", + "react": "^18.3.1", "react-contenteditable": "^3.3.5", - "react-dom": "^18.2.0", - "react-focus-on": "^3.9.4", + "react-dom": "^18.3.1", + "react-focus-on": "^3.10.2", "react-hotkeys-hook": "^3.3.1", "react-i18next": "^13.5", - "react-jsx-parser": "^2.4.1", + "react-markdown": "^9.1.0", "react-monaco-editor": "^0.59.0", "react-redux": "^9.2.0", - "react-resizable-panels": "^3.0.2", - "react-rnd": "^10.3.5", + "react-resizable-panels": "^3.0.6", + "react-rnd": "^10.5.3", "react-router-dom": "^5.3.4", "react-virtualized": "^9.22.2", - "react-virtualized-auto-sizer": "^1.0.6", + "react-virtualized-auto-sizer": "^1.0.26", "react-vtree": "^3.0.0-beta.3", - "react-window": "^1.8.6", - "react-window-infinite-loader": "^1.0.8", + "react-window": "^1.8.11", + "react-window-infinite-loader": "^1.0.10", "redux": "^5.0.1", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", - "semver": "^7.7.2", + "semver": "7.7.4", "socket.io-client": "^4.8.3", "styled-components": "^5.0.0", "unified": "^11.0.5", @@ -340,7 +346,6 @@ }, "engines": { "node": ">=24.x", - "npm": ">=6.x", - "yarn": ">=1.21.3" + "npm": ">=11.10.0" } } diff --git a/redisinsight/.npmrc b/redisinsight/.npmrc new file mode 100644 index 0000000000..38196ea45c --- /dev/null +++ b/redisinsight/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# Some dependencies declare legacy peer deps that conflict with newer installed +# versions. This mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/__mocks__/monacoMock.js b/redisinsight/__mocks__/monacoMock.js index ddb6560140..6f9fbc7ac8 100644 --- a/redisinsight/__mocks__/monacoMock.js +++ b/redisinsight/__mocks__/monacoMock.js @@ -13,21 +13,32 @@ const editor = { onDidChangeCursorPosition: jest.fn(), onDidFocusEditorWidget: jest.fn(), onDidBlurEditorWidget: jest.fn(), - onDidChangeModelContent: jest.fn(), + onDidChangeModelContent: jest.fn(() => ({ dispose: jest.fn() })), onDidLayoutChange: jest.fn(), getLayoutInfo: jest.fn().mockReturnValue({ contentLeft: 0 }), onDidAttemptReadOnlyEdit: jest.fn(), executeEdits: jest.fn(), + pushUndoStop: jest.fn(), updateOptions: jest.fn(), setSelection: jest.fn(), setPosition: jest.fn(), + revealPositionInCenterIfOutsideViewport: jest.fn(), createDecorationsCollection: jest.fn().mockReturnValue({ set: jest.fn(), clear: jest.fn() }), getValue: jest.fn().mockReturnValue(''), getModel: jest.fn().mockReturnValue({ + getValue: jest.fn().mockReturnValue(''), getOffsetAt: jest.fn().mockReturnValue(0), + getPositionAt: jest.fn().mockReturnValue({ lineNumber: 1, column: 1 }), + getValueInRange: jest.fn().mockReturnValue(''), getWordUntilPosition: jest.fn().mockReturnValue(''), + getFullModelRange: jest.fn().mockReturnValue({}), + isDisposed: jest.fn().mockReturnValue(false), }), getPosition: jest.fn().mockReturnValue({}), + getContainerDomNode: jest.fn(() => document.createElement('div')), + getTargetAtClientPoint: jest.fn().mockReturnValue(null), + getSelection: jest.fn().mockReturnValue(null), + getSelections: jest.fn().mockReturnValue(null), trigger: jest.fn(), }; diff --git a/redisinsight/__mocks__/rehypeStringify.js b/redisinsight/__mocks__/rehypeStringify.js deleted file mode 100644 index 0bb2acf508..0000000000 --- a/redisinsight/__mocks__/rehypeStringify.js +++ /dev/null @@ -1 +0,0 @@ -export default jest.fn(); diff --git a/redisinsight/__mocks__/remarkGfm.js b/redisinsight/__mocks__/remarkGfm.js deleted file mode 100644 index 0bb2acf508..0000000000 --- a/redisinsight/__mocks__/remarkGfm.js +++ /dev/null @@ -1 +0,0 @@ -export default jest.fn(); diff --git a/redisinsight/__mocks__/remarkParse.js b/redisinsight/__mocks__/remarkParse.js deleted file mode 100644 index 0bb2acf508..0000000000 --- a/redisinsight/__mocks__/remarkParse.js +++ /dev/null @@ -1 +0,0 @@ -export default jest.fn(); diff --git a/redisinsight/__mocks__/remarkRehype.js b/redisinsight/__mocks__/remarkRehype.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/redisinsight/__mocks__/unified.js b/redisinsight/__mocks__/unified.js deleted file mode 100644 index c03dcc6595..0000000000 --- a/redisinsight/__mocks__/unified.js +++ /dev/null @@ -1 +0,0 @@ -export const unified = jest.fn(); diff --git a/redisinsight/__mocks__/unistUtilsVisit.js b/redisinsight/__mocks__/unistUtilsVisit.js deleted file mode 100644 index 31557f85e7..0000000000 --- a/redisinsight/__mocks__/unistUtilsVisit.js +++ /dev/null @@ -1 +0,0 @@ -export const visit = jest.fn(); diff --git a/redisinsight/api/.gitignore b/redisinsight/api/.gitignore index 690310b2bf..4b7f7ac2d2 100644 --- a/redisinsight/api/.gitignore +++ b/redisinsight/api/.gitignore @@ -8,8 +8,6 @@ logs *.log npm-debug.log* -yarn-debug.log* -yarn-error.log* lerna-debug.log* # OS diff --git a/redisinsight/api/.npmrc b/redisinsight/api/.npmrc new file mode 100644 index 0000000000..736246030d --- /dev/null +++ b/redisinsight/api/.npmrc @@ -0,0 +1,9 @@ +# Retain yarn-equivalent peer dependency resolution. +# Some devDependencies (e.g. @mochajs/json-file-reporter) declare legacy peer +# deps that conflict with newer installed versions. This mirrors the lenient +# resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/api/.tscheck.rec.json b/redisinsight/api/.tscheck.rec.json index 90a45940e2..2d8b2aeaba 100644 --- a/redisinsight/api/.tscheck.rec.json +++ b/redisinsight/api/.tscheck.rec.json @@ -170,7 +170,7 @@ }, "src/modules/ai/query/utils/context.util.ts": { "TS7006": 3, - "TS7053": 16 + "TS7053": 15 }, "src/modules/analytics/analytics.service.spec.ts": { "TS7005": 18, @@ -665,11 +665,7 @@ "TS7010": 1, "TS7053": 4 }, - "src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.spec.ts": { - "TS2339": 10 - }, "src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts": { - "TS2769": 1, "TS7005": 1, "TS7034": 1, "TS7053": 1 @@ -791,10 +787,6 @@ "TS7005": 1, "TS7034": 1 }, - "src/modules/database-import/certificate-import.service.spec.ts": { - "TS7005": 10, - "TS7034": 4 - }, "src/modules/database-import/certificate-import.service.ts": { "TS2322": 7, "TS2345": 10 @@ -823,10 +815,6 @@ "src/modules/database-import/dto/import.database.dto.ts": { "TS2345": 2 }, - "src/modules/database-import/ssh-import.service.spec.ts": { - "TS7005": 1, - "TS7034": 1 - }, "src/modules/database-import/ssh-import.service.ts": { "TS2322": 1 }, @@ -924,8 +912,7 @@ "TS18048": 4, "TS2322": 3, "TS2345": 2, - "TS7006": 1, - "TS7053": 2 + "TS7006": 1 }, "src/modules/database/providers/database-overview.provider.spec.ts": { "TS2322": 2, @@ -1259,13 +1246,8 @@ "src/modules/redis/redis.client.storage.ts": { "TS2322": 2 }, - "src/modules/redis/utils/reply.util.spec.ts": { - "TS2322": 4 - }, "src/modules/redis/utils/reply.util.ts": { - "TS2538": 1, - "TS7005": 1, - "TS7034": 1 + "TS2538": 1 }, "src/modules/server/local.server.service.ts": { "TS2345": 2 @@ -1325,10 +1307,6 @@ "src/modules/tag/tag.service.spec.ts": { "TS2345": 2 }, - "src/modules/workbench/plugins.service.spec.ts": { - "TS7005": 11, - "TS7034": 3 - }, "src/modules/workbench/providers/plugin-commands-whitelist.provider.spec.ts": { "TS7005": 10, "TS7034": 2 @@ -1817,7 +1795,7 @@ "test/api/redisearch/POST-databases-id-redisearch-key-indexes.test.ts": { "TS18047": 3, "TS7006": 1, - "TS7031": 3 + "TS7031": 2 }, "test/api/redisearch/POST-databases-id-redisearch-search.test.ts": { "TS18047": 8, diff --git a/redisinsight/api/.yarnclean.prod b/redisinsight/api/.yarnclean.prod deleted file mode 100644 index 7b6d5cdce5..0000000000 --- a/redisinsight/api/.yarnclean.prod +++ /dev/null @@ -1,3 +0,0 @@ -*.md -*.ts -*.map diff --git a/redisinsight/api/config/default.ts b/redisinsight/api/config/default.ts index 5d0130b556..91b405a568 100644 --- a/redisinsight/api/config/default.ts +++ b/redisinsight/api/config/default.ts @@ -126,7 +126,7 @@ export default { : true, buildType: process.env.RI_BUILD_TYPE || 'DOCKER_ON_PREMISE', appType: process.env.RI_APP_TYPE, - appVersion: process.env.RI_APP_VERSION || '3.6.0', + appVersion: process.env.RI_APP_VERSION || '3.8.0', buildCommitSha: resolveBuildCommitSha(), requestTimeout: parseInt(process.env.RI_REQUEST_TIMEOUT, 10) || 25000, excludeRoutes: [], diff --git a/redisinsight/api/config/features-config.json b/redisinsight/api/config/features-config.json index d6a2e20be2..0880849634 100644 --- a/redisinsight/api/config/features-config.json +++ b/redisinsight/api/config/features-config.json @@ -1,6 +1,22 @@ { "version": 11, "features": { + "appUpdateStrategySettings": { + "flag": true, + "perc": [[0, 100]], + "filters": [ + { + "name": "config.server.buildType", + "value": "ELECTRON", + "cond": "eq" + } + ] + }, + "vectorSearchEnhancements": { + "flag": true, + "perc": [[0, 100]], + "filters": [] + }, "dev-language": { "flag": true, "perc": [[0, 0]], @@ -153,9 +169,9 @@ "flag": true, "perc": [[0, 100]] }, - "dev-array": { + "array": { "flag": true, - "perc": [[0, 0]] + "perc": [[0, 100]] }, "prodMode": { "flag": true, @@ -164,6 +180,10 @@ "whatsNew": { "flag": true, "perc": [[0, 100]] + }, + "valueDecoder": { + "flag": false, + "perc": [[0, 100]] } } } diff --git a/redisinsight/api/config/swagger.ts b/redisinsight/api/config/swagger.ts index 84097e0521..c0a179a2ee 100644 --- a/redisinsight/api/config/swagger.ts +++ b/redisinsight/api/config/swagger.ts @@ -5,7 +5,7 @@ const SWAGGER_CONFIG: Omit = { info: { title: 'Redis Insight Backend API', description: 'Redis Insight Backend API', - version: '3.6.0', + version: '3.8.0', }, tags: [], }; diff --git a/redisinsight/api/migration/1784000000000-database-connection-family.ts b/redisinsight/api/migration/1784000000000-database-connection-family.ts new file mode 100644 index 0000000000..9da7c8f780 --- /dev/null +++ b/redisinsight/api/migration/1784000000000-database-connection-family.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class DatabaseConnectionFamily1784000000000 + implements MigrationInterface +{ + name = 'DatabaseConnectionFamily1784000000000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "database_instance" ADD COLUMN "connectionFamily" varchar NOT NULL DEFAULT ('auto')`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "database_instance" DROP COLUMN "connectionFamily"`, + ); + } +} diff --git a/redisinsight/api/migration/index.ts b/redisinsight/api/migration/index.ts index 12a5ce38ed..a4d7e035d5 100644 --- a/redisinsight/api/migration/index.ts +++ b/redisinsight/api/migration/index.ts @@ -60,6 +60,7 @@ import { DatabaseIsProduction1778758000000 } from './1778758000000-database-isPr import { Environment1779000000000 } from './1779000000000-database-environment'; import { DropDatabaseIsProduction1779000000001 } from './1779000000001-drop-database-isProduction'; import { AgentMemoryEndpoint1779100000000 } from './1779100000000-agent-memory-endpoint'; +import { DatabaseConnectionFamily1784000000000 } from './1784000000000-database-connection-family'; export default [ initialMigration1614164490968, @@ -124,4 +125,5 @@ export default [ Environment1779000000000, DropDatabaseIsProduction1779000000001, AgentMemoryEndpoint1779100000000, + DatabaseConnectionFamily1784000000000, ]; diff --git a/redisinsight/api/openapi-ts.config.ts b/redisinsight/api/openapi-ts.config.ts index bb2ceb25af..36173f8f8d 100644 --- a/redisinsight/api/openapi-ts.config.ts +++ b/redisinsight/api/openapi-ts.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from '@hey-api/openapi-ts'; /** * Generates the typed OpenAPI client consumed by the UI workspace. * - * Input: `redisinsight/api/openapi.json` (produced by `yarn generate:openapi-spec`). + * Input: `redisinsight/api/openapi.json` (produced by `npm run generate:openapi-spec`). * Output: `redisinsight/api-client/` (gitignored, regenerated on `postinstall`). * * `enums: 'typescript'` makes the typescript plugin emit named TS enums for any diff --git a/redisinsight/api/package-lock.json b/redisinsight/api/package-lock.json new file mode 100644 index 0000000000..e89e4e6439 --- /dev/null +++ b/redisinsight/api/package-lock.json @@ -0,0 +1,15340 @@ +{ + "name": "redisinsight-api", + "version": "3.8.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redisinsight-api", + "version": "3.8.0", + "hasInstallScript": true, + "dependencies": { + "@azure/msal-node": "^5.5.0", + "@nestjs/common": "^11.1.28", + "@nestjs/core": "^11.1.28", + "@nestjs/event-emitter": "^3.1.0", + "@nestjs/platform-express": "^11.1.3", + "@nestjs/platform-socket.io": "^11.1.28", + "@nestjs/serve-static": "^5.0.3", + "@nestjs/swagger": "^11.4.6", + "@nestjs/typeorm": "^11.0.3", + "@nestjs/websockets": "^11.1.28", + "@okta/okta-auth-js": "^7.14.5", + "@redis-iris/agent-memory": "^0.1.1", + "@segment/analytics-node": "^2.3.0", + "@supercharge/promise-pool": "^3.3.0", + "@types/json-bigint": "^1.0.4", + "adm-zip": "^0.6.0", + "agent-memory-client": "^0.3.1", + "axios": "^1.19.0", + "better-sqlite3": "^13.0.3", + "body-parser": "^1.20.6", + "busboy": "^1.6.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.4", + "combined-stream": "^1.0.8", + "connect-timeout": "^1.9.1", + "date-fns": "^2.30.0", + "detect-port": "^1.6.1", + "dotenv": "^16.0.0", + "express": "5.2.1", + "form-data": "^4.0.4", + "fs-extra": "^10.0.0", + "ioredis": "^5.2.2", + "is-glob": "^4.0.1", + "json-bigint": "^1.0.0", + "jsonwebtoken": "^9.0.3", + "keytar": "^7.9.0", + "lodash": "^4.18.1", + "nest-winston": "^1.10.2", + "nestjs-form-data": "~1.9.93", + "node-version-compare": "^1.0.3", + "quicktype-core": "~23.0.176", + "redis": "^4.6.10", + "redis-parser": "3.0.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.2", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.3", + "source-map-support": "^0.5.19", + "swagger-ui-express": "^4.6.3", + "tunnel-ssh": "^5.1.2", + "typeorm": "^0.3.31", + "uuid": "^14.0.1", + "winston": "^3.19.0", + "winston-daily-rotate-file": "^4.5.0" + }, + "devDependencies": { + "@babel/core": "^7.29.7", + "@babel/preset-env": "^7.29.7", + "@faker-js/faker": "^8.4.1", + "@hey-api/openapi-ts": "0.99.0", + "@mochajs/json-file-reporter": "^1.3.0", + "@nestjs/cli": "^11.0.24", + "@nestjs/schematics": "^11.1.0", + "@nestjs/testing": "^11.1.28", + "@types/adm-zip": "^0.5.8", + "@types/express": "^5.0.6", + "@types/ioredis-mock": "^8", + "@types/jest": "^29.5.14", + "@types/lodash": "^4.17.25", + "@types/node": "^24", + "@types/ssh2": "^1.15.5", + "@types/supertest": "^2.0.8", + "babel-jest": "^29.7.0", + "chai": "^4.5.0", + "chai-deep-equal-ignore-undefined": "^1.2.0", + "concurrently": "^5.3.0", + "cross-env": "^7.0.3", + "esbuild": "^0.28.1", + "fishery": "^2.3.1", + "ioredis-mock": "^8.9.0", + "jest": "^29.7.0", + "jest-html-reporters": "^3.1.7", + "jest-junit": "^16.0.0", + "jest-when": "^3.7.0", + "joi": "^17.13.4", + "mocha": "^11.8.0", + "mocha-junit-reporter": "^2.2.1", + "mocha-multi-reporters": "^1.5.1", + "nock": "^13.5.6", + "nyc": "^15.1.0", + "object-diff": "^0.0.4", + "rimraf": "^3.0.2", + "socket.io-mock": "^1.3.2", + "supertest": "^4.0.2", + "ts-jest": "^29.4.12", + "ts-loader": "^6.2.1", + "ts-mocha": "^11.1.0", + "ts-node": "^10.9.2", + "tsconfig-paths": "^3.15.0", + "tsconfig-paths-webpack-plugin": "^3.3.0", + "typescript": "^4.8.2" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.2.27", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.27.tgz", + "integrity": "sha512-3amNzoCVSKd7ah6l6lBQL4onwwJvqvam7FMoQBILrxtW5LB5ezh8gMSPuA4zJjKjoRzf9uoWdlzqv/84I52xZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "19.2.27", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.27.tgz", + "integrity": "sha512-/PZmyAlb2NGWPikRRuiWLdfHQd8Wrx6lX4HqvTcaDhlU43M3T0ud4PH2T3QDp7BzHYY92xtD8iPxX2asg67G1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.27", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli": { + "version": "19.2.27", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.27.tgz", + "integrity": "sha512-wHYH6SVXVykhLzovUHtYor3Nl4SpIiITi7r9DQDaKYUD4hpRBx25W6N9eGuakT9Vd5tV/x6wmvQFWQZQwFB7eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.27", + "@angular-devkit/schematics": "19.2.27", + "@inquirer/prompts": "7.3.2", + "ansi-colors": "4.1.3", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.12.0.tgz", + "integrity": "sha512-hgLgfRdbG2AmhXPygebf1KYJEvse86+ZZLWufdiTKaGRYEUqOzHdlf6AS1IiuUCHWbynkgbHc451jSNkbfhWlg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.5.0.tgz", + "integrity": "sha512-A/2WIsuH0vsC6JVkkafjS4kHpi2LDR4AzDT0kJ+oIRtXYeYtvGQ2pwN2X88thQPhSek+82ela3MprsKXWQRrhQ==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.12.0", + "jsonwebtoken": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@babel/code-frame": { + "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.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "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.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", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "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.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "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.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha1-zx5EYrYT8rVMQeb/dY1d/KoshdE= sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha1-KpiAGoSfQ+Kt1kT7trxiKbGaTvQ= sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha1-9bKmgIl8acI4oTzRaxVnH4tzVJ8= sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-globals": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "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.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "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.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha1-eET5KJVG76n+usLeTP41igUL1wM= sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo= sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "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.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE= sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk= sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha1-1Jo7PmtS5b5nQAIjF1gCNKakc1c= sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha1-zLiKLEnIFyNoYf7ngmCAVzuKkjo= sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha1-n1seg4xEbnLPPNS5GBUrjGBeN8c= sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "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.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "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.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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "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.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk= sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha1-u1BFecHK6SPmV2pPXaQ9Jfl729k= sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha1-AGKcNaaI4FqIsc2mhPudXnPwAKE= sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha1-ZTT9WTOlO6fL86F2FeJzoNEnP/k= sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha1-EDSyZFf8iGNo/mG70J9lP2r6jlQ= sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha1-XV6K7o/OSPXhib9zDr0fdY9JFFE= sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, + "node_modules/@glideapps/ts-necessities": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.2.3.tgz", + "integrity": "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==", + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha1-g2iGnctzW+Ln9ct2R9544WeiUfs= sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha1-3ESOMyxsbjek3AL9hLqNRLmvsBI= sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hey-api/codegen-core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@hey-api/codegen-core/-/codegen-core-0.9.1.tgz", + "integrity": "sha512-s97jL1dgTMuiMHv2BZ1X4Tgd99Mf9GOvGdNqNcGwIMmnR+PgYNoraj4Zvp134MKsNCap/m7k0r0vKKnl56pj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/types": "0.1.4", + "ansi-colors": "4.1.3", + "c12": "3.3.4", + "color-support": "1.1.3" + }, + "engines": { + "node": ">=22.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + } + }, + "node_modules/@hey-api/json-schema-ref-parser": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.4.4.tgz", + "integrity": "sha512-otmd+zCxbYVBIp/mlMTnGkvlNYLkVKgs3VOIq0kSnenhB1+fRwLPQIeSwyWM6E51oXhUedkYjVsVpkVexeuJOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "7.1.3", + "@types/json-schema": "7.0.15", + "js-yaml": "4.2.0" + }, + "engines": { + "node": ">=22.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + } + }, + "node_modules/@hey-api/openapi-ts": { + "version": "0.99.0", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.99.0.tgz", + "integrity": "sha512-SePU/5oEWWkvUBYmvzdYRctseoLuskyhs4ET0RvLIcmzc8yLQoA2R+KtBIQ8bPsoSUB0m4E5SmBnl6aGSA0szQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/codegen-core": "0.9.1", + "@hey-api/json-schema-ref-parser": "1.4.4", + "@hey-api/shared": "0.5.0", + "@hey-api/spec-types": "0.2.0", + "@hey-api/types": "0.1.4", + "@lukeed/ms": "2.0.2", + "ansi-colors": "4.1.3", + "color-support": "1.1.3", + "commander": "15.0.0", + "get-tsconfig": "4.14.0" + }, + "bin": { + "openapi-ts": "bin/run.js" + }, + "engines": { + "node": ">=22.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, + "peerDependencies": { + "typescript": ">=5.5.3 || >=6.0.0 || 6.0.1-rc" + } + }, + "node_modules/@hey-api/shared": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@hey-api/shared/-/shared-0.5.0.tgz", + "integrity": "sha512-JN/j4Ebh4cJGYIQ5cwWuqe7GeSUyQoz7oC51WqyhKOcrejK6DKZMDkshc5d1eKTRuRL+rjozuRcoUaZZn2DGPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/codegen-core": "0.9.1", + "@hey-api/json-schema-ref-parser": "1.4.4", + "@hey-api/spec-types": "0.2.0", + "@hey-api/types": "0.1.4", + "ansi-colors": "4.1.3", + "cross-spawn": "7.0.6", + "open": "11.0.0", + "semver": "7.8.4" + }, + "engines": { + "node": ">=22.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + } + }, + "node_modules/@hey-api/shared/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hey-api/shared/node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hey-api/spec-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@hey-api/spec-types/-/spec-types-0.2.0.tgz", + "integrity": "sha512-ibQ8Is7evMavzr8GNyJCcTg975d8DpaMUyLmOrQ85UBdy1l6t1KuRAwgChAbesJsIlNV6gjmlXruWyegDX18Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hey-api/types": "0.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + } + }, + "node_modules/@hey-api/types": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@hey-api/types/-/types-0.1.4.tgz", + "integrity": "sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@ioredis/as-callback": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@ioredis/as-callback/-/as-callback-3.0.0.tgz", + "integrity": "sha1-uWybBeZwHoXsal5i+iVAcbCuyX8= sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==", + "dev": true + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha1-bWGzCXRwrx/bvmInlbiSHUIBjhE= sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA= sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha1-YCFu6kZNhkWXzigyAAc4oFiWUME= sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE= sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI= sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q= sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha1-Eyh1q95njH6o1pFTPy5+Irt0Tbo= sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ= sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0= sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "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": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha1-zUgi29uEUpJlxaK9tSmjycyVD/w= sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha1-tszMI58w/zZglljFpeIpF1fORI8= sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha1-JNYfVP8feG881Ac7S5RBY4O68qc= sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha1-dqPtsMt1O3Dfv+Iyg1ENPUVDK/I= sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha1-Aj7+XSaopw8hZ30KGvwPCkTjocY= sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha1-/ZG/H/+xbX0NJKQmqxpHpJiBpWU= sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha1-jZKQ+exH/3cmB/qGTKHVou+uHU0= sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha1-BLJi7LO4+qg7Cz0yFiOXI5Po9Mc= sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha1-+hVAHfbBWHS8shBfdzMl14xmZ2U= sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs= sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha1-Qwtc6KTgBEp+OBlmMwWnswkcjgM= sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha1-2Quncglc83o0peuUE/G1YqCFVMQ= sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha1-jbmoCqGgl7siYlcmhnNLrtmxZXw= sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha1-bO+XfOHTmDSjrqiHoXJmKKbwcs4= sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha1-3y3Zw0bH13aLigZjmZRkDGQuKEw= sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha1-qd8Brlt3hYoCf9LoB2juQzVV/P0= sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha1-ETH4z2NOfoTF53urEvBSr1hfulk= sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8= sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE= sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y= sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha1-aRKwDSxjHA0Vzhp6tXzWV/Ko+Lo= sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A= sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha1-Hj5L0Fwcx6Cy3b2KA/OfbktebP4= sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha1-B/CeWadMUvTYjG21wQVOgZU44qg= sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lukeed/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "license": "MIT" + }, + "node_modules/@mochajs/json-file-reporter": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/@mochajs/json-file-reporter/-/json-file-reporter-1.3.0.tgz", + "integrity": "sha1-Y6U7zak9dfXFx0r2DkXaBjkxNws= sha512-evIxpeP8EOixo/T2xh5xYEIzwbEHk8YNJfRUm1KeTs8F3bMjgNn2580Ogze9yisXNlTxu88JiJJYzXjjg5NdLA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": "6.x || 7.x || 8.x" + } + }, + "node_modules/@nestjs/cli": { + "version": "11.0.24", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.24.tgz", + "integrity": "sha512-aIHxQLSYtXShifA3zwWIeznEsZnNa3Iz2QRykFj+sl9IcbERBHr5nH87FRgywM+He3NxoF5WazHfR8FsmVeWxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.27", + "@angular-devkit/schematics": "19.2.27", + "@angular-devkit/schematics-cli": "19.2.27", + "@inquirer/prompts": "7.10.1", + "@nestjs/schematics": "^11.0.1", + "ansis": "4.2.0", + "chokidar": "4.0.3", + "cli-table3": "0.6.5", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "9.1.0", + "glob": "13.0.6", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.2.0", + "typescript": "5.9.3", + "webpack": "5.106.2", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 20.11" + }, + "peerDependencies": { + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0", + "@swc/core": "^1.3.62" + }, + "peerDependenciesMeta": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha1-IA9xXmbVKiOyIalDVTSpHME61b4= sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@nestjs/cli/node_modules/brace-expansion": { + "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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@nestjs/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha1-n9YCvZNilOnp70aj9NaWQESxgGg= sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nestjs/cli/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha1-Bgorhx1m26bIU46hEYuhrBb1+uM= sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/fork-ts-checker-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", + "integrity": "sha1-QzSBwcIoxWrxERcvytffeTGMkVo= sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^4.0.1", + "cosmiconfig": "^8.2.0", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/@nestjs/cli/node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@nestjs/cli/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@nestjs/cli/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@nestjs/cli/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha1-9QqIh3w8AWUqFbYirp6Xld96YP4= sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@nestjs/cli/node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/cli/node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0= sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@nestjs/cli/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha1-73jhkDkTNEbSRL6sD9ahYy4tEHw= sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nestjs/cli/node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", + "integrity": "sha1-90WajtHdTPZq14eu/D03//PPB/w= sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tapable": "^2.2.1", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@nestjs/cli/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@nestjs/common": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.28.tgz", + "integrity": "sha512-bRImsxibie+AM7xjdwcrm/gr5YeacI65kSBNzTufa1Ib5iwziaY/lqMtRh9THq6pbV4e1HP9aI2ZxGUumnmaoQ==", + "license": "MIT", + "dependencies": { + "file-type": "21.3.4", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.28.tgz", + "integrity": "sha512-06m63xIRj8+l8uOeh/8LnYupGubkyu4f+bPKIadaSui6vK9KpXgoz7HveT1yOVLcEt0M0oCOEW5EuEXZkEmBBQ==", + "license": "MIT", + "dependencies": { + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.4.2", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/event-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-3.1.0.tgz", + "integrity": "sha512-DOY/4XBGyIjYyOJKkO6jl1kzFE0ZfX0wV+M2HR5NWymPT9Z0zdCEcZGxTXXkoMRwPtglnvCGJALSjOpXPIcM3g==", + "license": "MIT", + "dependencies": { + "eventemitter2": "6.4.9" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.1.tgz", + "integrity": "sha512-SCCoMEJ6jdeI5h/N+KCVF1+pmg/hmEkNA5nHTS8Gvww7T/LCl4o1gFLinw2iQ60w7slFkszHcGLKGdazVI4F8A==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0 || ^0.15.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-express": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.28.tgz", + "integrity": "sha512-hU+9Sz4m+onHrR5AmelI59QKmY/Re546bPnygnpqqeQdHDiJpBgjWbL4t6Jr73CBpS60cpyng7WzjgphNB9iwA==", + "license": "MIT", + "dependencies": { + "cors": "2.8.6", + "express": "5.2.1", + "multer": "2.2.0", + "path-to-regexp": "8.4.2", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-socket.io": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-11.1.28.tgz", + "integrity": "sha512-vY+GmU2jBcymvgm5rEnftUx4qNxK8cDJmXjl1/1NcpITTNJo0vg07xYR43MwXHcMqe7b0jwqt5+UCTzxqQFIqA==", + "license": "MIT", + "dependencies": { + "socket.io": "4.8.3", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/schematics": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.1.0.tgz", + "integrity": "sha512-lVxGZ46tcdItFMoXr6vyKWlnOsm1SZm/GUqAEDvy2RL4Q4O+3bkziAhrO7Y8JLssFUUvNFEGqAizI52WAxhjDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "@angular-devkit/schematics": "19.2.24", + "comment-json": "5.0.0", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "typescript": ">=4.8.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.24.tgz", + "integrity": "sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.2.24", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.24.tgz", + "integrity": "sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.24", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nestjs/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@nestjs/schematics/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nestjs/serve-static": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.5.tgz", + "integrity": "sha512-AhYx3N9aMwR2cb0w5Nlb5nHNYiAcF74ea/D/xna+PxlXwjmwGN/PpC/5fuMtOwmPBMgOTxNPOnB8C9LDZBSgyw==", + "license": "MIT", + "dependencies": { + "path-to-regexp": "8.4.2" + }, + "peerDependencies": { + "@fastify/static": "^8.0.4 || ^9.0.0", + "@nestjs/common": "^11.0.2", + "@nestjs/core": "^11.0.2", + "express": "^5.0.1", + "fastify": "^5.2.1" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger": { + "version": "11.4.6", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.4.6.tgz", + "integrity": "sha512-Le136h2WC7HGsd70+WyK1qrm+Zq7kFxBLkYC1JgAVqNRCt8kNh7bMF7Qkn65D5j2t/aks0+VbWmUVlYIwPrs3A==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "@nestjs/mapped-types": "2.1.1", + "js-yaml": "5.2.1", + "lodash": "4.18.1", + "path-to-regexp": "8.4.2", + "swagger-ui-dist": "5.32.8" + }, + "peerDependencies": { + "@fastify/static": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.28.tgz", + "integrity": "sha512-B+VgRxeLaH7jkOMgAyUP3N3rpFlisQ7JRxixRbgHvG6a0VgKbbkNSofKExexCgKmQQak80undb3+2kE1lUBmRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/typeorm": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.3.tgz", + "integrity": "sha512-zJ+E5l7auVVA7c0PsvcMdyvRPKTUqU5s2ToYmOA2QEsXQ42qbUGtK4+1HlRfpHqBkCSXP+phiH4luvf9DyJNog==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0 || ^1.0.0-dev" + } + }, + "node_modules/@nestjs/websockets": { + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-11.1.28.tgz", + "integrity": "sha512-jeyclAURCJTN8S8lctDhfLdiJeDKjZmYWWLav653Fb9hl9c+zx5jPhavI8Xk5++R8u+lX9qzaRxtsjEoxTtjyw==", + "license": "MIT", + "dependencies": { + "iterare": "1.2.1", + "object-hash": "3.0.0", + "tslib": "2.8.1" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-socket.io": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/platform-socket.io": { + "optional": true + } + } + }, + "node_modules/@okta/okta-auth-js": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@okta/okta-auth-js/-/okta-auth-js-7.14.5.tgz", + "integrity": "sha512-UPSm/bLgsWOMnAUQnlepcH3S143u1Fzg/mUa8yTXJEjnFZbovMEVsmVCjvFTshTtSANb8Orjp1bzmQavlya6rg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.27.0", + "@peculiar/webcrypto": "^1.4.0", + "atob": "^2.1.2", + "Base64": "1.1.0", + "broadcast-channel": "~5.3.0", + "btoa": "^1.2.1", + "core-js": "^3.39.0", + "cross-fetch": "^3.1.5", + "fast-text-encoding": "^1.0.6", + "js-cookie": "^3.0.1", + "node-cache": "^5.1.2", + "p-cancelable": "^2.0.0", + "tiny-emitter": "1.1.0", + "webcrypto-shim": "^0.1.5", + "xhr2": "0.1.3" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.6", + "resolved": "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", + "integrity": "sha1-PdPCref3AqmpTfs5XBkvX6XWuSI= sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==", + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha1-/mHoUlnjtbpa1WbLYsp1s9PNUzk= sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.3", + "resolved": "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz", + "integrity": "sha1-B4s+j1mOhHt4aD3DumX+tQKbk6c= sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.5.0", + "webcrypto-core": "^1.7.7" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM= sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis-iris/agent-memory": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@redis-iris/agent-memory/-/agent-memory-0.1.1.tgz", + "integrity": "sha512-IlAc5r7dBmZKJiZm6jU4IMe+m3DW+8VW1nPyk0RXvXC8RAbSDJ644+x0cZbvD8KWrOK1XCcJOaXoNkHzQ0QHgw==", + "dependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha1-0/1tPArz75LyZ2e1ZBSjcMe2O3E= sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.11", + "resolved": "https://registry.yarnpkg.com/@redis/client/-/client-1.5.11.tgz", + "integrity": "sha1-XuhiD+pWxny0JyKMNdhANRjv5iI= sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha1-zCuC5RQaKa2izOfSZ6a3S6pt1Rk= sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha1-t6dyW7uQd2XYTJnVXqw/z3cuGA4= sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/@redis/search/-/search-1.1.5.tgz", + "integrity": "sha1-aCtoEUBJ/yj98tgsWABE37dBmf4= sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha1-ptcO96DnHgg+oJuWffCg7XQrxq0= sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha1-O7uYQIXb1tmCSUU4tSO+HOZWKXI= sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true + }, + "node_modules/@segment/analytics-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.8.2.tgz", + "integrity": "sha512-5FDy6l8chpzUfJcNlIcyqYQq4+JTUynlVoCeCUuVz+l+6W0PXg+ljKp34R4yLVCcY5VVZohuW+HH0VLWdwYVAg==", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.0", + "@segment/analytics-generic-utils": "1.2.0", + "dset": "^3.1.4", + "tslib": "^2.4.1" + } + }, + "node_modules/@segment/analytics-generic-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@segment/analytics-generic-utils/-/analytics-generic-utils-1.2.0.tgz", + "integrity": "sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.1" + } + }, + "node_modules/@segment/analytics-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@segment/analytics-node/-/analytics-node-2.3.0.tgz", + "integrity": "sha512-fOXLL8uY0uAWw/sTLmezze80hj8YGgXXlAfvSS6TUmivk4D/SP0C0sxnbpFdkUzWg2zT64qWIZj26afEtSnxUA==", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.0", + "@segment/analytics-core": "1.8.2", + "@segment/analytics-generic-utils": "1.2.0", + "buffer": "^6.0.3", + "jose": "^5.1.0", + "node-fetch": "^2.6.7", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha1-gPy8uvfOAx4O8t0psb/Hw/WDYR8= sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha1-z/j/rcNyrSn9P3gneusp5jLMcN8= sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha1-Zmf6wWxDa1Q0o4ejTe2wExmPbm4= sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha1-ECk1fkTKkBphVYX20nc428iQhM0= sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha1-Vf3/Hsq581QBkSna9N8N1Nkj6mY= sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha1-gh+EQvQXXY8EZ7na8m46GOLQKvI= sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha1-OrwgPHm4w+kP1sFWoMYtVANSDhI= sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "node_modules/@supercharge/promise-pool": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.3.0.tgz", + "integrity": "sha512-qGzCltMN05ohRRQAXB8TPWt+0Coz9Va266gr9nYN1qc/f/EIaup3VRg7b59mtRaeKTRcxreF20l/udCM/gOqNg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha1-/pipP+eJJH6ZjHXnTpx8YyF6onY= sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha1-buRkAGhfEw4ngSjHs4t+Ax/1svI= sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha1-7j3vHyfZ7WbaxuRqKVz/sBUuBY0= sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha1-5DhjFihPALmENb9A9y91oJ2r9sE= sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha1-C5LcwMwcgfbzBqOB8o4xsaVlNuk= sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/adm-zip": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.8.tgz", + "integrity": "sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha1-PfFfJ7qFMZyqB7oI0HIYibs5wBc= sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha1-p66/Fce8Drmr1ji9tcC4cAOZydA= sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8= sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha1-7CwG/tZUnfi8DrRhW2g3SaSpLhs= sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha1-rqIFnii3ZYY5CBNHrE+rPeFm5vA= sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE= sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha1-Zq2TMfY/6KPT2djG45Bt0Q9kRug= sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha1-XXGKXklKgWb1admGeU5JxIshays= sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha1-Qf7E6iDpx7IvAkq4ipXGuyiPUbg= sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha1-Kga8D2iiCrN7PjaqI4vmq99J6LQ= sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ioredis-mock": { + "version": "8.2.5", + "resolved": "https://registry.yarnpkg.com/@types/ioredis-mock/-/ioredis-mock-8.2.5.tgz", + "integrity": "sha1-/7s5iWfTJbHd/MwGldFHksoYjXY= sha512-cZyuwC9LGtg7s5G9/w6rpy3IOZ6F/hFR0pQlWYZESMo1xQUYbDpa6haqB4grTePjsGzcB/YLBFCjqRunK5wieg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "ioredis": ">=5" + } + }, + "node_modules/@types/ioredis-mock/node_modules/ioredis": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/ioredis/-/ioredis-5.5.0.tgz", + "integrity": "sha1-/yMy4SXKKsjhVHLd0U7N/6ZISio= sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", + "dev": true, + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha1-hGfUs8CHgF1jWASAiQeRJ3zjXEQ= sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8= sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha1-K5EJEvodaFbK3NDB+Vr33x1gSeU= sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-bigint": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha1-JQ0p5ZM3VJnYum76qyLQlMMZnvM= sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE= sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4= sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss= sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw= sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz", + "integrity": "sha1-7UkyuKKoBfH+Nipw9OYtCsmU4wE= sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o= sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.76", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-18.19.76.tgz", + "integrity": "sha1-eZFljgukGtMMyL4BybvlgNWPIRI= sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha1-vNU5iT0AtW6WT9JlekhmsiGmVhc= sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha1-YgkyHrLBcSp+dGZCK4yx/A2d1dg= sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "4.1.17", + "resolved": "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.17.tgz", + "integrity": "sha1-yPAWK12KnFLTi4E5jvBlDvl0tFI= sha512-FFK/rRjNy24U6J1BvQkaNWu2ohOIF/kxRQXRsbT141YQODcOcZjzlcc4DGdI2SkTa0rhmF+X14zu6ICjCGIg+w==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha1-3bSgVoWXyarf+NvsWy6P3b6Gkvw= sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha1-OOy2TwGqDQK3yPQiLXw4r2MW/vg= sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha1-jDIwPag+7AUKhLPHrnufki0T4y0= sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha1-DGDlN/p5D1+Ucu0ndsK3HsEXNRs= sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I= sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha1-C/C+EltnAUrcsLCSHmLbe//hay4= sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A= sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo= sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "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": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha1-eU3RacOXft9LpOpHWDWHxYZiNrc= sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz", + "integrity": "sha1-K1JI2sVIWmOQUyxqUX/aLj+qyJ4= sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.6.0.tgz", + "integrity": "sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==", + "license": "MIT", + "engines": { + "node": ">=14.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-memory-client": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/agent-memory-client/-/agent-memory-client-0.3.1.tgz", + "integrity": "sha512-Oyd02/1vlIXZCsVGbcEkGo271QxwSV32LnpbHBzgkIQTFU7H2twJGQE1Sp/XwjibvJIDHqcdyic2suL30lFPvw==", + "license": "MIT", + "dependencies": { + "ulid": "^3.0.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo= sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha1-PV3HYryhdnnDwup+kK1rdTIwlXg= sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha1-N2ETQOsiQ+cMxgTK011jJw1IeBs= sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc= sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4= sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha1-WXGi/BK6FwNpp6HvAYxx5uR8LoY= sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha1-mdnSnHs4OR5vQo0ozhNlUfC3fhI= sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk= sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg= sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0= sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha1-XqNoIEQ9vvtRzH+Iouu1tGIRTzg= sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs= sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz", + "integrity": "sha1-LSLgD4zd61/eXdM1IrVtHPVpqBw= sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha1-pcw3XWoDwu/IelU/PgsVIt7xSEY= sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha1-9DaZGSJbaExWCFmYrGPb0FvgINU= sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha1-+ojsWSMv2bTjbbvFQKjsmptH2nM= sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha1-0QyIhcISVXThwjHKyt+VVnXhzj0= sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha1-qtvpQ0ZBgqiSLDySfDBn/0DSRiY= sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha1-GY+XDxyZqFa0ZtEYfojOML0ZnZE= sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha1-asCNLzEq/7cMTGnA+7pMtBfuVYc= sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha1-imv9XdVCOTYrPQbOR6xSstlddyE= sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha1-tDmSObibKgEfndvj5PQB/EDP9zs= sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha1-+gX6UQ59STiW17DdIDNgHIQPFxw= sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/Base64": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/Base64/-/Base64-1.1.0.tgz", + "integrity": "sha1-gQ7yGvqDV9+SrXtTiRiMRGucuVY= sha512-qeacf8dvGpf+XAT27ESHMh7z84uRzj/ua2pQdJg483m3bEXv/kVFtDnMgvf70BQGqzbZhR9t6BmASzKvqfJf3Q==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha1-J3Csa8R9MSr5eov5pjQ0LgzSXLY= sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "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": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-sqlite3": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz", + "integrity": "sha512-RbOBxmLBG8uvFUc15X9+9SFemKcQ0WBuISBVkpuiaUB2qblC8UWlHEjdWVoZ8AdhSwmoEgsiXKfopX0CQxaACQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/better-sqlite3/node_modules/node-addon-api": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha1-t8QkIlnACJA7E3B5g7X0u9Me2gw= sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo= sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA= sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha1-SQMy9AkZRSJy1VqEgK3AxEE1h4k= sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/broadcast-channel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-5.3.0.tgz", + "integrity": "sha512-0PmDYc/iUGZ4QbnCnV7u+WleygiS1bZ4oV6t4rANXYtSgEFtGhB5jimJPLOVpPtce61FVxrH8CYylfO5g7OLKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "7.22.10", + "oblivious-set": "1.1.1", + "p-queue": "6.6.2", + "unload": "2.4.1" + }, + "funding": { + "url": "https://github.com/sponsors/pubkey" + } + }, + "node_modules/broadcast-channel/node_modules/@babel/runtime": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/browser-or-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-3.0.0.tgz", + "integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==", + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA= sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "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": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha1-6302UwenLPl0zGzadraDVK0za9g= sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz", + "integrity": "sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha1-AamQn4ssk/a/aAuiYTHrMPf6PXM= sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY= sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha1-lm6japUC5DzbkUaWJSO5L1MfaJM= sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU= sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", + "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "defu": "^6.1.6", + "dotenv": "^17.3.1", + "exsolve": "^1.0.8", + "giget": "^3.2.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "rc9": "^3.0.1" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha1-ANKXpCBtceIWPDnq/6gVesBlHw8= sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY= sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha1-Qc/QMrWT45F2pxUzq084SqBP1oE= sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bound/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-deep-equal-ignore-undefined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chai-deep-equal-ignore-undefined/-/chai-deep-equal-ignore-undefined-1.2.0.tgz", + "integrity": "sha512-3y0fKGXMP+lJJg7FbjkNGTbxxtc4yQmr+GHx4qkaev7IyURge4L2Nk4bweUAFOLsnex7aBBMoLRVra4v8nZ/Tw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "chai": ">= 4.0.0 < 7" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE= sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8= sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha1-plAuQxKn7pafZG6Duz3dVigb1pQ= sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha1-e+N6TAPJruHs/oYqSiOyxwwgXTA= sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha1-QnmmICinsfJi80c/yWBfXiGMWbQ= sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha1-cHQTeE27OnKqEcLysEKgvvQAQXA= sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha1-JBR9Xf/Sps6pMKMlCmd63flqszY= sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.4.tgz", + "integrity": "sha512-AwNusCCam51q703dW82x95tOqQp6oC9HNUl724KxJJOfnKscI8dOloXFgyez7LbTTKWuRBA37FScqVbJEoq8Yw==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.22" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha1-F3Oo9LnE1qwxVj31Oz/B15Ri/kE= sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha1-ATuRNRdic5wWqVZ8IaBGMuRJvy8= sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo= sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha1-iN2qRpBuMDtd4w0xU7fZ/goMGaw= sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha1-wLKbzTO80HeaE0TCE2BR5q/T2ek= sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/collection-utils": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/collection-utils/-/collection-utils-1.0.1.tgz", + "integrity": "sha1-MdFDNkiGdPJ678CnxezKz233gEQ= sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==" + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/comment-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-5.0.0.tgz", + "integrity": "sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha1-QUz1r3kKSMYKub5FJ9VtXkETPLE= sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concurrently": { + "version": "5.3.0", + "resolved": "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz", + "integrity": "sha1-dQDeZBDQQ8kSston3jICy0ibHns= sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "bin": { + "concurrently": "bin/concurrently.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/concurrently/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha1-Fk2qyHqy1vbbOimHXi0XZlgtq+0= sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/concurrently/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/concurrently/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/concurrently/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concurrently/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk= sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/concurrently/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE= sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA= sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concurrently/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg= sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-timeout": { + "version": "1.9.1", + "resolved": "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.9.1.tgz", + "integrity": "sha1-LTccXA4zrF+yuy/INjaskkX73WI= sha512-kDcadOXwOu+EEVs31iOu0TOg1yyRTqSNfyJaHYm5Z4K/hEIi9HJXSOWP9d+WQr/wff7wQJRh/HX63vK1+wBErw==", + "dependencies": { + "http-errors": "~1.6.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect-timeout/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/connect-timeout/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/connect-timeout/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/connect-timeout/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/connect-timeout/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect-timeout/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/connect-timeout/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha1-hEQmyzmPk0yu/LsXIgASa8fOrOI= sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha1-i3cxYmVtHRCGeEyPI6VM5tc9eRg= sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co= sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha1-VWNpxHKiupEPKXmJG1JrNDYjftc= sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha1-V8f8PMKTrKuf7FTXPhVpDr5KF5M= sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha1-7macH+os9C3DFYVGnRk/7w1ldxs= sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.41.0", + "resolved": "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha1-V3FNr7jHUaYJXQKKdCjx+1g0p3Y= sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha1-BhRUR9kvSq8ligxE8ktHr66v/vY= sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "dev": true, + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha1-9QtlNi70iXTKn1CzaAVm14a4EdI= sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/core-js-compat/node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha1-ZNdttYcTE2rL60xJEUNmzGzC6A0= sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cpu-features": { + "resolved": "stubs/cpu-features", + "link": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha1-o1XFs8seGvAroXf+ev1/7uSaUyA= sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM= sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha1-hlJkspZ33AFbqEGJGJZd0jL8VM8= sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.7", + "resolved": "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.7.tgz", + "integrity": "sha1-X1oelwIfQnFm/tUPhtSPxwvNkW4= sha512-Ff9FKeIMm0Rx1o8TEV87bTK5M232akt7uSAYrSTU/QA/W6Jj9P+fWn1mxGgl+dwDzpFoAY35OIS2SJXA8WEWKA==", + "dependencies": { + "node-fetch": "2.6.12" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha1-AuuOIgdAGOPVqDAWZJ0E3w40j7o= sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8= sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha1-V/h1YuYt5288cEvSuNUi/DMGjrI= sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo= sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha1-yjh2Et234QS9FthaqwDV7PCcZvw= sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha1-NOImSrU4MB4nz3sHvyNpwZuqjdk= sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha1-fHd1UTCS99+Y2N+Zlt0IXrZozG0= sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo= sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha1-v64A/urq2mjCriVsYlQPYLgGJb0= sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg= sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha1-sLAgYsHiqmL/XZUo8PmLqpCXjXo= sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4= sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha1-iU3BQbt9MGCuQ2b2oBB+aPvkjF4= sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8= sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz", + "integrity": "sha1-6T4aZWn7XmbxajwqKWRhfTSdarE= sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha1-SANzVQmti+VSk0xn32FPlOZvoBU= sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha1-4Yl6qI+mrRl4YpN/vARB7zUu4M0= sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE= sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0= sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha1-Ter4lNEUB8Ue/IQYAS+ecLhOqSE= sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha1-dz8OaVJ6gxXHKF1e5zxEWdIKgCA= sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo= sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s= sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.402", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz", + "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0= sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang= sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha1-e46omAd9fkCdOsRUdOo46vCFelg= sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.9", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz", + "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "@types/ws": "^8.5.12", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.21.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.1", + "resolved": "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.1.tgz", + "integrity": "sha1-KKnMTpDUSOHQupNprQinr4L5lWo= sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha1-h5RbQVGgEddtlaGY1xEchlw2ClI= sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha1-ANxbl7HyM6I8k5jQIJUEz1+U2S8= sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8= sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha1-s6jYu2+S7swWKePifTyGB6ijJBQ= sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8= sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha1-HE8sSDcydZfOadLKGQp/3RcjOME= sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha1-8x274MGDsAptJutjJcgQwP0YvU0= sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha1-njr0B0Wd7tR+mpH5uIWoTrBcVh0= sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha1-70W0Y0ycnZeilq6kEUpfmED5VXg= sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U= sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ= sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k= sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha1-QfJ1B4G0Iw7ViCe8EZ0pNHHssSU= sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw= sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz", + "integrity": "sha1-V4h0WQ3LMhRRQITAgRXYruYeEbw= sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha1-u89LpQdUZ/PyEx6rPP/HPC9deJU= sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/body-parser/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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha1-ardLjy0zIPIGSyqHo455Mf86VWE= sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha1-tskbtHFy1p+Tz9fDV7u1KQGbX2o= sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha1-PjraWuVWj5CV2EN2/TpJuPsAClE= sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/type-is/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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha1-xAaoO25w2eNc47MKgRQd8wrrqIQ= sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha1-CqJff2OCIuM5bXK/k2r88dQtaGc= sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha1-6VJO5rXHfp5QAa8PhfOtu4YjJVw= sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha1-TZzNvGHoYpsln9ymfmWJFEjVaf0= sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/fengari": { + "version": "0.1.4", + "resolved": "https://registry.yarnpkg.com/fengari/-/fengari-0.1.4.tgz", + "integrity": "sha1-ckFmk82eQ719gJ14Kd3AV4t4sLs= sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g==", + "dev": true, + "dependencies": { + "readline-sync": "^1.4.9", + "sprintf-js": "^1.1.1", + "tmp": "^0.0.33" + } + }, + "node_modules/fengari-interop": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/fengari-interop/-/fengari-interop-0.1.3.tgz", + "integrity": "sha1-OtN6kOdDC2mzZUQen8C6FolCoUY= sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw==", + "dev": true, + "peerDependencies": { + "fengari": "^0.1.0" + } + }, + "node_modules/file-stream-rotator": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-1.0.0.tgz", + "integrity": "sha1-3lg3kyGh6m0pOO1fWi7/O3+LJ4A= sha512-qg5mQO7o+vhS7NPqkrkfJS8qqhz0d17Tnewmb5sUTUKwYe27LKaDtbTuRAtQWkBn6jROuFPVIDF5DtckzokFTQ==" + }, + "node_modules/file-type": { + "version": "21.3.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", + "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha1-RCZdPKwH4+p9wkdRY4BkN1SgUpI= sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha1-cjBjc6qJ0FqCQu1WnthqG/98Vh8= sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks= sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fishery": { + "version": "2.4.0", + "resolved": "https://registry.yarnpkg.com/fishery/-/fishery-2.4.0.tgz", + "integrity": "sha1-GB3GQJaN6I7Ul9rMUKFOs5gFwko= sha512-QgeTlvgNhVGuMztrfAhlSIBs3rD3l9RMjl9I15yb/lnrx3njrOhvegr2L3LWdqvXwYfQjdQGpglyAfHH2J8DRA==", + "dev": true, + "dependencies": { + "lodash.mergewith": "^4.6.2" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz", + "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE= sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha1-JsrYAXlnrqhzG8QpYdBKPVmIrMw= sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha1-KEdKFZ07nRHvYgUKFO1g5N9tYbw= sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha1-1lBogCeCaSD+6wr3R+57lCGkHUc= sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha1-cbMoAMnxWqjy+D9Ka9m/812GGlM= sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A= sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo= sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha1-0qUdYBYrvJtKBV2EV6fHUxXRoWg= sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE= sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha1-jdffahs6Gzpc8YbAWl3SZ2ImNaQ= sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha1-5LymgIgWv4+TtSdQ8RJ/Wm/Ybjo= sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0= sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha1-Aoc8+8QITd4SfqpfmQXu8jJdGr8= sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha1-YyqhWiDnGCjtVrJDAzY/sUFOWZc= sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha1-ysZAd4XQNnWipeGlMFxpezR9kNY= sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw= sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha1-NvSmeOlj9P24cH6rBQgjq8To9eQ= sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha1-DXzyDNE/2oCGaf+oj0/8ejlD/EE= sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha1-44X1pLUifUScPqu60FSU7wq76t0= sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro= sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE= sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha1-mF2FxSqZA4ZCgMzCRI1BP78e/tg= sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz", + "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==", + "dev": true, + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys= sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE= sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM= sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz", + "integrity": "sha1-LrKGDgAAEdrk8UBqhv6A5TD7LsY= sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha1-lj7X0HHce/XwhMW/vg0bYiJYaFQ= sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha1-sx3f6bDm6ZFFNqarKGQm0CFPd/0= sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg= sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha1-LNxC1AvvLltO6rfAGnPFTOerWrw= sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha1-pIR3mJs7MnrqPAT1MJbYFtl1IqE= sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0= sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8= sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM= sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha1-NtL2W8kJyHkAGN02+02T2myq4Gs= sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha1-nOy1ZQPAraHydB271lRuSxO1fM8= sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha1-tEed+KX9RPbNziQHBnVnYGPJXLQ= sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha1-kTn1lvYvyccthzNTrFOVvPBXCfc= sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis-mock": { + "version": "8.9.0", + "resolved": "https://registry.yarnpkg.com/ioredis-mock/-/ioredis-mock-8.9.0.tgz", + "integrity": "sha1-XWlMS4HTg15CkeC1J/lH4mCYF3k= sha512-yIglcCkI1lvhwJVoMsR51fotZVsPsSk07ecTCgRTRlicG0Vq3lke6aAaHklyjmRNRsdYAgswqC2A0bPtQK4LSw==", + "dev": true, + "dependencies": { + "@ioredis/as-callback": "^3.0.0", + "@ioredis/commands": "^1.2.0", + "fengari": "^0.1.4", + "fengari-interop": "^0.1.3", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12.22" + }, + "peerDependencies": { + "@types/ioredis-mock": "^8", + "ioredis": "^5" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4= sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha1-O8KoXqdC2eNiBdys3XLKH9xRsFU= sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha1-Nq1i9vc8glP9ZHJRehJIPPA+fsQ= sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha1-fRQK3DiarzARqPKipM+m+q3/sRg= sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4= sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM= sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha1-Qv+fhCBsGZHSbev1IN1cAQQt0vM= sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc= sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha1-S/tKRbYc7oOlpG+6d45OjVnAzgs= sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI= sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM= sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y= sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha1-j4TJQ0iIzGsdCp1wkqdtI56/DMY= sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha1-hzxv/4l0UBGCIndGlqPyiQLXfB0= sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha1-Nm1FTNDct+tuDkGTeOYAcshiYWk= sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I= 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, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0= sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4= sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE= sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha1-JUS8q0doFUKBovCHBHGQJwTMqho= sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha1-E5xAD/c2NpDjOr/6M8u6iSDwAEI= sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo= sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz", + "integrity": "sha1-mUZ2/CQXfwiPHF43N/VpcgT/JhM= sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha1-HAbQfnfHjhWF0CBCTe3BDW4XrDo= sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha1-toF6RfzINdixbVli0MAmRz7jZoo= sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha1-VZLJQHmODK5nfuwWkmTy2DmjeZU= sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha1-vL2ogG28wBseMWpGu3QIWoSwJF8= sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha1-AXk0pm67fs9vIF6EaZvhCv1wRYo= sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo= sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha1-FiqbPyMovdmRvqq/+7dHReVld9E= sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha1-C5PhEd2o7BILyDAObR+5V24WQ3Y= sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha1-NvSZ/c6hl8EEWhJzGcBIFyOQj9E= sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha1-PCOWUkSC9aBQY3bmyFjDu8wXsQQ= sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-html-reporters": { + "version": "3.1.7", + "resolved": "https://registry.yarnpkg.com/jest-html-reporters/-/jest-html-reporters-3.1.7.tgz", + "integrity": "sha1-2MtvXRX9UY5gGEH5AWXzd2Xn/zQ= sha512-GTmjqK6muQ0S0Mnksf9QkL9X9z2FGIpNSxC52E0PHDzjPQ1XDu2+XTI3B3FS43ZiUzD1f354/5FfwbNIBzT7ew==", + "dev": true, + "dependencies": { + "fs-extra": "^10.0.0", + "open": "^8.0.3" + } + }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.yarnpkg.com/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha1-2DjoxWHPn91+tU9jAgd37uQTZ4U= sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I= 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, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha1-W37A2t/f7Ayjg9yaoBbTa16kxyg= sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha1-ro/sef8kn9WSzoDj7kdOg6bETxI= sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha1-i8OS4gTpXf51ZKu+cqQE4o5R9/M= sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha1-ToNs9g6Zxvz6vp+Z0Bfz/dUKY0c= sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha1-kwsVRhZNStWTfVVA5xHU041MrS4= sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha1-SlVtnHdq9o4cX0gZT00DJ9JOilI= sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha1-ZNaomS3Sb2NasMAeXu9Dmca8vDA= sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha1-GwTywJXzf8d2/0CAPckpIbHohCg= sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha1-rQ11Msb+qdoevcgnQtdFJcYnM4Q= sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha1-tsh6nyqgbfq1Lj1wrIzeMh+lpI0= sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha1-gJrwctQIpT3P0uhJpMl20xMvcY4= sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI= sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha1-7+yzFBz303Z6OgzI98mZBYfT2Bc= sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg= sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha1-wsV0w/UYZdobsykDZ3imm/iKa+U= sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha1-U1LTmNEepefvMwyFTeodrgvxgWU= sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha1-v8BbDMMevYrwmWRlDO5yO7IoEIs= sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha1-I8K2K/sivoK0TemAVYAv83EPwLw= sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha1-e/cFURxk2lkdRrFfzkFADVIUfZw= sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo= sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha1-eBDTDWGcOmIJMiPOa7NZyhsoovI= sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-when": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.7.0.tgz", + "integrity": "sha512-aLbiyxmtksijcrKFir7n+t+XPbqSLV01eDkRyX28WM4VgA/iSc3mG8R8O2evDtOAa6SefrJiTIt/rTqqyrwVZg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jest": ">= 25" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha1-rK0HOsu663JivVOJ4bz0PhAFjUo= sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/joi": { + "version": "17.13.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz", + "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jose": { + "version": "5.4.0", + "resolved": "https://registry.yarnpkg.com/jose/-/jose-5.4.0.tgz", + "integrity": "sha1-T2wjV+ezzUvBDsZbsp5nfXrfvIQ= sha512-6rpxTHPAQyWMb9A35BroFl1Sp0ST3DpPcm5EVIxZxdH+e0Hv9fwhyB3XLKFUcHNpdSDnETmBfuPPTTlYz5+USw==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha1-5RuEv3j79XArlUHiy3v8uJO0Pnk= sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + }, + "node_modules/js-cookie": { + "version": "3.0.7", + "resolved": "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.7.tgz", + "integrity": "sha1-ClOr/EWcjonIXXo462y2hxSWW4w= sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==", + "engines": { + "node": ">=20" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk= sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha1-u4sJpll7pCZCXy5KByRcPQC5ND4= sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha1-rlR4I6wMrYOYZn+M2e9HMPWwH/E= sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI= sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM= sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha1-8qUktPf9EePXkeVZl3rWC5i3mLQ= sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4= sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha1-TGIlcI9RtQy/d8Wq6BchlkwpGMs= sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.11.11", + "resolved": "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.11.tgz", + "integrity": "sha1-9NUh1+LRlYkWgg43JeYJoup1dag= sha512-mF3KaORjJQR6JBNcOkluDcJKhtoQT4VTLRMrX1v/wlBayL4M8ybwEDeryyPcrSEJmD0rVwHUbBarpZwN5NfPFQ==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha1-7KKE910pZQeTCdwK2SVauy68FjI= sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha1-KalX86Y5c4g+toTxD/09FR/sAaM= sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha1-Y9mNYPIbMTt3xNbaGL+mnYDh1ZM= sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168= sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha1-YXEh+JrFX1kEfHrsHM1mVMZZD1U= sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM= sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz", + "integrity": "sha1-RMd8NL7NcbOkKjlwx3kp5Sxu1Is= sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "dependencies": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha1-bmm31Nt9OrQ2MoAT030cjDVAxpc= sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha1-RQpElnPSRg5bvPupphkWoXFMdFM= sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k= sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz", + "integrity": "sha1-w9qaaq46MLRreww0m4exENw72k8= sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz", + "integrity": "sha1-16IRD4b3ndlQqLbfbVe8mEqhhfY= sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ==", + "deprecated": "this will be v4", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps= sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha1-6pIvZgY1oiSe5WXgRJ+VHmtgOAg= sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI= sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha1-zds+5PnGRTDf9kAjZmHULLajFPU= sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha1-sdlNaZepsy/WnrrtDbc96Ky1Gc4= sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha1-LR1Zr5wbEpgVrMwsRqAipc4fo8k= sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw= sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34= sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM= sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mocha": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.8.0.tgz", + "integrity": "sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", + "integrity": "sha1-c59VldDwUdB6+ddOMsQW4TpBzeU= sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-junit-reporter/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha1-5E5MVgf7J5wWgkFxPMbg/qmty1A= sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha-multi-reporters": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz", + "integrity": "sha1-xzSGvtVRnh1Zyc45rHqXkmAOVnY= sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz", + "integrity": "sha1-P7NNOHzXbYA/buvqZ7kh2rAYKpo= sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw= sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28= sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY= sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ= sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ= sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.2.0.tgz", + "integrity": "sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">= 10.16.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz", + "integrity": "sha1-Jqb6rn/76yk6OWYOiKdrguMLdVQ= sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "optional": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY= sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha1-WOMjpy/twNb5zU0x/kn1FHlZDM0= sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nest-winston": { + "version": "1.10.2", + "resolved": "https://registry.yarnpkg.com/nest-winston/-/nest-winston-1.10.2.tgz", + "integrity": "sha1-Oj3hUWd8vzk9Liwu/R+SIqV3Zwg= sha512-Z9IzL/nekBOF/TEwBHUJDiDPMaXUcFquUQOFavIRet6xF0EbuWnOzslyN/ksgzG+fITNgXhMdrL/POp9SdaFxA==", + "dependencies": { + "fast-safe-stringify": "^2.1.1" + }, + "peerDependencies": { + "@nestjs/common": "^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "winston": "^3.0.0" + } + }, + "node_modules/nestjs-form-data": { + "version": "1.9.93", + "resolved": "https://registry.yarnpkg.com/nestjs-form-data/-/nestjs-form-data-1.9.93.tgz", + "integrity": "sha1-TRBc1ZVg7y6LFt214YfKvoaFy7w= sha512-j1af2Ck+ix1A7M91wWemUU3hcF8UmHP19/eatEjfjD2Q/3289rckUvqK+rCSbsl3+w/W8PbHRllnGZxjOF8bOw==", + "dependencies": { + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "file-type": "^16.5.4", + "mkdirp": "^1.0.4", + "type-is": "^1.6.18", + "uid": "^2.0.0" + }, + "engines": { + "node": " >=20" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.1", + "class-validator": "^0.13.2 || ^0.14.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^6.6.3 || ^7.2.0 || ^7.5.0" + } + }, + "node_modules/nestjs-form-data/node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha1-R0+09wS+5CdoH5jdOQBYoXKmwv0= sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/nestjs-form-data/node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha1-NYuA/+bV1WIOGaBzqnjOlHqQ+aA= sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/nestjs-form-data/node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha1-D4l/A2ZYRpgoBuE4l32+ctRN91M= sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/nock": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", + "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.yarnpkg.com/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha1-GOIhRndJm43agf/NCVr8dj1amAI= sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha1-qUN36WSpo3rDl22EjLXHZYM7hUg= sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha1-UqGgtHUZPgko6Y4EJqDRJUeCt38= sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha1-8mTcLMrQp4DnYlOmlOn9DtGcOY0= sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha1-aaAVDmlG4vEV6dfqTfeXHiYoMBw= sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0= sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha1-wDBDuzJ/QXoY/uerfuV7QIoUQwE= sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-version-compare": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/node-version-compare/-/node-version-compare-1.0.3.tgz", + "integrity": "sha1-ym0gBeZ4IvtN+iWeCPH2z6q+LoE= sha512-unO5GpBAh5YqeGULMLpmDT94oanSDMwtZB8KHTKCH/qrGv8bHN0mlDj9xQDAicCYXv2OLnzdi67lidCrcVotVw==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo= sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha1-EzXa4S3ch7biSdWhmUykva6nXwI= sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE= sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha1-f6rmI1P7QhM2bQypg1jSLoNosF8= sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg= sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A= sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-diff": { + "version": "0.0.4", + "resolved": "https://registry.yarnpkg.com/object-diff/-/object-diff-0.0.4.tgz", + "integrity": "sha1-2IOwRE/o/W4E5ZXXu2ZWgskWBH8= sha512-V+OhEnGkRTtncF194MB6+Cd4Khogq0SvZzypUXHVzbay5xv5jtqgMkGQYB9bByq0FR9ygokwSOsvG05ybmqvPA==", + "dev": true + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha1-c/l/dT57r/wOLMnW4HkHl0Ssguk= sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM= sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oblivious-set": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.1.1.tgz", + "integrity": "sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==", + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha1-WMjEQRblSEWtV/FKsQsDUzGErD8= sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha1-WdpPkcRfX5icbkvO3Fo7Cu1w/2U= sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha1-4GvBdK7SFO1Y7e3lc7Qzu/gny0U= sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz", + "integrity": "sha1-W1/+Ko95Pc0qrXPlUMuHtZywhPk= sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz", + "integrity": "sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg= sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha1-qrf71BZYL6MqPbSYWcEiSHxe0s8= sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50= sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha1-NTf2VGZew8w4gnOH/JBMFjxU9QY= sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU= sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI= sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk= sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha1-hTTnenfOesWiUS6iHg/bj89sPY0= sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha1-Ts4REb9cKtiGfDFMgTVoR+imLnI= sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s= sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha1-MBiuMuz8/2wpuiJny/IRZqwfNrk= sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha1-Gm+hajjRKhkB4DIPoBcFHFOc47E= sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha1-k+NYK8DlQmWG2dB7ee5A/IQd5K4= sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha1-3pfVs0pwoMgTNP0kZB8qFwI1LkU= sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha1-ykLHWDEPNlv6caC9oKgHFgt3aBI= sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha1-B0SWkK1Fd30ZJKwquy/IiV26g2s= sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI= sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I= sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha1-lbBaIwc9MKF6z9ySpEDv0rrv3JM= sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha1-e1fnOzpIAprRDr1E90sBcipMsGk= sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha1-QM3tqxgIXHkjNOZPCsFyVtOPmkU= sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU= sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha1-p0h1aK2tV3z6qn6IxJyrOrMIGro= sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY= sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha1-AnQi4vrsCyXhVJw+G9gwm5EztuU= sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha1-0XPPIyWCMZdsy9sFJHyXh5V2BPI= sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/pvtsutils": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz", + "integrity": "sha1-n4Vw0TLN08J6t9UaJ5kjm/jY1d4= sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha1-81/B0n5809+9OcCCbRc+gGoD9aM= sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quicktype-core": { + "version": "23.0.176", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.176.tgz", + "integrity": "sha512-zKgd25bZtPgJ3SQorT6EpRsdW6kAlOh3hXj/RH6fyUuFRkN5Qx61j4F/iRMRm+EyxpvyI6jxZAh/MJ50ZMAjDQ==", + "license": "Apache-2.0", + "dependencies": { + "@glideapps/ts-necessities": "2.2.3", + "browser-or-node": "^3.0.0", + "collection-utils": "^1.0.1", + "cross-fetch": "^4.0.0", + "is-url": "^1.2.4", + "js-base64": "^3.7.7", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.5.2", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.4.1" + } + }, + "node_modules/quicktype-core/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha1-8Deu8VgLs6GjUWTqKoSLqBtEWYM= sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha1-nn/ExFCZuu7ZNL/265e6bPJyngk= sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc9": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz", + "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.6", + "destr": "^2.0.5" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234= sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc= sha512-+UBirHHDm5J+3WDmLBZYSklRYg82nMlz+enn+GMZ22nSR2f4bzxmhso6rzQW/3mT2PVzpzDTiYIZahk8UmZ44w==", + "dev": true, + "dependencies": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc= sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha1-XVK7Xfe1SGH9SNAV6TosuHs+4Ls= sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha1-64WAFDX78qfuWPGeCSGwaPxplI0= sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha1-Qd9/u0tjEtZzARWUFFcFv1bYhzs= sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/redis": { + "version": "4.6.10", + "resolved": "https://registry.yarnpkg.com/redis/-/redis-4.6.10.tgz", + "integrity": "sha1-B/bqKyxUVbCY520ejJszdhFOlFg= sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.11", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.6", + "@redis/search": "1.1.5", + "@redis/time-series": "1.0.5" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha1-qhE4ErqJm2MGWMdiNGa+ceH4b2Y= sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha1-NYDODE+u3vWZ7MsUZhJDa2KhduU= sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha1-3yP/JuDFswCmRwytFgqdCQw6N6s= sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha1-BZPLrLJ1J5J2kgMJKK5NO4eNb40= sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "dev": true, + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0= sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha1-DtCUPU4wGGeVV2bJ8+GubQHGhF8= sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0= sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha1-YWs9wsVwVrVYjDHN9LPWTbEzcg8= sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha1-+Mk0uOahP1OeOLcJji42E08B6AA= sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz", + "integrity": "sha1-AZvmILcRyHZBFnzHm5kJDwCxRu8= sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha1-E4yEtvbts9tfjvPvcRW49VzL+IY= sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha1-SDmG7E7TjhxsSMNIlKkYLb/2im4= sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz", + "integrity": "sha1-MqdVT7d3uDHfqCg3D3c6OAjTchI= sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serialize-javascript": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz", + "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha1-nAJWTuJZvdIlG4LWWaLn4ZONZvk= sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc= sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha1-qscjFBmOrtl1z3eyw7a4gGleVEk= sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ= sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha1-64tWi/OD39GGejLD8rdOtSvb8j8= sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I= sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo= sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk= sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha1-9Gl2CCujXCJj8cirXt/ibEHJVS8= sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha1-SjnbVJKHyXnTUhEvoD/Zn9a8NUM= sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha1-E01oEpd1ZDfMBcoBNw06elcQde0= sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha1-x6H5xwPXdWhEdRtv+av8F4BmQII= sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha1-h5RbQVGgEddtlaGY1xEchlw2ClI= sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-mock": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/socket.io-mock/-/socket.io-mock-1.3.2.tgz", + "integrity": "sha1-P29W+bwqKFJ4O9iq6FFZ3vXNGUI= sha512-p4MQBue3NAR8bXIHynRJxK/C+J3I3NpnnpgjptgLFSWv4u9Bdkubf2t0GCmyLmUTi03up0Cx/hQwzQfOpD187g==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM= sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8= sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha1-EDaFuLj5t5dxMYgnqnhlCmENRX4= sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha1-T1qwZo8AWeNPnADc4zF4ShLeTpw= sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha1-cYmkdMRvjUfHsNpLmHu0XpCL0tU= sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM= sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/sql-highlight": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/sql-highlight/-/sql-highlight-6.1.0.tgz", + "integrity": "sha1-40AktMbqwnRGSHce3+PB+JQVN0M= sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==", + "funding": [ + "https://github.com/scriptcoded/sql-highlight?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/scriptcoded" + } + ], + "engines": { + "node": ">=14" + } + }, + "node_modules/ssh2": { + "version": "1.15.0", + "resolved": "https://registry.yarnpkg.com/ssh2/-/ssh2-1.15.0.tgz", + "integrity": "sha1-L5mEVQNqf4ng31hH77VCF0jZhxs= sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.9", + "nan": "^2.18.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08= sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha1-iVP8BTWYaKd7W5c5pmXFl3u330U= sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha1-j3XuzvdlteHPzcCA2llAntQk44I= sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha1-QE3R4iR8qUr1VOhBqO8OqiONp2Q= sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha1-qKjce9XBqCubPIuH4SX2aHG25Xo= sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", + "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { + "version": "3.8.3", + "resolved": "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha1-Rg6g29t9WxG8T3jeulZfhqF44Sg= sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/superagent/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps= sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/superagent/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/superagent/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/supertest": { + "version": "4.0.2", + "resolved": "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz", + "integrity": "sha1-wiNNvdbcebbxW5nI1ld7kOTOPzY= sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw= sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha1-btpL00SjyUrqN21MwxvHcxEDngk= sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.32.8", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.8.tgz", + "integrity": "sha512-dgMdWXIgnI4zX4OPhKEdWnlDODbgm8W3AX0Ivn/BBqcUh6xZsBxhZMnvk6DJyRz1BTrj8dPxtarmEGgkz30oyA==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.3.tgz", + "integrity": "sha512-CDje4PndhTD2HkgyKH3pab+LKspDeB/NhPN2OF1j+piYIamQqBYwAXWESOT1Yju2xFg51bRW9sUng2WxDjzArw==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=4.11.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha1-gAgk2/TvBt7Zr+pKyv5xxnx2uTA= sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha1-rK2EwoQTawYNw/qmRHSqmuvXcoc= sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4= sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/tiny-emitter": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-1.1.0.tgz", + "integrity": "sha1-q0BaIf/tgUp2wZc5ZICT1wZU/ss= sha512-HFhr+OKGIHRO6krgzEt9MqbMO98wPDzDPr1BOpM/nZCChkK40UYn8b70nSjcan4jTzDSQecy1KRVVQRohIRWrw==" + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha1-EicVSUkToYBRZqr3yTRnkz7qJsQ= sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha1-LOZQzbJi6REqGOZdwp3LUTyBVeA= sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha1-O+NDIaiKgg7RvYDfqjPkefu43TU= sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha1-TKCakJLIi3OnzcXooBtQeweQoMw= sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha1-pZUhTHKY24M57u7gg+TRC9jLjdk= sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "node_modules/ts-jest": { + "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": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.5", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-loader": { + "version": "6.2.2", + "resolved": "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz", + "integrity": "sha1-3/o4ebAaGh4KS4XiuEIdwN//HFg= sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8.6" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-loader/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew= sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/ts-loader/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-loader/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I= sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-mocha": { + "version": "11.1.0", + "resolved": "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-11.1.0.tgz", + "integrity": "sha1-2DNuwBRr1vNsyiVV9M/H34W9FYY= sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==", + "dev": true, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X", + "ts-node": "^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X", + "tsconfig-paths": "^4.X.X" + }, + "peerDependenciesMeta": { + "tsconfig-paths": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha1-cPAhyeGFvM3Kgg4m3EE4BcEBxx8= sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha1-Aar/9ZEwwEqMTryWowRcQ8N2RJo= sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha1-Y9mNYPIbMTt3xNbaGL+mnYDh1ZM= sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8= sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tunnel-ssh": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/tunnel-ssh/-/tunnel-ssh-5.1.2.tgz", + "integrity": "sha1-2ktOJiYzryawU2pQljqCe5ua/vM= sha512-PNfxgg5aEV9ZWpx4oHvkyPoC7TvYGdbob9L35BrYGY/LM3mt5KUQ5uOO9PbT/gNQowGanOfli3JGwRZ+DTd2ZQ==", + "dependencies": { + "ssh2": "^1.15.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A= sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo= sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha1-pyOVRQpIaewDP9VJNxtHrzou5TY= sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-buffer/node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio= sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-buffer/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha1-qX7nqf9CaRufeD/xvFES/j/KkIA= sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typeorm": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.31.tgz", + "integrity": "sha512-6u9EFtdLBgHjnPm78NStVeM+I/1MolTzKykDDcydzKUkh6E++YS6XViU/fePJbvDvEGU4Xq34KOM/CLeer9I2A==", + "license": "MIT", + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "ansis": "^4.3.1", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "dayjs": "^1.11.21", + "debug": "^4.4.3", + "dedent": "^1.7.2", + "dotenv": "^16.6.1", + "glob": "^10.5.0", + "reflect-metadata": "^0.2.2", + "sha.js": "^2.4.12", + "sql-highlight": "^6.1.0", + "tslib": "^2.8.1", + "uuid": "^11.1.1", + "yargs": "^17.7.3" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">=16.13.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@sap/hana-client": "^2.14.22", + "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "ioredis": "^5.0.4", + "mongodb": "^5.8.0 || ^6.0.0", + "mssql": "^9.1.1 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^6.3.0 || ^7.0.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0 || ^5.0.14", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3 || ^6.0.0", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.yarnpkg.com/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha1-KBXB70kK2vDWEq46aZ6Qy89wqRc= sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/typeorm/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28= sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w= sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ= sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha1-9tgdLhxl0Adi5eKbFsXS2ZXiCK0= sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/typeorm/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha1-CVl5+bzA0J2jJNWNA86Pg3TL5lo= sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/uid/-/uid-2.0.2.tgz", + "integrity": "sha1-S1eCq/Dy/u78APqIAGsrO3rz47k= sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ulid": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-3.0.2.tgz", + "integrity": "sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==", + "license": "MIT", + "bin": { + "ulid": "dist/cli.js" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha1-KTV6iee3ykrvO/D9P9DNc4hCKek= sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha1-yzFz/kfKdD4ighbko93EyE1ijMI= sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM= sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha1-Zaet+thXTCGYkOIZKFzkxk7Wfqo= sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha1-lqnP+35hmg3HNowo2ifgX8j5vl8= sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha1-MB1PikPSt1yXrfrYfJ3VNQyUddE= sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha1-j9iEVpbi4UqLZ9ePqeDdLK1i/sg= sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc= sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unload": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.4.1.tgz", + "integrity": "sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==", + "license": "Apache-2.0", + "funding": { + "url": "https://github.com/sponsors/pubkey" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz", + "integrity": "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha1-IEsNa2Ba6AvqVL6jkoDNt8n5I8w= sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha1-Yzbo1xllyz01obu3hoRFp8BSZL8= sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU= sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc= sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo= sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.15.23", + "resolved": "https://registry.yarnpkg.com/validator/-/validator-13.15.23.tgz", + "integrity": "sha1-Wah0+E5FlFiONAmrHtvmTpbQxi0= sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz", + "integrity": "sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.7", + "resolved": "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz", + "integrity": "sha1-BvJLNJhGPlcP7WTXyrFJ5UN7Fiw= sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/webcrypto-shim": { + "version": "0.1.7", + "resolved": "https://registry.yarnpkg.com/webcrypto-shim/-/webcrypto-shim-0.1.7.tgz", + "integrity": "sha1-2oviMGGgRRzyO0JNSpthwQ8JHBI= sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha1-GjQHwVjVR6n+tCKanjOFt7YMmRc= sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha1-d2sf412Qrr6Z6KwV6yQJM4mkpAk= sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha1-3wOELocLa4jhF1JKSzZLb8aJ+VY= sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array/node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha1-BzapZg9TfjOIgm9EDV7EX3ROqkw= sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array/node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio= sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array/node_modules/call-bound/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE= sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha1-9gpkOvh/iGfyMXDYzYfb42A6Yl8= sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-daily-rotate-file/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha1-WtUYWB7vxEO9djRyuP8unCwNVKU= sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha1-bnsN0E05MXHtXk5JBdsmX3qzhPo= sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/winston/node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha1-9skjlbIUGv144qiJ6AyzOP6fykE= sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM= sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug= sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xhr2": { + "version": "0.1.3", + "resolved": "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz", + "integrity": "sha1-y/xHWaabSoiOeM9PILBRA4dXvRE= sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha1-DQRcOyurrY59sa9a8JP10NYN+Zo= sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8= sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha1-oNa9Lvs90DxZNwIjcBg05gQJvX0= sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk= sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU= sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes= sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo= sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc= sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A= sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs= sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "stubs/cpu-features": { + "version": "1.0.0", + "optional": true + } + } +} diff --git a/redisinsight/api/package.json b/redisinsight/api/package.json index 1d172f9f8a..4fac2940df 100644 --- a/redisinsight/api/package.json +++ b/redisinsight/api/package.json @@ -1,6 +1,6 @@ { "name": "redisinsight-api", - "version": "3.6.0", + "version": "3.8.0", "description": "Redis Insight API", "private": true, "author": { @@ -13,7 +13,7 @@ "build:defaults:commands": "ts-node ./scripts/default-commands.ts", "build:defaults:tutorials": "ts-node ./scripts/default-tutorials.ts", "build:defaults:content": "ts-node ./scripts/default-content.ts", - "build:defaults": "yarn build:defaults:commands && yarn build:defaults:content && yarn build:defaults:tutorials", + "build:defaults": "npm run build:defaults:commands && npm run build:defaults:content && npm run build:defaults:tutorials", "prebuild": "rimraf dist", "build": "nest build", "build:prod": "rimraf dist && nest build -p ./tsconfig.build.prod.json && cross-env NODE_ENV=production", @@ -22,7 +22,7 @@ "minify:prod": "node ./esbuild.js --production", "minify:dev": "node ./esbuild.js --watch", "generate:openapi-spec": "ts-node --transpile-only -r tsconfig-paths/register ./scripts/dump-openapi.ts", - "generate:api-client": "yarn generate:openapi-spec && openapi-ts", + "generate:api-client": "npm run generate:openapi-spec && openapi-ts", "start": "nest start", "start:dev": "cross-env NODE_ENV=development nest start --watch", "start:debug": "nest start --debug --watch", @@ -35,107 +35,124 @@ "test:e2e": "jest --config ./test/jest-e2e.json -w 1", "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d ./config/ormconfig.ts", "test:api": "cross-env NODE_ENV=test ts-mocha --paths --config ./test/api/.mocharc.cjs", - "test:api:cov": "nyc --reporter=html --reporter=text --reporter=text-summary yarn run test:api", - "test:api:ci:cov": "cross-env nyc -r text -r text-summary -r html yarn run test:api --reporter mocha-multi-reporters --reporter-options configFile=test/api/reporters.json && nyc merge .nyc_output ./coverage/test-run-coverage.json", - "typeorm:migrate": "cross-env NODE_ENV=staging yarn typeorm migration:generate ./migration/migration", - "typeorm:run": "yarn typeorm migration:run", - "typeorm:run:stage": "cross-env NODE_ENV=staging yarn typeorm migration:run", - "type-check": "tsc --project tsconfig.check.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'yarn --cwd redisinsight/api tscheck'", + "test:api:cov": "nyc --reporter=html --reporter=text --reporter=text-summary npm run test:api", + "test:api:ci:cov": "cross-env nyc -r text -r text-summary -r html npm run test:api -- --reporter mocha-multi-reporters --reporter-options configFile=test/api/reporters.json && nyc merge .nyc_output ./coverage/test-run-coverage.json", + "typeorm:migrate": "cross-env NODE_ENV=staging npm run typeorm -- migration:generate ./migration/migration", + "typeorm:run": "npm run typeorm -- migration:run", + "typeorm:run:stage": "cross-env NODE_ENV=staging npm run typeorm -- migration:run", + "type-check": "tsc --project tsconfig.check.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'npm run tscheck --prefix redisinsight/api'", "tscheck": "tsc --project tsconfig.check.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts overwrite .tscheck.rec.json", "tscheck:force": "tsc --project tsconfig.check.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts force_overwrite .tscheck.rec.json" }, - "resolutions": { + "overrides": { "word-wrap": "1.2.4", - "jest/**/micromatch": "^4.0.8", - "mocha/minimatch": "^3.0.5", - "**/semver": "^7.5.2", - "**/cpu-features": "file:./stubs/cpu-features", - "**/cross-spawn": "^7.0.5", - "**/redis-parser": "3.0.0", - "winston-daily-rotate-file/**/file-stream-rotator": "^1.0.0", - "**/form-data": "^4.0.4", + "jest": { + "micromatch": "^4.0.8" + }, + "semver": "^7.5.2", + "cpu-features": "file:./stubs/cpu-features", + "cross-spawn": "^7.0.5", + "redis-parser": "3.0.0", + "winston-daily-rotate-file": { + "file-stream-rotator": "^1.0.0" + }, "form-data": "^4.0.4", - "supertest/**/form-data": "^4.0.4", - "@nestjs/cli/glob": "11.1.0", - "@nestjs/swagger/js-yaml": "4.1.1", - "**/multer": "^2.0.2" + "supertest": { + "form-data": "^4.0.4" + }, + "@nestjs/swagger": { + "js-yaml": "^4.3.1" + }, + "lodash": "^4.18.1", + "path-to-regexp": "^8.4.2", + "multer": "^2.0.2", + "ws": "^8.21.1", + "picomatch@4": "^4.0.5", + "brace-expansion@1": "^1.1.18", + "brace-expansion@2": "^2.1.4", + "brace-expansion@5": "^5.0.9", + "js-yaml@3": "^3.15.1", + "js-yaml@4": "^4.3.1", + "minimatch@9": "^9.0.7", + "serialize-javascript": "^7.0.5", + "tmp": "^0.2.6" }, "dependencies": { - "@azure/msal-node": "^5.0.2", - "@nestjs/common": "^11.0.20", - "@nestjs/core": "^11.1.18", - "@nestjs/event-emitter": "^3.0.1", + "@azure/msal-node": "^5.5.0", + "@nestjs/common": "^11.1.28", + "@nestjs/core": "^11.1.28", + "@nestjs/event-emitter": "^3.1.0", "@nestjs/platform-express": "^11.1.3", - "@nestjs/platform-socket.io": "^11.0.20", + "@nestjs/platform-socket.io": "^11.1.28", "@nestjs/serve-static": "^5.0.3", - "@nestjs/swagger": "^11.1.3", - "@nestjs/typeorm": "^11.0.0", - "@nestjs/websockets": "^11.0.20", - "@okta/okta-auth-js": "^7.12.1", + "@nestjs/swagger": "^11.4.6", + "@nestjs/typeorm": "^11.0.3", + "@nestjs/websockets": "^11.1.28", + "@okta/okta-auth-js": "^7.14.5", "@redis-iris/agent-memory": "^0.1.1", - "@segment/analytics-node": "^2.1.3", - "@supercharge/promise-pool": "^3.2.0", + "@segment/analytics-node": "^2.3.0", + "@supercharge/promise-pool": "^3.3.0", "@types/json-bigint": "^1.0.4", - "adm-zip": "^0.5.9", + "adm-zip": "^0.6.0", "agent-memory-client": "^0.3.1", - "axios": "^1.16.0", - "better-sqlite3": "^12.10.1", - "body-parser": "^1.20.3", + "axios": "^1.19.0", + "better-sqlite3": "^13.0.3", + "body-parser": "^1.20.6", "busboy": "^1.6.0", "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", + "class-validator": "^0.14.4", "combined-stream": "^1.0.8", "connect-timeout": "^1.9.1", - "date-fns": "^2.29.3", - "detect-port": "^1.5.1", + "date-fns": "^2.30.0", + "detect-port": "^1.6.1", "dotenv": "^16.0.0", - "express": "5.2.0", + "express": "5.2.1", "form-data": "^4.0.4", "fs-extra": "^10.0.0", "ioredis": "^5.2.2", "is-glob": "^4.0.1", "json-bigint": "^1.0.0", - "jsonwebtoken": "^9.0.2", + "jsonwebtoken": "^9.0.3", "keytar": "^7.9.0", "lodash": "^4.18.1", "nest-winston": "^1.10.2", "nestjs-form-data": "~1.9.93", "node-version-compare": "^1.0.3", - "quicktype-core": "^23.0.116", + "quicktype-core": "~23.0.176", "redis": "^4.6.10", "redis-parser": "3.0.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.5.6", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.2", "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1", + "socket.io-client": "^4.8.3", "source-map-support": "^0.5.19", - "swagger-ui-express": "^4.1.4", + "swagger-ui-express": "^4.6.3", "tunnel-ssh": "^5.1.2", - "typeorm": "^0.3.29", - "uuid": "^14.0.0", - "winston": "^3.3.3", + "typeorm": "^0.3.31", + "uuid": "^14.0.1", + "winston": "^3.19.0", "winston-daily-rotate-file": "^4.5.0" }, "devDependencies": { - "@babel/core": "^7.25.8", - "@babel/preset-env": "^7.25.4", + "@babel/core": "^7.29.7", + "@babel/preset-env": "^7.29.7", "@faker-js/faker": "^8.4.1", - "@hey-api/openapi-ts": "0.97.3", + "@hey-api/openapi-ts": "0.99.0", "@mochajs/json-file-reporter": "^1.3.0", - "@nestjs/cli": "^11.0.10", - "@nestjs/schematics": "^11.0.5", - "@nestjs/testing": "^11.0.20", - "@types/adm-zip": "^0.5.0", - "@types/express": "^5.0.0", + "@nestjs/cli": "^11.0.24", + "@nestjs/schematics": "^11.1.0", + "@nestjs/testing": "^11.1.28", + "@types/adm-zip": "^0.5.8", + "@types/express": "^5.0.6", "@types/ioredis-mock": "^8", "@types/jest": "^29.5.14", - "@types/lodash": "^4.14.167", + "@types/lodash": "^4.17.25", "@types/node": "^24", - "@types/ssh2": "^1.11.6", + "@types/ssh2": "^1.15.5", "@types/supertest": "^2.0.8", "babel-jest": "^29.7.0", - "chai": "^4.3.4", - "chai-deep-equal-ignore-undefined": "^1.1.1", + "chai": "^4.5.0", + "chai-deep-equal-ignore-undefined": "^1.2.0", "concurrently": "^5.3.0", "cross-env": "^7.0.3", "esbuild": "^0.28.1", @@ -144,22 +161,22 @@ "jest": "^29.7.0", "jest-html-reporters": "^3.1.7", "jest-junit": "^16.0.0", - "jest-when": "^3.2.1", - "joi": "^17.4.0", - "mocha": "^11.7.5", + "jest-when": "^3.7.0", + "joi": "^17.13.4", + "mocha": "^11.8.0", "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", - "nock": "^13.3.0", + "nock": "^13.5.6", "nyc": "^15.1.0", "object-diff": "^0.0.4", "rimraf": "^3.0.2", "socket.io-mock": "^1.3.2", "supertest": "^4.0.2", - "ts-jest": "^29.2.5", + "ts-jest": "^29.4.12", "ts-loader": "^6.2.1", "ts-mocha": "^11.1.0", "ts-node": "^10.9.2", - "tsconfig-paths": "^3.9.0", + "tsconfig-paths": "^3.15.0", "tsconfig-paths-webpack-plugin": "^3.3.0", "typescript": "^4.8.2" }, diff --git a/redisinsight/api/scripts/postinstall-generate-client.js b/redisinsight/api/scripts/postinstall-generate-client.js index abaafbfd7a..cee280ae34 100644 --- a/redisinsight/api/scripts/postinstall-generate-client.js +++ b/redisinsight/api/scripts/postinstall-generate-client.js @@ -11,7 +11,7 @@ * * Failures are logged but do not abort install: the missing client surfaces * as a build/type error instead, which is easier to diagnose than an aborted - * `yarn install`. + * `npm install`. */ const path = require('path'); @@ -25,7 +25,7 @@ if (process.env.SKIP_API_CLIENT_GEN === '1') { const apiDir = path.resolve(__dirname, '..'); console.log('[postinstall] Generating OpenAPI client...'); -const result = spawnSync('yarn', ['generate:api-client'], { +const result = spawnSync('npm', ['run', 'generate:api-client'], { cwd: apiDir, stdio: 'inherit', shell: process.platform === 'win32', @@ -35,7 +35,7 @@ if (result.status !== 0) { console.warn( '[postinstall] API client generation failed (exit code: ' + result.status + - '). Run `yarn --cwd redisinsight/api generate:api-client` manually to retry.', + '). Run `npm run generate:api-client --prefix redisinsight/api` manually to retry.', ); } diff --git a/redisinsight/api/src/__mocks__/redis-info.ts b/redisinsight/api/src/__mocks__/redis-info.ts index 8a24d99ecb..a45da683df 100644 --- a/redisinsight/api/src/__mocks__/redis-info.ts +++ b/redisinsight/api/src/__mocks__/redis-info.ts @@ -104,16 +104,6 @@ export const mockRedisSentinelMasterResponse: Array = [ mockSentinelMasterInOkState, ]; -// eslint-disable-next-line max-len -export const mockRedisClusterNodesResponse: string = - '07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected\n' + - 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001 myself,master - 0 0 1 connected 0-16383'; - -// eslint-disable-next-line max-len -export const mockRedisClusterNodesResponseIPv6: string = - '07c37dfeb235213a872192d90877d0cd55635b91 2001:db8::1:7001@17001 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected\n' + - 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 2001:db8::2:7002@17002 myself,master - 0 0 1 connected 0-16383'; - export const mockStandaloneRedisInfoReply: string = `${ mockRedisServerInfoResponse }\r\n${mockRedisClientsInfoResponse}\r\n${mockRedisMemoryInfoResponse}\r\n${ diff --git a/redisinsight/api/src/common/utils/certificate-import.util.spec.ts b/redisinsight/api/src/common/utils/certificate-import.util.spec.ts new file mode 100644 index 0000000000..9d322f02ec --- /dev/null +++ b/redisinsight/api/src/common/utils/certificate-import.util.spec.ts @@ -0,0 +1,27 @@ +import { isImportFromFileAllowed } from 'src/common/utils'; +import config, { Config } from 'src/utils/config'; +import { BuildType } from 'src/modules/server/models/server'; + +const mockServerConfig = config.get('server') as Config['server']; +const originalBuildType = mockServerConfig.buildType; + +describe('isImportFromFileAllowed', () => { + afterEach(() => { + mockServerConfig.buildType = originalBuildType; + }); + + it('should allow reading from a path in the desktop build', () => { + mockServerConfig.buildType = BuildType.Electron; + + expect(isImportFromFileAllowed()).toEqual(true); + }); + + it.each([BuildType.DockerOnPremise, BuildType.RedisStack, BuildType.VSCode])( + 'should not allow reading from a path in the %s build', + (buildType) => { + mockServerConfig.buildType = buildType; + + expect(isImportFromFileAllowed()).toEqual(false); + }, + ); +}); diff --git a/redisinsight/api/src/common/utils/certificate-import.util.ts b/redisinsight/api/src/common/utils/certificate-import.util.ts index 26c7dd4c6d..eb300ee79c 100644 --- a/redisinsight/api/src/common/utils/certificate-import.util.ts +++ b/redisinsight/api/src/common/utils/certificate-import.util.ts @@ -1,5 +1,14 @@ import { parse } from 'path'; import { readFileSync } from 'fs'; +import config, { Config } from 'src/utils/config'; +import { BuildType } from 'src/modules/server/models/server'; + +const SERVER_CONFIG = config.get('server') as Config['server']; + +// Only the desktop app resolves a path; other builds take inline PEM only, +// so an import can't read files off the host. +export const isImportFromFileAllowed = (): boolean => + SERVER_CONFIG.buildType === BuildType.Electron; export const isValidPemCertificate = (cert: string): boolean => cert.startsWith('-----BEGIN CERTIFICATE-----'); diff --git a/redisinsight/api/src/constants/custom-error-codes.ts b/redisinsight/api/src/constants/custom-error-codes.ts index f0286cbe0e..497193d032 100644 --- a/redisinsight/api/src/constants/custom-error-codes.ts +++ b/redisinsight/api/src/constants/custom-error-codes.ts @@ -30,6 +30,9 @@ export enum CustomErrorCodes { CloudCapiKeyUnauthorized = 11_022, CloudCapiKeyNotFound = 11_023, AzureEntraIdTokenExpired = 11_024, + CloudApiMfaRequired = 11_025, + CloudApiMfaQuotaExceeded = 11_026, + CloudApiMfaInvalidCode = 11_027, // Cloud Job errors [11100, 11199] CloudJobUnexpectedError = 11_100, diff --git a/redisinsight/api/src/constants/error-messages.ts b/redisinsight/api/src/constants/error-messages.ts index 1769fe932a..d993c4dbe7 100644 --- a/redisinsight/api/src/constants/error-messages.ts +++ b/redisinsight/api/src/constants/error-messages.ts @@ -27,6 +27,8 @@ export default { UNDEFINED_INSTANCE_ID: 'Undefined redis database instance id.', NO_CONNECTION_TO_REDIS_DB: 'No connection to the Redis Database.', WRONG_DATABASE_TYPE: 'Wrong database type.', + HOST_PORT_NOT_EDITABLE_FOR_MANAGED_DATABASE: + 'Host and port cannot be changed for a database managed by a cloud provider.', CONNECTION_TIMEOUT: 'The connection has timed out, please check the connection details.', DB_CONNECTION_TIMEOUT: @@ -132,6 +134,11 @@ export default { 'Unable to get required data from the user profile.', CLOUD_OAUTH_UNKNOWN_AUTHORIZATION_REQUEST: 'Unknown authorization request.', CLOUD_OAUTH_UNEXPECTED_ERROR: 'Unexpected error.', + CLOUD_MFA_REQUIRED: + 'Multi-factor authentication is required to complete sign in.', + CLOUD_MFA_INVALID_CODE: 'Invalid or expired code. Please try again.', + CLOUD_MFA_QUOTA_EXCEEDED: + 'Too many authentication attempts. Wait a few minutes and sign in again.', CLOUD_JOB_UNEXPECTED_ERROR: 'Unexpected error occurred', CLOUD_JOB_ABORTED: 'Cloud job aborted', diff --git a/redisinsight/api/src/constants/redis-modules.ts b/redisinsight/api/src/constants/redis-modules.ts index adeffddac1..bbd94ac8f7 100644 --- a/redisinsight/api/src/constants/redis-modules.ts +++ b/redisinsight/api/src/constants/redis-modules.ts @@ -54,7 +54,10 @@ export const REDIS_MODULES_COMMANDS = new Map([ ], [AdditionalRedisModuleName.RedisJSON, ['json.get']], [AdditionalRedisModuleName.RediSearch, ['ft.info']], - [AdditionalRedisModuleName.RedisTimeSeries, ['ts.mrange', 'ts.info']], + [ + AdditionalRedisModuleName.RedisTimeSeries, + ['ts.mrange', 'ts.info', 'ts.range', 'ts.revrange'], + ], ]); export const REDISEARCH_MODULES: string[] = [ diff --git a/redisinsight/api/src/decorators/api-endpoint.decorator.ts b/redisinsight/api/src/decorators/api-endpoint.decorator.ts index 702aed87bd..2618dca590 100644 --- a/redisinsight/api/src/decorators/api-endpoint.decorator.ts +++ b/redisinsight/api/src/decorators/api-endpoint.decorator.ts @@ -1,6 +1,10 @@ import { applyDecorators, HttpCode } from '@nestjs/common'; -import { ApiExcludeEndpoint, ApiOperation, ApiResponse } from '@nestjs/swagger'; -import { ApiResponseOptions } from '@nestjs/swagger/dist/decorators/api-response.decorator'; +import { + ApiExcludeEndpoint, + ApiOperation, + ApiResponse, + ApiResponseOptions, +} from '@nestjs/swagger'; import config, { Config } from 'src/utils/config'; import { BuildType } from 'src/modules/server/models/server'; diff --git a/redisinsight/api/src/main.ts b/redisinsight/api/src/main.ts index f9dd2825d1..308025e45f 100644 --- a/redisinsight/api/src/main.ts +++ b/redisinsight/api/src/main.ts @@ -95,13 +95,14 @@ export default async function bootstrap(apiPort?: number): Promise { }, }, ); + + app.useWebSocketAdapter(new SessionMetadataAdapter(app)); } else { app.setGlobalPrefix(serverConfig.globalPrefix); + // Must be the only web socket adapter here or the window-id auth gate is lost. app.useWebSocketAdapter(new WindowsAuthAdapter(app)); } - app.useWebSocketAdapter(new SessionMetadataAdapter(app)); - const logFileProvider = app.get(LogFileProvider); const { port, host } = serverConfig; diff --git a/redisinsight/api/src/models/redis-cluster.ts b/redisinsight/api/src/models/redis-cluster.ts index 924a708b93..7582cf433d 100644 --- a/redisinsight/api/src/models/redis-cluster.ts +++ b/redisinsight/api/src/models/redis-cluster.ts @@ -15,15 +15,3 @@ export interface IRedisClusterNodeAddress { host: string; port: number; } - -export interface IRedisClusterNode extends IRedisClusterNodeAddress { - id: string; - replicaOf: string; - linkState: RedisClusterNodeLinkState; - slot: string; -} - -export enum RedisClusterNodeLinkState { - Connected = 'connected', - Disconnected = 'disconnected', -} diff --git a/redisinsight/api/src/modules/agent-memory/agent-memory-data.controller.ts b/redisinsight/api/src/modules/agent-memory/agent-memory-data.controller.ts index e6f4c76af9..68496ec250 100644 --- a/redisinsight/api/src/modules/agent-memory/agent-memory-data.controller.ts +++ b/redisinsight/api/src/modules/agent-memory/agent-memory-data.controller.ts @@ -17,6 +17,7 @@ import { AgentMemoryClientMetadata } from 'src/modules/agent-memory/models'; import { AgentMemoryDataService } from 'src/modules/agent-memory/agent-memory-data.service'; import { AgentMemoryConfiguration, + AgentMemoryTask, DiscoveryFiltersResponse, LongTermMemorySearchResponse, SummaryView, @@ -206,10 +207,22 @@ export class AgentMemoryDataController { async runSummaryView( @RequestAgentMemoryClientMetadata() metadata: AgentMemoryClientMetadata, @Param('viewId') viewId: string, - ): Promise { + ): Promise { return this.service.runSummaryView(metadata, viewId); } + @Get('/summary-views/tasks/:taskId') + @ApiEndpoint({ + description: 'Get the status of a summary-view recompute task', + responses: [{ status: 200 }], + }) + async getTask( + @RequestAgentMemoryClientMetadata() metadata: AgentMemoryClientMetadata, + @Param('taskId') taskId: string, + ): Promise { + return this.service.getTask(metadata, taskId); + } + @Get('/summary-views/:viewId/partitions') @ApiEndpoint({ description: 'List summary view partitions matching the given filters', diff --git a/redisinsight/api/src/modules/agent-memory/agent-memory-data.service.ts b/redisinsight/api/src/modules/agent-memory/agent-memory-data.service.ts index 8805e3fce1..04feae9027 100644 --- a/redisinsight/api/src/modules/agent-memory/agent-memory-data.service.ts +++ b/redisinsight/api/src/modules/agent-memory/agent-memory-data.service.ts @@ -4,6 +4,7 @@ import { AgentMemoryClientMetadata } from 'src/modules/agent-memory/models'; import { AgentMemoryClientProvider } from 'src/modules/agent-memory/providers/agent-memory.client.provider'; import { AgentMemoryConfiguration, + AgentMemoryTask, AgentMemoryNewMessage, AgentMemoryScopeFilter, DiscoveryFiltersResponse, @@ -114,11 +115,19 @@ export class AgentMemoryDataService { async runSummaryView( metadata: AgentMemoryClientMetadata, viewId: string, - ): Promise { + ): Promise { const client = await this.clientProvider.getOrCreate(metadata); return client.runSummaryView(viewId); } + async getTask( + metadata: AgentMemoryClientMetadata, + taskId: string, + ): Promise { + const client = await this.clientProvider.getOrCreate(metadata); + return client.getTask(taskId); + } + async listSummaryViewPartitions( metadata: AgentMemoryClientMetadata, viewId: string, diff --git a/redisinsight/api/src/modules/agent-memory/agent-memory.service.spec.ts b/redisinsight/api/src/modules/agent-memory/agent-memory.service.spec.ts new file mode 100644 index 0000000000..5aff85723b --- /dev/null +++ b/redisinsight/api/src/modules/agent-memory/agent-memory.service.spec.ts @@ -0,0 +1,104 @@ +import { faker } from '@faker-js/faker'; + +import { SessionMetadata } from 'src/common/models'; +import { AgentMemoryClient } from 'src/modules/agent-memory/client/agent-memory.client'; +import { AgentMemoryService } from 'src/modules/agent-memory/agent-memory.service'; +import { + AgentMemoryBackendType, + AgentMemoryClientMetadata, + AgentMemoryEndpoint, +} from 'src/modules/agent-memory/models'; +import { AgentMemoryClientFactory } from 'src/modules/agent-memory/providers/agent-memory.client.factory'; +import { AgentMemoryClientProvider } from 'src/modules/agent-memory/providers/agent-memory.client.provider'; +import { AgentMemoryEndpointRepository } from 'src/modules/agent-memory/repository/agent-memory-endpoint.repository'; + +const buildEndpoint = ( + overrides: Partial = {}, +): AgentMemoryEndpoint => ({ + id: faker.string.uuid(), + name: faker.lorem.words(2), + url: faker.internet.url(), + backendType: AgentMemoryBackendType.Oss, + ...overrides, +}); + +const buildMetadata = (id: string): AgentMemoryClientMetadata => ({ + id, + sessionMetadata: { + userId: faker.string.uuid(), + accountId: faker.string.uuid(), + sessionId: faker.string.uuid(), + } as SessionMetadata, +}); + +describe('AgentMemoryService', () => { + let repository: jest.Mocked; + let clientProvider: jest.Mocked; + let clientFactory: jest.Mocked; + let service: AgentMemoryService; + + beforeEach(() => { + repository = { + list: jest.fn(), + get: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + } as unknown as jest.Mocked; + clientProvider = { + deleteManyByEndpointId: jest.fn(), + } as unknown as jest.Mocked; + clientFactory = { + createClient: jest.fn(), + } as unknown as jest.Mocked; + service = new AgentMemoryService(repository, clientProvider, clientFactory); + }); + + it('should clear Cloud credentials when switching an endpoint to OSS', async () => { + const endpoint = buildEndpoint({ + backendType: AgentMemoryBackendType.Cloud, + storeId: faker.string.uuid(), + apiKey: faker.string.alphanumeric(32), + }); + const metadata = buildMetadata(endpoint.id); + repository.get.mockResolvedValue(endpoint); + repository.update.mockImplementation(async (_id, updatedEndpoint) => + buildEndpoint(updatedEndpoint), + ); + clientFactory.createClient.mockResolvedValue({} as AgentMemoryClient); + clientProvider.deleteManyByEndpointId.mockResolvedValue(1); + + await service.update(metadata, { + backendType: AgentMemoryBackendType.Oss, + }); + + expect(repository.update).toHaveBeenCalledWith( + endpoint.id, + expect.objectContaining({ + backendType: AgentMemoryBackendType.Oss, + storeId: null, + apiKey: null, + }), + ); + expect(endpoint.storeId).not.toBeNull(); + expect(endpoint.apiKey).not.toBeNull(); + }); + + it('should evict clients before deleting endpoint records', async () => { + const ids = [faker.string.uuid(), faker.string.uuid()]; + clientProvider.deleteManyByEndpointId.mockResolvedValue(1); + repository.delete.mockResolvedValue(); + + await service.delete( + buildMetadata(faker.string.uuid()).sessionMetadata, + ids, + ); + + const deleteRecordOrder = repository.delete.mock.invocationCallOrder[0]; + clientProvider.deleteManyByEndpointId.mock.invocationCallOrder.forEach( + (evictClientOrder) => { + expect(evictClientOrder).toBeLessThan(deleteRecordOrder); + }, + ); + }); +}); diff --git a/redisinsight/api/src/modules/agent-memory/agent-memory.service.ts b/redisinsight/api/src/modules/agent-memory/agent-memory.service.ts index 390899fa17..488bdccbbe 100644 --- a/redisinsight/api/src/modules/agent-memory/agent-memory.service.ts +++ b/redisinsight/api/src/modules/agent-memory/agent-memory.service.ts @@ -5,7 +5,7 @@ import { NotFoundException, } from '@nestjs/common'; import { v4 as uuidv4 } from 'uuid'; -import { isUndefined, omitBy } from 'lodash'; +import { cloneDeep, isUndefined, omitBy } from 'lodash'; import { CreateAgentMemoryEndpointDto, @@ -13,6 +13,7 @@ import { } from 'src/modules/agent-memory/dto'; import { AgentMemoryClientMetadata, + AgentMemoryBackendType, AgentMemoryEndpoint, } from 'src/modules/agent-memory/models'; import { AgentMemoryEndpointRepository } from 'src/modules/agent-memory/repository/agent-memory-endpoint.repository'; @@ -99,7 +100,18 @@ export class AgentMemoryService { dto: UpdateAgentMemoryEndpointDto, ): Promise { const oldEndpoint = await this.get(metadata.id); - const newEndpoint = await deepMerge(oldEndpoint, dto); + const newEndpoint = deepMerge( + cloneDeep(oldEndpoint), + dto, + ) as AgentMemoryEndpoint; + + if ( + oldEndpoint.backendType === AgentMemoryBackendType.Cloud && + newEndpoint.backendType === AgentMemoryBackendType.Oss + ) { + newEndpoint.storeId = null; + newEndpoint.apiKey = dto.apiKey ?? null; + } try { if (AgentMemoryService.isConnectionAffected(dto)) { @@ -120,12 +132,12 @@ export class AgentMemoryService { async delete(sessionMetadata: SessionMetadata, ids: string[]): Promise { try { - await this.repository.delete(ids); await Promise.all( ids.map(async (id) => { await this.clientProvider.deleteManyByEndpointId(id); }), ); + await this.repository.delete(ids); } catch (error) { this.logger.error( `Failed to delete endpoint(s): ${ids}`, diff --git a/redisinsight/api/src/modules/agent-memory/agent-memory.types.ts b/redisinsight/api/src/modules/agent-memory/agent-memory.types.ts index 7f4b0207e4..72e2797cc5 100644 --- a/redisinsight/api/src/modules/agent-memory/agent-memory.types.ts +++ b/redisinsight/api/src/modules/agent-memory/agent-memory.types.ts @@ -85,6 +85,12 @@ export interface SummaryViewPartitionFilters { userId?: string; } +export interface AgentMemoryTask { + id: string; + status: 'pending' | 'running' | 'completed' | 'failed'; + errorMessage?: string; +} + export interface AgentMemoryScopeFilter { userId?: string; namespace?: string; diff --git a/redisinsight/api/src/modules/agent-memory/client/agent-memory.client.ts b/redisinsight/api/src/modules/agent-memory/client/agent-memory.client.ts index 6de9cbc669..a290c50c6c 100644 --- a/redisinsight/api/src/modules/agent-memory/client/agent-memory.client.ts +++ b/redisinsight/api/src/modules/agent-memory/client/agent-memory.client.ts @@ -12,6 +12,7 @@ import { AgentMemoryCapabilities, AgentMemoryNewMessage, AgentMemoryConfiguration, + AgentMemoryTask, AgentMemoryScopeFilter, DiscoveryFiltersResponse, LongTermMemorySearchResponse, @@ -118,7 +119,8 @@ export abstract class AgentMemoryClient { abstract deleteSummaryView(viewId: string): Promise; /** Trigger an async recompute of ALL partitions of a view */ - abstract runSummaryView(viewId: string): Promise; + abstract runSummaryView(viewId: string): Promise; + abstract getTask(taskId: string): Promise; abstract listSummaryViewPartitions( viewId: string, diff --git a/redisinsight/api/src/modules/agent-memory/client/cloud.agent-memory.client.ts b/redisinsight/api/src/modules/agent-memory/client/cloud.agent-memory.client.ts index 77745a9318..c8d0eced4f 100644 --- a/redisinsight/api/src/modules/agent-memory/client/cloud.agent-memory.client.ts +++ b/redisinsight/api/src/modules/agent-memory/client/cloud.agent-memory.client.ts @@ -17,6 +17,7 @@ import { import { AgentMemoryCapabilities, AgentMemoryConfiguration, + AgentMemoryTask, AgentMemoryNewMessage, AgentMemoryScopeFilter, DiscoveryFiltersResponse, @@ -272,8 +273,13 @@ export class CloudAgentMemoryClient extends AgentMemoryClient { // Summary views are unsupported on Cloud - nothing to delete. } - async runSummaryView(_viewId: string): Promise { + async runSummaryView(_viewId: string): Promise { // Summary views are unsupported on Cloud - nothing to run. + return null; + } + + async getTask(_taskId: string): Promise { + return null; } async listSummaryViewPartitions( diff --git a/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.spec.ts b/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.spec.ts new file mode 100644 index 0000000000..bd180ad006 --- /dev/null +++ b/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.spec.ts @@ -0,0 +1,114 @@ +import { faker } from '@faker-js/faker'; +import { AxiosInstance } from 'axios'; + +import { SessionMetadata } from 'src/common/models'; +import { OssAgentMemoryClient } from 'src/modules/agent-memory/client/oss.agent-memory.client'; +import { AgentMemoryServerUrl } from 'src/modules/agent-memory/constants'; +import { + AgentMemoryBackendType, + AgentMemoryClientMetadata, + AgentMemoryEndpoint, +} from 'src/modules/agent-memory/models'; + +class TestOssAgentMemoryClient extends OssAgentMemoryClient { + getApi(): AxiosInstance { + return this.api; + } +} + +const buildClient = () => { + const metadata: AgentMemoryClientMetadata = { + id: faker.string.uuid(), + sessionMetadata: { + userId: faker.string.uuid(), + accountId: faker.string.uuid(), + sessionId: faker.string.uuid(), + } as SessionMetadata, + }; + const endpoint: AgentMemoryEndpoint = { + id: metadata.id, + name: faker.lorem.words(2), + url: faker.internet.url(), + backendType: AgentMemoryBackendType.Oss, + }; + + return new TestOssAgentMemoryClient(metadata, endpoint); +}; + +describe('OssAgentMemoryClient', () => { + describe('appendMessage', () => { + it('should preserve working-memory metadata when appending a message', async () => { + const client = buildClient(); + const api = client.getApi(); + const sessionId = faker.string.uuid(); + const ttlSeconds = faker.number.int({ min: 1, max: 10_000 }); + const current = { + session_id: sessionId, + user_id: faker.string.uuid(), + namespace: faker.lorem.word(), + messages: [{ role: 'user', content: faker.lorem.sentence() }], + tokens: faker.number.int({ min: 1, max: 10_000 }), + ttl_seconds: ttlSeconds, + last_accessed: faker.date.recent().toISOString(), + long_term_memory_strategy: { strategy: 'discrete' }, + }; + jest.spyOn(api, 'get').mockResolvedValue({ data: current }); + const put = jest.spyOn(api, 'put').mockResolvedValue({ data: {} }); + const message = { role: 'assistant', content: faker.lorem.sentence() }; + + await client.appendMessage(sessionId, {}, message); + + expect(put).toHaveBeenCalledWith( + `${AgentMemoryServerUrl.WorkingMemory}/${encodeURIComponent(sessionId)}`, + expect.objectContaining({ + tokens: current.tokens, + ttl_seconds: ttlSeconds, + last_accessed: current.last_accessed, + long_term_memory_strategy: current.long_term_memory_strategy, + messages: [...current.messages, message], + }), + ); + }); + }); + + describe('searchLongTermMemory', () => { + it('should forward optimize_query to the OSS search endpoint', async () => { + const client = buildClient(); + const api = client.getApi(); + const post = jest.spyOn(api, 'post').mockResolvedValue({ + data: { memories: [], total: 0 }, + }); + const text = faker.lorem.sentence(); + + await client.searchLongTermMemory({ text, optimizeQuery: true }); + + expect(post).toHaveBeenCalledWith( + AgentMemoryServerUrl.LongTermMemorySearch, + expect.objectContaining({ text }), + { params: { optimize_query: true } }, + ); + }); + }); + + describe('runSummaryView', () => { + it('should return the background task used to track recompute status', async () => { + const client = buildClient(); + const task = { + id: faker.string.uuid(), + type: 'summary_view_full_run', + status: 'running' as const, + }; + const sdk = client as unknown as { + sdk: { runSummaryView: jest.Mock }; + }; + jest.spyOn(sdk.sdk, 'runSummaryView').mockResolvedValue(task); + + await expect(client.runSummaryView(faker.string.uuid())).resolves.toEqual( + { + id: task.id, + status: task.status, + }, + ); + }); + }); +}); diff --git a/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.ts b/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.ts index bcf0af3818..b40c13939f 100644 --- a/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.ts +++ b/redisinsight/api/src/modules/agent-memory/client/oss.agent-memory.client.ts @@ -2,6 +2,7 @@ import { NotFoundException } from '@nestjs/common'; import { AxiosInstance } from 'axios'; import { MemoryAPIClient, + MemoryRecordResults, SearchOptions as SdkSearchOptions, } from 'agent-memory-client'; @@ -12,6 +13,7 @@ import { import { AgentMemoryCapabilities, AgentMemoryConfiguration, + AgentMemoryTask, AgentMemoryNewMessage, AgentMemoryScopeFilter, DiscoveryFiltersResponse, @@ -169,12 +171,10 @@ export class OssAgentMemoryClient extends AgentMemoryClient { await this.api.put( `${AgentMemoryServerUrl.WorkingMemory}/${encodeURIComponent(sessionId)}`, { + ...current, session_id: sessionId, user_id: current.user_id ?? filter.userId ?? null, namespace: current.namespace ?? filter.namespace ?? null, - context: current.context ?? null, - data: current.data ?? {}, - memories: current.memories ?? [], messages: [ ...(current.messages ?? []), { role: message.role, content: message.content }, @@ -214,8 +214,21 @@ export class OssAgentMemoryClient extends AgentMemoryClient { if (dto.topics?.length) options.topics = { any: dto.topics }; if (dto.entities?.length) options.entities = { any: dto.entities }; - const data = await this.sdkCall(() => - this.sdk.searchLongTermMemory(options), + const { data } = await this.api.post( + AgentMemoryServerUrl.LongTermMemorySearch, + { + text: options.text, + limit: options.limit, + user_id: options.userId, + namespace: options.namespace, + session_id: options.sessionId, + memory_type: options.memoryType, + topics: options.topics, + entities: options.entities, + }, + { + params: { optimize_query: dto.optimizeQuery ?? false }, + }, ); const memories = (data?.memories ?? []).map(fromOssMemory); @@ -308,8 +321,24 @@ export class OssAgentMemoryClient extends AgentMemoryClient { await this.sdkCall(() => this.sdk.deleteSummaryView(viewId)); } - async runSummaryView(viewId: string): Promise { - await this.sdkCall(() => this.sdk.runSummaryView(viewId)); + async runSummaryView(viewId: string): Promise { + const task = await this.sdkCall(() => this.sdk.runSummaryView(viewId)); + return { + id: task.id, + status: task.status, + errorMessage: task.error_message ?? undefined, + }; + } + + async getTask(taskId: string): Promise { + const task = await this.sdkCall(() => this.sdk.getTask(taskId)); + return task + ? { + id: task.id, + status: task.status, + errorMessage: task.error_message ?? undefined, + } + : null; } async listSummaryViewPartitions( diff --git a/redisinsight/api/src/modules/agent-memory/client/transformers.spec.ts b/redisinsight/api/src/modules/agent-memory/client/transformers.spec.ts index 5fb12a5b1e..fd11d092dd 100644 --- a/redisinsight/api/src/modules/agent-memory/client/transformers.spec.ts +++ b/redisinsight/api/src/modules/agent-memory/client/transformers.spec.ts @@ -1,3 +1,5 @@ +import { faker } from '@faker-js/faker'; + import { fromCloudEvent, fromCloudMemory, @@ -96,6 +98,14 @@ describe('agent memory transformers', () => { expect(result.entities).toEqual([]); expect(result.score).toBeUndefined(); }); + + it('should convert distance to a similarity score', () => { + const distance = faker.number.float({ min: 0, max: 1 }); + + const result = fromOssMemory({ dist: distance }); + + expect(result.score).toBeCloseTo(1 - distance); + }); }); describe('fromCloudEvent', () => { diff --git a/redisinsight/api/src/modules/agent-memory/client/transformers.ts b/redisinsight/api/src/modules/agent-memory/client/transformers.ts index 75ad1b1838..bd0c9672d9 100644 --- a/redisinsight/api/src/modules/agent-memory/client/transformers.ts +++ b/redisinsight/api/src/modules/agent-memory/client/transformers.ts @@ -72,7 +72,7 @@ export const fromOssMemory = ( typeof memory?.score === 'number' ? memory.score : typeof memory?.dist === 'number' - ? memory.dist + ? 1 - memory.dist : undefined, }); diff --git a/redisinsight/api/src/modules/agent-memory/entities/agent-memory-endpoint.entity.ts b/redisinsight/api/src/modules/agent-memory/entities/agent-memory-endpoint.entity.ts index 845b1689af..38246a44ec 100644 --- a/redisinsight/api/src/modules/agent-memory/entities/agent-memory-endpoint.entity.ts +++ b/redisinsight/api/src/modules/agent-memory/entities/agent-memory-endpoint.entity.ts @@ -21,11 +21,11 @@ export class AgentMemoryEndpointEntity { @Expose() @Column({ nullable: true }) - storeId: string; + storeId: string | null; @Expose({ groups: ['security'] }) @Column({ nullable: true }) - apiKey: string; + apiKey: string | null; @Expose() @Column({ type: 'datetime', nullable: true }) diff --git a/redisinsight/api/src/modules/agent-memory/models/agent-memory-endpoint.ts b/redisinsight/api/src/modules/agent-memory/models/agent-memory-endpoint.ts index 41fb5acf74..7fa15c4476 100644 --- a/redisinsight/api/src/modules/agent-memory/models/agent-memory-endpoint.ts +++ b/redisinsight/api/src/modules/agent-memory/models/agent-memory-endpoint.ts @@ -58,7 +58,7 @@ export class AgentMemoryEndpoint { @IsOptional() @Expose() @IsString() - storeId?: string; + storeId?: string | null; @ApiPropertyOptional({ description: 'API key (bearer token), if the server requires auth', @@ -67,7 +67,7 @@ export class AgentMemoryEndpoint { @IsOptional() @Expose({ groups: ['security'] }) @IsString() - apiKey?: string; + apiKey?: string | null; @ApiPropertyOptional({ description: 'Time of the last connection to the agent memory endpoint.', diff --git a/redisinsight/api/src/modules/ai/query/utils/context.util.spec.ts b/redisinsight/api/src/modules/ai/query/utils/context.util.spec.ts index 8a4fa46732..47b09d22be 100644 --- a/redisinsight/api/src/modules/ai/query/utils/context.util.spec.ts +++ b/redisinsight/api/src/modules/ai/query/utils/context.util.spec.ts @@ -83,6 +83,9 @@ describe('ContextUtility', () => { 'CASESENSITIVE', 'UNF', 'NOSTEM', + 'WITHSUFFIXTRIE', + 'INDEXEMPTY', + 'INDEXMISSING', ], result: { key: 'value', @@ -91,6 +94,44 @@ describe('ContextUtility', () => { CASESENSITIVE: true, UNF: true, NOSTEM: true, + WITHSUFFIXTRIE: true, + INDEXEMPTY: true, + INDEXMISSING: true, + }, + }, + { + input: [ + 'identifier', + '$.chunkText', + 'attribute', + 'WITHSUFFIXTRIE', + 'type', + 'TEXT', + 'WEIGHT', + '1', + ], + result: { + identifier: '$.chunkText', + attribute: 'WITHSUFFIXTRIE', + type: 'TEXT', + WEIGHT: '1', + }, + }, + { + input: [ + 'identifier', + '$.chunkText', + 'attribute', + 'WITHSUFFIXTRIE', + 'type', + 'TEXT', + 'WITHSUFFIXTRIE', + ], + result: { + identifier: '$.chunkText', + attribute: 'WITHSUFFIXTRIE', + type: 'TEXT', + WITHSUFFIXTRIE: true, }, }, { input: [], result: {} }, diff --git a/redisinsight/api/src/modules/ai/query/utils/context.util.ts b/redisinsight/api/src/modules/ai/query/utils/context.util.ts index 875a9c7aa0..bee27949b5 100644 --- a/redisinsight/api/src/modules/ai/query/utils/context.util.ts +++ b/redisinsight/api/src/modules/ai/query/utils/context.util.ts @@ -1,9 +1,13 @@ -import { chunk, isArray, keyBy } from 'lodash'; +import { keyBy } from 'lodash'; import { quicktype, InputData, jsonInputForTargetLanguage, } from 'quicktype-core'; +import { + convertArrayReplyToObject, + convertIndexInfoAttributeReply, +} from 'src/modules/browser/utils/redisIndexInfo'; type ArrayReplyEntry = string | string[]; // todo: find a way to avoid this @@ -15,34 +19,8 @@ const HSCAN_COUNT = 500; export const quotesIfNeeded = (str: string) => str?.indexOf?.(' ') > -1 ? JSON.stringify(str) : str; -// ==================================================================== -// Reply converter -// ==================================================================== -export const convertArrayReplyToObject = ( - input: ArrayReplyEntry[], -): { [key: string]: any } => { - const obj = {}; - - chunk(input, 2).forEach(([key, value]) => { - obj[key as string] = value; - }); - - return obj; -}; - -export const convertIndexInfoAttributeReply = (input: string[]): object => { - const attribute = convertArrayReplyToObject(input); - - if (isArray(input)) { - attribute['SORTABLE'] = input.includes('SORTABLE') || undefined; - attribute['NOINDEX'] = input.includes('NOINDEX') || undefined; - attribute['CASESENSITIVE'] = input.includes('CASESENSITIVE') || undefined; - attribute['UNF'] = input.includes('UNF') || undefined; - attribute['NOSTEM'] = input.includes('NOSTEM') || undefined; - } - - return attribute; -}; +// Re-export shared FT.INFO converters so AI context stays in sync with Browser. +export { convertArrayReplyToObject, convertIndexInfoAttributeReply }; export const convertIndexInfoReply = (input: ArrayReplyEntry[]): object => { const infoReply = convertArrayReplyToObject(input); diff --git a/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.spec.ts b/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.spec.ts new file mode 100644 index 0000000000..38b8937387 --- /dev/null +++ b/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.spec.ts @@ -0,0 +1,95 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import { Socket } from 'socket.io'; +import { IoAdapter } from '@nestjs/platform-socket.io'; +import { WindowsAuthAdapter } from 'src/modules/auth/window-auth/adapters/window-auth.adapter'; +import { WindowAuthService } from 'src/modules/auth/window-auth/window-auth.service'; +import { mockDefaultSessionMetadata } from 'src/__mocks__'; + +const AUTHORIZED_WINDOW_ID = 'window-1'; + +const createBaseBindMessageHandlersMock = () => { + const mockBaseBindMessageHandlers = jest.fn(); + + jest + .spyOn(IoAdapter.prototype, 'bindMessageHandlers') + .mockImplementation(() => { + mockBaseBindMessageHandlers(); + }); + + return mockBaseBindMessageHandlers; +}; + +const createMockSocket = (windowId?: string) => + ({ + request: {}, + disconnect: jest.fn(), + data: {}, + join: jest.fn(), + handshake: { headers: windowId ? { 'x-window-id': windowId } : {} }, + }) as unknown as Socket; + +describe('WindowsAuthAdapter', () => { + let app: INestApplication; + let adapter: WindowsAuthAdapter; + let windowAuthService: WindowAuthService; + let mockBaseBindMessageHandlers: ReturnType< + typeof createBaseBindMessageHandlersMock + >; + + const mockWindowAuthService = { + isAuthorized: jest.fn(), + }; + + beforeEach(() => { + jest.resetAllMocks(); + mockBaseBindMessageHandlers = createBaseBindMessageHandlersMock(); + }); + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + providers: [ + { provide: WindowAuthService, useValue: mockWindowAuthService }, + ], + }).compile(); + + app = moduleFixture.createNestApplication(); + adapter = new WindowsAuthAdapter(app); + app.useWebSocketAdapter(adapter); + await app.init(); + windowAuthService = app.get(WindowAuthService); + }); + + afterAll(async () => { + await app.close(); + }); + + it('should attach session metadata, join the user room and bind handlers when the window id is authorized', async () => { + (windowAuthService.isAuthorized as jest.Mock).mockResolvedValue(true); + const socket = createMockSocket(AUTHORIZED_WINDOW_ID); + + await adapter.bindMessageHandlers(socket, [], jest.fn()); + + expect(windowAuthService.isAuthorized).toHaveBeenCalledWith( + AUTHORIZED_WINDOW_ID, + ); + expect(mockBaseBindMessageHandlers).toHaveBeenCalledTimes(1); + expect(socket.data).toEqual({ + sessionMetadata: mockDefaultSessionMetadata, + }); + expect(socket.join).toHaveBeenCalledTimes(1); + expect(socket.join).toHaveBeenCalledWith('user:1'); + }); + + it('should disconnect the socket and bind nothing when the window id is not authorized', async () => { + (windowAuthService.isAuthorized as jest.Mock).mockResolvedValue(false); + const socket = createMockSocket(); + + await adapter.bindMessageHandlers(socket, [], jest.fn()); + + expect(socket.disconnect).toHaveBeenCalledWith(true); + expect(mockBaseBindMessageHandlers).not.toHaveBeenCalled(); + expect(socket.data).toEqual({}); + expect(socket.join).not.toHaveBeenCalled(); + }); +}); diff --git a/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.ts b/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.ts index 9aa45cd15c..2e1c40c10c 100644 --- a/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.ts +++ b/redisinsight/api/src/modules/auth/window-auth/adapters/window-auth.adapter.ts @@ -1,21 +1,21 @@ import { INestApplication, Logger } from '@nestjs/common'; -import { IoAdapter } from '@nestjs/platform-socket.io'; import { MessageMappingProperties } from '@nestjs/websockets'; import { get } from 'lodash'; import { Observable } from 'rxjs'; import { Socket } from 'socket.io'; import { API_HEADER_WINDOW_ID } from 'src/common/constants'; import ERROR_MESSAGES from 'src/constants/error-messages'; +import { SessionMetadataAdapter } from 'src/modules/auth/session-metadata/adapters/session-metadata.adapter'; import { WindowAuthService } from '../window-auth.service'; -export class WindowsAuthAdapter extends IoAdapter { +export class WindowsAuthAdapter extends SessionMetadataAdapter { private windowAuthService: WindowAuthService; private logger = new Logger('WindowsAuthAdapter'); - constructor(private app: INestApplication) { + constructor(app: INestApplication) { super(app); - this.windowAuthService = this.app.get(WindowAuthService); + this.windowAuthService = app.get(WindowAuthService); } async bindMessageHandlers( @@ -30,6 +30,8 @@ export class WindowsAuthAdapter extends IoAdapter { if (!isAuthorized) { this.logger.error(ERROR_MESSAGES.UNDEFINED_WINDOW_ID); + // Drop the connection so it can no longer receive namespace broadcasts. + socket.disconnect(true); return; } diff --git a/redisinsight/api/src/modules/azure/auth/azure-auth.controller.ts b/redisinsight/api/src/modules/azure/auth/azure-auth.controller.ts index f0dc45f093..bfe8aab46c 100644 --- a/redisinsight/api/src/modules/azure/auth/azure-auth.controller.ts +++ b/redisinsight/api/src/modules/azure/auth/azure-auth.controller.ts @@ -58,6 +58,13 @@ export class AzureAuthController { description: 'Redirect type: "deeplink" for Electron app, "web" for browser/Docker deployments', }) + @ApiQuery({ + name: 'tenantId', + required: false, + description: + 'Azure tenant (GUID or domain) to authenticate against. Omit to use the ' + + 'multi-tenant "common" endpoint (the user\'s home tenant).', + }) @ApiResponse({ status: 200, description: 'Authorization URL generated successfully', @@ -69,6 +76,7 @@ export class AzureAuthController { const { url } = await this.azureAuthService.getAuthorizationUrl( dto.prompt, dto.redirectType, + dto.tenantId, ); return { url }; } @@ -175,6 +183,7 @@ export class AzureAuthController { id: result.account.homeAccountId, username: result.account.username, name: result.account.name, + tenantId: result.account.tenantId, } : undefined, error: result.error, diff --git a/redisinsight/api/src/modules/azure/auth/azure-auth.service.spec.ts b/redisinsight/api/src/modules/azure/auth/azure-auth.service.spec.ts index c1535ca70a..2883b185af 100644 --- a/redisinsight/api/src/modules/azure/auth/azure-auth.service.spec.ts +++ b/redisinsight/api/src/modules/azure/auth/azure-auth.service.spec.ts @@ -130,6 +130,28 @@ describe('AzureAuthService', () => { }), ); }); + + it('should pass per-tenant authority to MSAL when tenantId provided', async () => { + const tenantId = faker.string.uuid(); + + await service.getAuthorizationUrl(undefined, undefined, tenantId); + + expect(mockPca.getAuthCodeUrl).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${tenantId}`, + }), + ); + }); + + it('should not include authority parameter when tenantId not provided', async () => { + await service.getAuthorizationUrl(); + + expect(mockPca.getAuthCodeUrl).toHaveBeenCalledWith( + expect.not.objectContaining({ + authority: expect.anything(), + }), + ); + }); }); describe('handleCallback', () => { @@ -177,6 +199,43 @@ describe('AzureAuthService', () => { expect(result.account).toEqual(mockAccount); expect(result.error).toBeUndefined(); }); + + it('should exchange the code against the tenant authority used at sign-in', async () => { + const tenantId = faker.string.uuid(); + mockPca.acquireTokenByCode.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + account: createMockAccount(), + } as any); + + const { state } = await service.getAuthorizationUrl( + undefined, + undefined, + tenantId, + ); + await service.handleCallback('auth-code', state); + + expect(mockPca.acquireTokenByCode).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${tenantId}`, + }), + ); + }); + + it('should not pass authority to code exchange when no tenant was chosen', async () => { + mockPca.acquireTokenByCode.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + account: createMockAccount(), + } as any); + + const { state } = await service.getAuthorizationUrl(); + await service.handleCallback('auth-code', state); + + expect(mockPca.acquireTokenByCode).toHaveBeenCalledWith( + expect.not.objectContaining({ + authority: expect.anything(), + }), + ); + }); }); describe('removeAuthRequest', () => { @@ -330,7 +389,8 @@ describe('AzureAuthService', () => { }); it('should emit token acquired event on successful acquisition', async () => { - const mockAccount = createMockAccount(); + const tenantId = faker.string.uuid(); + const mockAccount = { ...createMockAccount(), tenantId }; const mockExpiresOn = new Date(); const mockAccessToken = faker.string.alphanumeric(100); mockTokenCache.getAllAccounts.mockResolvedValue([mockAccount]); @@ -340,12 +400,16 @@ describe('AzureAuthService', () => { account: mockAccount, } as any); - await service.getRedisTokenByAccountId(mockAccount.homeAccountId); + await service.getRedisTokenByAccountId( + mockAccount.homeAccountId, + tenantId, + ); expect(mockEventEmitter.emit).toHaveBeenCalledWith( AzureRedisTokenEvents.Acquired, { accountId: mockAccount.homeAccountId, + tenantId, tokenResult: { token: mockAccessToken, expiresOn: mockExpiresOn, @@ -362,6 +426,277 @@ describe('AzureAuthService', () => { expect(mockEventEmitter.emit).not.toHaveBeenCalled(); }); + + it('should acquire silently against the tenant authority when tenantId provided', async () => { + const tenantId = faker.string.uuid(); + const mockAccount = { ...createMockAccount(), tenantId }; + mockTokenCache.getAllAccounts.mockResolvedValue([mockAccount]); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: mockAccount, + } as any); + + await service.getRedisTokenByAccountId( + mockAccount.homeAccountId, + tenantId, + ); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${tenantId}`, + }), + ); + }); + + it('should select the account matching the requested tenant when multiple realms are cached', async () => { + const homeAccountId = faker.string.uuid(); + const tenantId = faker.string.uuid(); + // Same user signed into two tenants → two records share homeAccountId + const homeRealmAccount = { + ...createMockAccount(), + homeAccountId, + tenantId: faker.string.uuid(), + }; + const targetRealmAccount = { + ...createMockAccount(), + homeAccountId, + tenantId, + }; + mockTokenCache.getAllAccounts.mockResolvedValue([ + homeRealmAccount, + targetRealmAccount, + ]); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: targetRealmAccount, + } as any); + + await service.getRedisTokenByAccountId(homeAccountId, tenantId); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ + account: targetRealmAccount, + authority: `https://login.microsoftonline.com/${tenantId}`, + }), + ); + }); + + it('should not pass authority to silent acquisition when no tenantId', async () => { + const mockAccount = createMockAccount(); + mockTokenCache.getAllAccounts.mockResolvedValue([mockAccount]); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: mockAccount, + } as any); + + await service.getRedisTokenByAccountId(mockAccount.homeAccountId); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.not.objectContaining({ + authority: expect.anything(), + }), + ); + }); + + it('should not force a refresh when the requested realm is cached', async () => { + const tenantId = faker.string.uuid(); + const mockAccount = { ...createMockAccount(), tenantId }; + mockTokenCache.getAllAccounts.mockResolvedValue([mockAccount]); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: mockAccount, + } as any); + + await service.getRedisTokenByAccountId( + mockAccount.homeAccountId, + tenantId, + ); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.not.objectContaining({ + forceRefresh: true, + }), + ); + }); + }); + + describe('getRedisTokenByAccountId cross-tenant safety', () => { + const homeTenantId = faker.string.uuid(); + const otherTenantId = faker.string.uuid(); + const homeAccountId = faker.string.uuid(); + let homeRealmAccount: ReturnType; + + beforeEach(() => { + // Signed into the home tenant only: connecting to a database there leaves + // a live token for that realm in the cache. + homeRealmAccount = { + ...createMockAccount(), + homeAccountId, + tenantId: homeTenantId, + }; + mockTokenCache.getAllAccounts.mockResolvedValue([homeRealmAccount]); + }); + + it('should force a refresh when the requested tenant has no cached realm', async () => { + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: { ...homeRealmAccount, tenantId: otherTenantId }, + } as any); + + await service.getRedisTokenByAccountId(homeAccountId, otherTenantId); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${otherTenantId}`, + forceRefresh: true, + }), + ); + }); + + it('should reject a token issued for a realm other than the requested tenant', async () => { + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + const result = await service.getRedisTokenByAccountId( + homeAccountId, + otherTenantId, + ); + + expect(result).toBeNull(); + }); + + it('should not emit the token acquired event for a wrong-realm token', async () => { + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + await service.getRedisTokenByAccountId(homeAccountId, otherTenantId); + + expect(mockEventEmitter.emit).not.toHaveBeenCalled(); + }); + + it('should return the token when the realm matches the requested tenant', async () => { + const otherRealmAccount = { + ...homeRealmAccount, + tenantId: otherTenantId, + localAccountId: faker.string.uuid(), + }; + const mockAccessToken = faker.string.alphanumeric(100); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: mockAccessToken, + expiresOn: new Date(), + account: otherRealmAccount, + } as any); + + const result = await service.getRedisTokenByAccountId( + homeAccountId, + otherTenantId, + ); + + expect(result?.token).toEqual(mockAccessToken); + expect(result?.account).toEqual(otherRealmAccount); + }); + + it('should not reject a home-realm token when no tenant is requested', async () => { + const mockAccessToken = faker.string.alphanumeric(100); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: mockAccessToken, + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + const result = await service.getRedisTokenByAccountId(homeAccountId); + + expect(result?.token).toEqual(mockAccessToken); + }); + + it('should leave acquisition untouched when no tenant is requested', async () => { + // A database with no recorded tenantId has no realm to target, so neither + // the authority nor the forced refresh applies. + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + await service.getRedisTokenByAccountId(homeAccountId); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.not.objectContaining({ + authority: expect.anything(), + forceRefresh: expect.anything(), + }), + ); + }); + + it('should accept a token when the tenant is requested as a domain', async () => { + // The import and login DTOs accept a tenant domain, which MSAL reports as + // the canonical realm GUID. + const tenantDomain = 'contoso.onmicrosoft.com'; + const mockAccessToken = faker.string.alphanumeric(100); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: mockAccessToken, + expiresOn: new Date(), + account: { ...homeRealmAccount, tenantId: otherTenantId }, + } as any); + + const result = await service.getRedisTokenByAccountId( + homeAccountId, + tenantDomain, + ); + + expect(result?.token).toEqual(mockAccessToken); + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${tenantDomain}`, + forceRefresh: true, + }), + ); + }); + + it('should match the requested realm regardless of GUID casing', async () => { + const mockAccessToken = faker.string.alphanumeric(100); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: mockAccessToken, + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + const result = await service.getRedisTokenByAccountId( + homeAccountId, + homeTenantId.toUpperCase(), + ); + + expect(result?.token).toEqual(mockAccessToken); + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ account: homeRealmAccount }), + ); + }); + + it('should reject a wrong-realm management token as well', async () => { + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: homeRealmAccount, + } as any); + + const result = await service.getManagementTokenByAccountId( + homeAccountId, + otherTenantId, + ); + + expect(result).toBeNull(); + }); }); describe('getManagementTokenByAccountId', () => { @@ -406,5 +741,27 @@ describe('AzureAuthService', () => { account: mockAccount, }); }); + + it('should acquire silently against the tenant authority when tenantId provided', async () => { + const tenantId = faker.string.uuid(); + const mockAccount = { ...createMockAccount(), tenantId }; + mockTokenCache.getAllAccounts.mockResolvedValue([mockAccount]); + mockPca.acquireTokenSilent.mockResolvedValue({ + accessToken: faker.string.alphanumeric(100), + expiresOn: new Date(), + account: mockAccount, + } as any); + + await service.getManagementTokenByAccountId( + mockAccount.homeAccountId, + tenantId, + ); + + expect(mockPca.acquireTokenSilent).toHaveBeenCalledWith( + expect.objectContaining({ + authority: `https://login.microsoftonline.com/${tenantId}`, + }), + ); + }); }); }); diff --git a/redisinsight/api/src/modules/azure/auth/azure-auth.service.ts b/redisinsight/api/src/modules/azure/auth/azure-auth.service.ts index 6911844af6..c85e3d4057 100644 --- a/redisinsight/api/src/modules/azure/auth/azure-auth.service.ts +++ b/redisinsight/api/src/modules/azure/auth/azure-auth.service.ts @@ -8,12 +8,14 @@ import { import { EventEmitter2 } from '@nestjs/event-emitter'; import { AZURE_AUTHORITY, + buildAzureAuthority, AZURE_CLIENT_ID, AZURE_REDIS_SCOPE, AZURE_MANAGEMENT_SCOPE, AZURE_OAUTH_DEEPLINK_REDIRECT_PATH, AZURE_OAUTH_SCOPES, AZURE_OAUTH_WEB_CALLBACK_ENDPOINT, + AZURE_TENANT_GUID_REGEX, AzureAuthStatus, AzureOAuthRedirectType, AzureRedisTokenEvents, @@ -49,6 +51,12 @@ const generateCodeChallenge = (verifier: string): string => */ const generateUuid = (): string => crypto.randomUUID(); +/** + * Compare tenant ids, which AAD reports in either casing. + */ +const isSameTenant = (a?: string, b?: string): boolean => + !!a && !!b && a.toLowerCase() === b.toLowerCase(); + /** * Service for handling Azure Entra ID authentication. * Uses MSAL (Microsoft Authentication Library) for OAuth 2.0 flows. @@ -61,6 +69,11 @@ interface AuthRequestData { redirectUri: string; redirectType: AzureOAuthRedirectType; createdAt: number; + /** + * Per-tenant authority chosen at sign-in, if any. Reused during the code + * exchange so the token is issued against the same tenant. + */ + authority?: string; } /** @@ -152,11 +165,14 @@ export class AzureAuthService { * Returns URL to redirect user to Microsoft login. * @param prompt - Optional prompt parameter to control login behavior. * @param redirectType - Type of redirect (deeplink for Electron, web for browser/Docker) + * @param tenantId - Optional tenant id/domain to authenticate against. When set, + * the token is issued by that tenant instead of the user's home tenant. * @see https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow#request-an-authorization-code */ async getAuthorizationUrl( prompt?: AzureOAuthPrompt, redirectType: AzureOAuthRedirectType = AzureOAuthRedirectType.Deeplink, + tenantId?: string, ): Promise<{ url: string; state: string }> { const pca = this.getMsalClient(); @@ -164,6 +180,7 @@ export class AzureAuthService { const challenge = generateCodeChallenge(verifier); const state = generateUuid(); const redirectUri = this.getRedirectUri(redirectType); + const authority = tenantId ? buildAzureAuthority(tenantId) : undefined; // Clean up any expired auth requests (abandoned flows) before adding new one this.cleanupExpiredAuthRequests(); @@ -174,6 +191,7 @@ export class AzureAuthService { redirectUri, redirectType, createdAt: Date.now(), + authority, }); const authUrl = await pca.getAuthCodeUrl({ @@ -183,6 +201,7 @@ export class AzureAuthService { codeChallengeMethod: 'S256', state, ...(prompt && { prompt }), + ...(authority && { authority }), }); this.logger.debug( @@ -217,7 +236,7 @@ export class AzureAuthService { }; } - const { verifier, redirectUri, redirectType } = authRequest; + const { verifier, redirectUri, redirectType, authority } = authRequest; // Clean up the auth request this.authRequests.delete(state); @@ -228,6 +247,7 @@ export class AzureAuthService { scopes: AZURE_OAUTH_SCOPES, redirectUri, codeVerifier: verifier, + ...(authority && { authority }), }); this.logger.log( @@ -302,15 +322,18 @@ export class AzureAuthService { */ async getRedisTokenByAccountId( accountId: string, + tenantId?: string, ): Promise { const tokenResult = await this.getTokenByAccountId( accountId, AZURE_REDIS_SCOPE, + tenantId, ); if (tokenResult) { this.eventEmitter.emit(AzureRedisTokenEvents.Acquired, { accountId, + tenantId, tokenResult, }); } @@ -335,8 +358,13 @@ export class AzureAuthService { */ async getManagementTokenByAccountId( accountId: string, + tenantId?: string, ): Promise { - return this.getTokenByAccountId(accountId, AZURE_MANAGEMENT_SCOPE); + return this.getTokenByAccountId( + accountId, + AZURE_MANAGEMENT_SCOPE, + tenantId, + ); } /** @@ -346,27 +374,69 @@ export class AzureAuthService { private async getTokenByAccountId( accountId: string, scope: string, + tenantId?: string, ): Promise { try { const pca = this.getMsalClient(); const cache = pca.getTokenCache(); const accounts = await cache.getAllAccounts(); - const account = accounts.find((a) => a.homeAccountId === accountId); + // A user signed into multiple tenants has one cached record per realm, + // all sharing the same homeAccountId. When a tenant is requested, prefer + // the record for that realm so silent refresh targets the right tenant + // (falling back to any record for the account otherwise). + const forAccount = (a: AccountInfo) => a.homeAccountId === accountId; + const realmAccount = + tenantId && + accounts.find( + (a) => forAccount(a) && isSameTenant(a.tenantId, tenantId), + ); + const account = realmAccount || accounts.find(forAccount); if (!account) { this.logger.warn(`Account not found: ${accountId}`); return null; } + // When a tenant was chosen at sign-in, refresh against that same tenant + // authority. Without it, MSAL resolves to the account's home tenant. + const authority = tenantId ? buildAzureAuthority(tenantId) : undefined; + + // MSAL resolves a cached access token by the realm of the account it is + // given and consults the request authority only on a cache miss, so a + // record from another realm yields that realm's token. Skipping the cache + // leaves the authority to decide which tenant issues the token. + const forceRefresh = Boolean(tenantId) && !realmAccount; + const result = await pca.acquireTokenSilent({ account, scopes: [scope], + ...(authority && { authority }), + ...(forceRefresh && { forceRefresh }), }); if (!result?.accessToken || !result?.expiresOn || !result?.account) { return null; } + // A tenant given as a domain has no realm to compare against; there the + // request authority alone pins the issuing tenant. + const requestedRealm = + tenantId && AZURE_TENANT_GUID_REGEX.test(tenantId) ? tenantId : null; + + // The target resource rejects a token from another realm, so report it as + // no token: callers then offer interactive re-authentication against the + // right tenant instead of an opaque auth error. + if ( + requestedRealm && + !isSameTenant(result.account.tenantId, requestedRealm) + ) { + this.logger.warn( + `Discarding token issued for tenant ${result.account.tenantId} ` + + `while tenant ${tenantId} was requested`, + ); + return null; + } + return { token: result.accessToken, expiresOn: result.expiresOn, diff --git a/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.spec.ts b/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.spec.ts new file mode 100644 index 0000000000..4d7553ddc4 --- /dev/null +++ b/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.spec.ts @@ -0,0 +1,35 @@ +import { validate } from 'class-validator'; +import { faker } from '@faker-js/faker'; +import { AzureAuthLoginDto } from './azure-auth-login.dto'; + +const validateTenantId = async (tenantId: string | undefined) => { + const dto = new AzureAuthLoginDto(); + dto.tenantId = tenantId; + return validate(dto); +}; + +describe('AzureAuthLoginDto', () => { + describe('tenantId', () => { + it('should be optional (no error when omitted)', async () => { + expect(await validateTenantId(undefined)).toHaveLength(0); + }); + + it('should accept a GUID tenant id', async () => { + expect(await validateTenantId(faker.string.uuid())).toHaveLength(0); + }); + + it('should accept an onmicrosoft.com domain', async () => { + expect( + await validateTenantId('your-tenant.onmicrosoft.com'), + ).toHaveLength(0); + }); + + it.each(['not a tenant', 'foo bar', 'http://your-tenant.com', ' ', 'a'])( + 'should reject invalid tenant id %p', + async (input) => { + const errors = await validateTenantId(input); + expect(errors.length).toBeGreaterThan(0); + }, + ); + }); +}); diff --git a/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.ts b/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.ts index 7deb4c7e37..9630efea6d 100644 --- a/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.ts +++ b/redisinsight/api/src/modules/azure/auth/dto/azure-auth-login.dto.ts @@ -1,6 +1,6 @@ import { ApiPropertyOptional } from '@nestjs/swagger'; -import { IsEnum, IsOptional } from 'class-validator'; -import { AzureOAuthRedirectType } from '../../constants'; +import { IsEnum, IsOptional, Matches } from 'class-validator'; +import { AzureOAuthRedirectType, AZURE_TENANT_ID_REGEX } from '../../constants'; /** * Valid OAuth prompt parameter values for Azure Entra ID. @@ -52,4 +52,18 @@ export class AzureAuthLoginDto { message: `redirectType must be a valid value. Valid values: ${Object.values(AzureOAuthRedirectType).join(', ')}.`, }) redirectType?: AzureOAuthRedirectType; + + @ApiPropertyOptional({ + description: + 'Azure tenant to authenticate against, as a GUID or domain ' + + '(e.g. your-tenant.onmicrosoft.com). Use when the Azure resources live in a ' + + 'different tenant than the signed-in user. Defaults to the multi-tenant ' + + '"common" endpoint (the user\'s home tenant) when omitted.', + example: 'your-tenant.onmicrosoft.com', + }) + @IsOptional() + @Matches(AZURE_TENANT_ID_REGEX, { + message: 'tenantId must be a valid GUID or domain.', + }) + tenantId?: string; } diff --git a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.controller.ts b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.controller.ts index cdcd49f6b8..395c187a29 100644 --- a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.controller.ts +++ b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.controller.ts @@ -67,6 +67,12 @@ export class AzureAutodiscoveryController { name: 'accountId', description: 'Azure account ID (homeAccountId)', }) + @ApiQuery({ + name: 'tenantId', + required: false, + description: + 'Azure tenant (GUID or domain) to query. Omit to use the home tenant.', + }) @ApiResponse({ status: 200, description: 'Returns list of subscriptions', @@ -77,11 +83,14 @@ export class AzureAutodiscoveryController { async listSubscriptions( @RequestSessionMetadata() sessionMetadata: SessionMetadata, @Query('accountId') accountId: string, + @Query('tenantId') tenantId?: string, ): Promise { try { await this.ensureAuthenticated(accountId); - const subscriptions = - await this.autodiscoveryService.listSubscriptions(accountId); + const subscriptions = await this.autodiscoveryService.listSubscriptions( + accountId, + tenantId, + ); this.analytics.sendAzureSubscriptionsDiscoverySucceeded( sessionMetadata, subscriptions, @@ -102,6 +111,12 @@ export class AzureAutodiscoveryController { name: 'accountId', description: 'Azure account ID (homeAccountId)', }) + @ApiQuery({ + name: 'tenantId', + required: false, + description: + 'Azure tenant (GUID or domain) to query. Omit to use the home tenant.', + }) @ApiResponse({ status: 200, description: 'Returns list of databases in subscription', @@ -114,6 +129,7 @@ export class AzureAutodiscoveryController { @RequestSessionMetadata() sessionMetadata: SessionMetadata, @Query('accountId') accountId: string, @Param('subscriptionId') subscriptionId: string, + @Query('tenantId') tenantId?: string, ): Promise { try { this.validateSubscriptionId(subscriptionId); @@ -122,6 +138,7 @@ export class AzureAutodiscoveryController { await this.autodiscoveryService.listDatabasesInSubscription( accountId, subscriptionId, + tenantId, ); this.analytics.sendAzureDatabasesDiscoverySucceeded( sessionMetadata, @@ -157,6 +174,7 @@ export class AzureAutodiscoveryController { sessionMetadata, dto.accountId, dto.databases, + dto.tenantId, ); const hasSuccessResult = result.some( diff --git a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.spec.ts b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.spec.ts index 67d0888b00..57f7e5aca5 100644 --- a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.spec.ts +++ b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.spec.ts @@ -507,6 +507,43 @@ describe('AzureAutodiscoveryService', () => { ); }); + it('should persist the token realm GUID as tenantId even when a domain is entered', async () => { + const database = createMockDatabase(AzureRedisType.Standard); + const mockAccount = createMockAccount(); + const apiResponse = createStandardRedisApiResponse(database); + + mockAuthService.getManagementTokenByAccountId.mockResolvedValue({ + token: 'mock-token', + expiresOn: new Date(), + account: mockAccount, + }); + mockAxiosInstance.get + .mockResolvedValueOnce({ data: { value: [apiResponse] } }) + .mockResolvedValueOnce({ data: { value: [] } }); + mockAuthService.getRedisTokenByAccountId.mockResolvedValue({ + token: 'redis-token', + expiresOn: new Date(), + account: mockAccount, + }); + mockDatabaseService.create.mockResolvedValue({ id: 'new-db-id' }); + + await service.addDatabases( + sessionMetadata, + accountId, + [{ id: database.id }], + 'contoso.onmicrosoft.com', + ); + + expect(mockDatabaseService.create).toHaveBeenCalledWith( + sessionMetadata, + expect.objectContaining({ + providerDetails: expect.objectContaining({ + tenantId: mockAccount.tenantId, + }), + }), + ); + }); + it('should successfully add an enterprise Redis database', async () => { const subscriptionId = faker.string.uuid(); const mockCluster = createMockEnterpriseCluster(subscriptionId); @@ -667,4 +704,32 @@ describe('AzureAutodiscoveryService', () => { expect(result[1].message).toBe(ERROR_MESSAGES.AZURE_DATABASE_NOT_FOUND); }); }); + + describe('getAccessKey', () => { + it('should acquire the ARM token against the resource tenant', async () => { + const accountId = 'test-account-id'; + const tenantId = 'resource-realm-guid'; + mockAuthService.getManagementTokenByAccountId.mockResolvedValue({ + token: 'mock-token', + } as any); + mockAxiosInstance.post.mockResolvedValue({ + data: { primaryKey: 'primary-key' }, + }); + + const result = await service.getAccessKey( + accountId, + 'sub', + 'rg', + 'cache', + AzureRedisType.Standard, + undefined, + tenantId, + ); + + expect(result).toBe('primary-key'); + expect( + mockAuthService.getManagementTokenByAccountId, + ).toHaveBeenCalledWith(accountId, tenantId); + }); + }); }); diff --git a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.ts b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.ts index ca001a8acd..4df25743af 100644 --- a/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.ts +++ b/redisinsight/api/src/modules/azure/autodiscovery/azure-autodiscovery.service.ts @@ -66,9 +66,12 @@ export class AzureAutodiscoveryService { private async getAuthenticatedClient( accountId: string, + tenantId?: string, ): Promise { - const tokenResult = - await this.authService.getManagementTokenByAccountId(accountId); + const tokenResult = await this.authService.getManagementTokenByAccountId( + accountId, + tenantId, + ); if (!tokenResult) { this.logger.warn('No valid management token available'); @@ -106,8 +109,11 @@ export class AzureAutodiscoveryService { return allItems; } - async listSubscriptions(accountId: string): Promise { - const client = await this.getAuthenticatedClient(accountId); + async listSubscriptions( + accountId: string, + tenantId?: string, + ): Promise { + const client = await this.getAuthenticatedClient(accountId, tenantId); if (!client) { throw new BadRequestException('Failed to get authenticated client'); @@ -128,6 +134,7 @@ export class AzureAutodiscoveryService { async listDatabasesInSubscription( accountId: string, subscriptionId: string, + tenantId?: string, ): Promise { if (!this.isValidSubscriptionId(subscriptionId)) { throw new BadRequestException( @@ -135,7 +142,7 @@ export class AzureAutodiscoveryService { ); } - const client = await this.getAuthenticatedClient(accountId); + const client = await this.getAuthenticatedClient(accountId, tenantId); if (!client) { throw new BadRequestException('Failed to get authenticated client'); @@ -171,8 +178,13 @@ export class AzureAutodiscoveryService { async getConnectionDetails( accountId: string, databaseId: string, + tenantId?: string, ): Promise { - const database = await this.findDatabaseById(accountId, databaseId); + const database = await this.findDatabaseById( + accountId, + databaseId, + tenantId, + ); if (!database) { this.logger.warn(`Database not found: ${databaseId}`); @@ -181,12 +193,13 @@ export class AzureAutodiscoveryService { // Use Entra ID authentication (Microsoft's recommended approach) // Access Keys support will be added in a future update with proper UX - return this.getEntraIdConnectionDetails(accountId, database); + return this.getEntraIdConnectionDetails(accountId, database, tenantId); } private async findDatabaseById( accountId: string, resourceId: string, + tenantId?: string, ): Promise { if (!resourceId) { return null; @@ -205,6 +218,7 @@ export class AzureAutodiscoveryService { const databases = await this.listDatabasesInSubscription( accountId, subscriptionId, + tenantId, ); // Azure resource IDs are case-insensitive @@ -345,6 +359,7 @@ export class AzureAutodiscoveryService { * @param resourceName - Redis cache name * @param resourceType - Standard or Enterprise Redis * @param clusterName - Required for Enterprise Redis databases + * @param tenantId - Realm the resource lives in, for cross-tenant ARM access * @returns The primary access key */ async getAccessKey( @@ -354,11 +369,13 @@ export class AzureAutodiscoveryService { resourceName: string, resourceType: AzureRedisType, clusterName?: string, + tenantId?: string, ): Promise { - const client = await this.getAuthenticatedClient(accountId); + const client = await this.getAuthenticatedClient(accountId, tenantId); if (!client) { throw new AzureEntraIdTokenExpiredException( + tenantId, 'Azure session expired. Please re-authenticate with Azure to access this database.', ); } @@ -410,9 +427,12 @@ export class AzureAutodiscoveryService { private async getEntraIdConnectionDetails( accountId: string, database: AzureRedisDatabase, + tenantId?: string, ): Promise { - const tokenResult = - await this.authService.getRedisTokenByAccountId(accountId); + const tokenResult = await this.authService.getRedisTokenByAccountId( + accountId, + tenantId, + ); if (!tokenResult) { this.logger.debug( @@ -435,6 +455,9 @@ export class AzureAutodiscoveryService { tls: true, authType: AzureAuthType.EntraId, azureAccountId: accountId, + // Store the realm GUID the token was issued for, not a user-entered + // domain, so silent-refresh account selection can match it. + tenantId: tokenResult.account.tenantId, subscriptionId: database.subscriptionId, resourceGroup: database.resourceGroup, resourceId: database.id, @@ -462,6 +485,7 @@ export class AzureAutodiscoveryService { private getAccessKeyConnectionDetails( accountId: string, database: AzureRedisDatabase, + tenantId?: string, ): AzureConnectionDetails { const port = this.getTlsPort(database); const { resourceName, clusterName } = this.extractResourceNames(database); @@ -476,6 +500,7 @@ export class AzureAutodiscoveryService { tls: true, authType: AzureAuthType.AccessKey, azureAccountId: accountId, + tenantId, subscriptionId: database.subscriptionId, resourceGroup: database.resourceGroup, resourceId: database.id, @@ -494,11 +519,12 @@ export class AzureAutodiscoveryService { accountId: string, database: AzureRedisDatabase, authType: AzureAuthType, + tenantId?: string, ): Promise { if (authType === AzureAuthType.AccessKey) { - return this.getAccessKeyConnectionDetails(accountId, database); + return this.getAccessKeyConnectionDetails(accountId, database, tenantId); } - return this.getEntraIdConnectionDetails(accountId, database); + return this.getEntraIdConnectionDetails(accountId, database, tenantId); } /** @@ -509,6 +535,7 @@ export class AzureAutodiscoveryService { sessionMetadata: SessionMetadata, accountId: string, databases: ImportAzureDatabaseDto[], + tenantId?: string, ): Promise { this.logger.debug( `Adding ${databases.length} Azure database(s) for account ${accountId}`, @@ -524,7 +551,7 @@ export class AzureAutodiscoveryService { try { this.logger.debug(`[${dto.id}] Fetching database details...`); - database = await this.findDatabaseById(accountId, dto.id); + database = await this.findDatabaseById(accountId, dto.id, tenantId); if (!database) { this.logger.debug(`[${dto.id}] Database not found`); @@ -545,6 +572,7 @@ export class AzureAutodiscoveryService { accountId, database, selectedAuthType, + tenantId, ); if (!connectionDetails) { @@ -574,6 +602,7 @@ export class AzureAutodiscoveryService { provider: CloudProvider.Azure, authType: selectedAuthType, azureAccountId: connectionDetails.azureAccountId, + tenantId: connectionDetails.tenantId, subscriptionId: connectionDetails.subscriptionId, resourceGroup: connectionDetails.resourceGroup, resourceName: connectionDetails.resourceName, diff --git a/redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-databases.dto.ts b/redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-databases.dto.ts index 4e82e0317d..836a31b5ab 100644 --- a/redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-databases.dto.ts +++ b/redisinsight/api/src/modules/azure/autodiscovery/dto/import-azure-databases.dto.ts @@ -1,13 +1,16 @@ -import { ApiProperty } from '@nestjs/swagger'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { ArrayNotEmpty, IsArray, IsDefined, IsNotEmpty, + IsOptional, IsString, + Matches, ValidateNested, } from 'class-validator'; import { Type } from 'class-transformer'; +import { AZURE_TENANT_ID_REGEX } from '../../constants'; import { ImportAzureDatabaseDto } from './import-azure-database.dto'; export class ImportAzureDatabasesDto { @@ -31,4 +34,16 @@ export class ImportAzureDatabasesDto { @ValidateNested({ each: true }) @Type(() => ImportAzureDatabaseDto) databases: ImportAzureDatabaseDto[]; + + @ApiPropertyOptional({ + description: + 'Azure tenant (GUID or domain) the databases were discovered under. ' + + 'Used so tokens are acquired against the correct tenant.', + type: String, + }) + @IsOptional() + @Matches(AZURE_TENANT_ID_REGEX, { + message: 'tenantId must be a valid GUID or domain.', + }) + tenantId?: string; } diff --git a/redisinsight/api/src/modules/azure/azure-token-refresh.manager.spec.ts b/redisinsight/api/src/modules/azure/azure-token-refresh.manager.spec.ts index f8e840373e..0168b8c69b 100644 --- a/redisinsight/api/src/modules/azure/azure-token-refresh.manager.spec.ts +++ b/redisinsight/api/src/modules/azure/azure-token-refresh.manager.spec.ts @@ -23,12 +23,13 @@ const createMockTokenResult = () => { }; }; -const createMockClient = (tokenExpiresOn?: Date) => ({ +const createMockClient = (tokenExpiresOn?: Date, tenantId?: string) => ({ id: faker.string.uuid(), call: jest.fn().mockResolvedValue('OK'), database: { providerDetails: { azureAccountId: faker.string.uuid(), + tenantId, tokenExpiresOn, }, }, @@ -77,18 +78,18 @@ describe('AzureTokenRefreshManager', () => { const azureAccountId = faker.string.uuid(); const expiresOn = new Date(Date.now() + 60 * 60 * 1000); // 1 hour - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); expect(jest.getTimerCount()).toBe(1); }); - it('should clear existing timer when scheduling for same account with different expiry', () => { + it('should clear existing timer when scheduling for same account+tenant with different expiry', () => { const azureAccountId = faker.string.uuid(); const expiresOn1 = new Date(Date.now() + 60 * 60 * 1000); const expiresOn2 = new Date(Date.now() + 2 * 60 * 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn1); - manager.scheduleRefresh(azureAccountId, expiresOn2); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn1); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn2); expect(jest.getTimerCount()).toBe(1); }); @@ -97,9 +98,9 @@ describe('AzureTokenRefreshManager', () => { const azureAccountId = faker.string.uuid(); const expiresOn = new Date(Date.now() + 60 * 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); // Should still be just 1 timer (not cleared and rescheduled) expect(jest.getTimerCount()).toBe(1); @@ -110,8 +111,18 @@ describe('AzureTokenRefreshManager', () => { const accountId2 = faker.string.uuid(); const expiresOn = new Date(Date.now() + 60 * 60 * 1000); - manager.scheduleRefresh(accountId1, expiresOn); - manager.scheduleRefresh(accountId2, expiresOn); + manager.scheduleRefresh(accountId1, undefined, expiresOn); + manager.scheduleRefresh(accountId2, undefined, expiresOn); + + expect(jest.getTimerCount()).toBe(2); + }); + + it('should keep separate timers per tenant for the same account', () => { + const azureAccountId = faker.string.uuid(); + const expiresOn = new Date(Date.now() + 60 * 60 * 1000); + + manager.scheduleRefresh(azureAccountId, 'tenant-a', expiresOn); + manager.scheduleRefresh(azureAccountId, 'tenant-b', expiresOn); expect(jest.getTimerCount()).toBe(2); }); @@ -122,11 +133,11 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date(Date.now() + 60 * 60 * 1000); // Simulate multiple token events arriving rapidly (e.g., from concurrent requests) - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); // Should only have 1 timer, not 5 expect(jest.getTimerCount()).toBe(1); @@ -147,7 +158,7 @@ describe('AzureTokenRefreshManager', () => { ]); // Initial timer scheduled - manager.scheduleRefresh(azureAccountId, initialExpiry); + manager.scheduleRefresh(azureAccountId, undefined, initialExpiry); expect(jest.getTimerCount()).toBe(1); // Client reconnects 10 minutes later, gets new token with different expiry @@ -177,19 +188,19 @@ describe('AzureTokenRefreshManager', () => { const expiresOn1 = new Date(Date.now() + 60 * 60 * 1000); const expiresOn2 = new Date(Date.now() + 2 * 60 * 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn1); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn1); // Access internal timers map to verify behavior const timersMap = ( manager as unknown as { timers: Map } ).timers; - expect(timersMap.has(azureAccountId)).toBe(true); + expect(timersMap.has(`${azureAccountId}::`)).toBe(true); // Schedule with new expiry - should overwrite, not delete then set - manager.scheduleRefresh(azureAccountId, expiresOn2); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn2); // Entry should still exist (was overwritten atomically) - expect(timersMap.has(azureAccountId)).toBe(true); + expect(timersMap.has(`${azureAccountId}::`)).toBe(true); expect(jest.getTimerCount()).toBe(1); }); }); @@ -200,7 +211,7 @@ describe('AzureTokenRefreshManager', () => { // Token expires in 2 minutes (within 5-minute buffer) const expiresOn = new Date(Date.now() + 2 * 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); expect(jest.getTimerCount()).toBe(1); // Timer should not fire immediately - minimum delay enforced @@ -213,7 +224,7 @@ describe('AzureTokenRefreshManager', () => { // Token already expired 1 minute ago const expiresOn = new Date(Date.now() - 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); expect(jest.getTimerCount()).toBe(1); // Timer should not fire immediately - minimum delay enforced @@ -249,7 +260,11 @@ describe('AzureTokenRefreshManager', () => { ]); // Initial schedule - manager.scheduleRefresh(azureAccountId, nearExpiryToken.expiresOn); + manager.scheduleRefresh( + azureAccountId, + undefined, + nearExpiryToken.expiresOn, + ); // Advance past minimum delay to trigger refresh await jest.advanceTimersByTimeAsync(MIN_REFRESH_DELAY_MS); @@ -307,6 +322,33 @@ describe('AzureTokenRefreshManager', () => { expect(clientWithCurrentToken.call).not.toHaveBeenCalled(); }); + + it('should only re-authenticate clients of the token tenant', async () => { + const accountId = faker.string.uuid(); + const tokenResult = createMockTokenResult(); + // Same account, connections in two different tenants. + const clientTenantA = createMockClient(undefined, 'tenant-a'); + const clientTenantB = createMockClient(undefined, 'tenant-b'); + + mockRedisClientStorage.getClientsByDatabaseField.mockReturnValue([ + clientTenantA, + clientTenantB, + ]); + + await manager.handleTokenAcquired({ + accountId, + tenantId: 'tenant-a', + tokenResult, + }); + + // Only tenant-a's client gets tenant-a's token; tenant-b is untouched. + expect(clientTenantA.call).toHaveBeenCalledWith([ + 'AUTH', + tokenResult.account.localAccountId, + tokenResult.token, + ]); + expect(clientTenantB.call).not.toHaveBeenCalled(); + }); }); describe('clearTimer', () => { @@ -314,7 +356,7 @@ describe('AzureTokenRefreshManager', () => { const azureAccountId = faker.string.uuid(); const expiresOn = new Date(Date.now() + 60 * 60 * 1000); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); expect(jest.getTimerCount()).toBe(1); manager.clearTimer(azureAccountId); @@ -330,9 +372,9 @@ describe('AzureTokenRefreshManager', () => { it('should clear all timers', () => { const expiresOn = new Date(Date.now() + 60 * 60 * 1000); - manager.scheduleRefresh(faker.string.uuid(), expiresOn); - manager.scheduleRefresh(faker.string.uuid(), expiresOn); - manager.scheduleRefresh(faker.string.uuid(), expiresOn); + manager.scheduleRefresh(faker.string.uuid(), undefined, expiresOn); + manager.scheduleRefresh(faker.string.uuid(), undefined, expiresOn); + manager.scheduleRefresh(faker.string.uuid(), undefined, expiresOn); expect(jest.getTimerCount()).toBe(3); manager.clearAllTimers(); @@ -344,8 +386,8 @@ describe('AzureTokenRefreshManager', () => { it('should clear all timers on module destroy', () => { const expiresOn = new Date(Date.now() + 60 * 60 * 1000); - manager.scheduleRefresh(faker.string.uuid(), expiresOn); - manager.scheduleRefresh(faker.string.uuid(), expiresOn); + manager.scheduleRefresh(faker.string.uuid(), undefined, expiresOn); + manager.scheduleRefresh(faker.string.uuid(), undefined, expiresOn); expect(jest.getTimerCount()).toBe(2); manager.onModuleDestroy(); @@ -381,13 +423,13 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); expect( mockAzureAuthService.getRedisTokenByAccountId, - ).toHaveBeenCalledWith(azureAccountId); + ).toHaveBeenCalledWith(azureAccountId, undefined); expect( mockRedisClientStorage.getClientsByDatabaseField, ).toHaveBeenCalledWith('providerDetails.azureAccountId', azureAccountId); @@ -398,6 +440,38 @@ describe('AzureTokenRefreshManager', () => { ]); }); + it('should refresh against the tenant the timer was scheduled for', async () => { + const azureAccountId = faker.string.uuid(); + const tenantId = faker.string.uuid(); + const tokenResult = createMockTokenResult(); + const mockClient = createMockClient(undefined, tenantId); + + mockAzureAuthService.getRedisTokenByAccountId.mockImplementation( + async () => { + await manager.handleTokenAcquired({ + accountId: azureAccountId, + tenantId, + tokenResult, + }); + return tokenResult; + }, + ); + mockRedisClientStorage.getClientsByDatabaseField.mockReturnValue([ + mockClient, + ]); + + const expiresOn = new Date( + Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, + ); + manager.scheduleRefresh(azureAccountId, tenantId, expiresOn); + + await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); + + expect( + mockAzureAuthService.getRedisTokenByAccountId, + ).toHaveBeenCalledWith(azureAccountId, tenantId); + }); + it('should not re-authenticate when token refresh fails', async () => { const azureAccountId = faker.string.uuid(); const mockClient = createMockClient(); @@ -410,7 +484,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -431,7 +505,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -472,7 +546,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -505,7 +579,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -540,7 +614,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -572,7 +646,7 @@ describe('AzureTokenRefreshManager', () => { const expiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, expiresOn); + manager.scheduleRefresh(azureAccountId, undefined, expiresOn); await jest.advanceTimersByTimeAsync(TEST_DELAY_MS); @@ -610,7 +684,7 @@ describe('AzureTokenRefreshManager', () => { const scheduleExpiresOn = new Date( Date.now() + TOKEN_REFRESH_BUFFER_MS + TEST_DELAY_MS, ); - manager.scheduleRefresh(azureAccountId, scheduleExpiresOn); + manager.scheduleRefresh(azureAccountId, undefined, scheduleExpiresOn); expect(jest.getTimerCount()).toBe(1); // Fire the timer diff --git a/redisinsight/api/src/modules/azure/azure-token-refresh.manager.ts b/redisinsight/api/src/modules/azure/azure-token-refresh.manager.ts index 729d3c1007..d1a780aff5 100644 --- a/redisinsight/api/src/modules/azure/azure-token-refresh.manager.ts +++ b/redisinsight/api/src/modules/azure/azure-token-refresh.manager.ts @@ -12,18 +12,18 @@ import { AzureTokenResult } from './auth/models'; /** * Manages automatic token refresh for Azure Entra ID authenticated Redis clients. * - * When a token is acquired, the AzureRedisTokenEvents.Acquired event triggers: - * 1. Schedule a timer to refresh before expiry - * 2. Re-authenticate active Redis clients with the new token - * - * When the timer fires, it acquires a fresh token which emits the event again, - * continuing the cycle. The cycle stops when no clients are using the account. + * Refresh cycles are tracked per (account, tenant): one user can be signed into + * multiple tenants, each with its own token, and a client must only ever be + * re-authenticated with the token for its own tenant. */ interface ScheduledTimer { timeout: NodeJS.Timeout; expiresOn: Date; } +const refreshKey = (accountId: string, tenantId?: string): string => + `${accountId}::${tenantId ?? ''}`; + @Injectable() export class AzureTokenRefreshManager implements OnModuleDestroy { private readonly logger = new Logger(AzureTokenRefreshManager.name); @@ -42,23 +42,31 @@ export class AzureTokenRefreshManager implements OnModuleDestroy { @OnEvent(AzureRedisTokenEvents.Acquired) async handleTokenAcquired({ accountId, + tenantId, tokenResult, }: { accountId: string; + tenantId?: string; tokenResult: AzureTokenResult; }): Promise { try { - this.scheduleRefresh(accountId, tokenResult.expiresOn); - await this.reAuthenticateClients(accountId, tokenResult); + this.scheduleRefresh(accountId, tenantId, tokenResult.expiresOn); + await this.reAuthenticateClients(accountId, tenantId, tokenResult); } catch (error) { this.logger.error( - `Failed to handle token acquired event for account ${accountId}: ${error.message}`, + `Failed to handle token acquired event for account ${accountId} ` + + `(tenant=${tenantId || 'home'}): ${error.message}`, ); } } - scheduleRefresh(azureAccountId: string, expiresOn: Date): void { - const existing = this.timers.get(azureAccountId); + scheduleRefresh( + azureAccountId: string, + tenantId: string | undefined, + expiresOn: Date, + ): void { + const key = refreshKey(azureAccountId, tenantId); + const existing = this.timers.get(key); // Skip if already scheduled for the same expiry time (race condition protection) if (existing?.expiresOn?.getTime() === expiresOn.getTime()) { @@ -82,31 +90,30 @@ export class AzureTokenRefreshManager implements OnModuleDestroy { if (calculatedDelay < MIN_REFRESH_DELAY_MS) { this.logger.warn( - `Token for account ${azureAccountId} expires soon (${Math.round(calculatedDelay / 1000)}s), ` + + `Token for ${key} expires soon (${Math.round(calculatedDelay / 1000)}s), ` + `using minimum delay of ${MIN_REFRESH_DELAY_MS / 1000}s`, ); } this.logger.debug( - `Scheduling token refresh for account ${azureAccountId} in ${Math.round(delay / 1000)}s (expires: ${expiresOn.toISOString()})`, + `Scheduling token refresh for ${key} in ${Math.round(delay / 1000)}s (expires: ${expiresOn.toISOString()})`, ); const timeout = setTimeout(() => { - this.refreshToken(azureAccountId).catch((error) => { - this.logger.error( - `Token refresh failed for account ${azureAccountId}: ${error.message}`, - ); + this.refreshToken(azureAccountId, tenantId).catch((error) => { + this.logger.error(`Token refresh failed for ${key}: ${error.message}`); }); }, delay); - this.timers.set(azureAccountId, { timeout, expiresOn }); + this.timers.set(key, { timeout, expiresOn }); } - clearTimer(azureAccountId: string): void { - const existing = this.timers.get(azureAccountId); + clearTimer(azureAccountId: string, tenantId?: string): void { + const key = refreshKey(azureAccountId, tenantId); + const existing = this.timers.get(key); if (existing) { clearTimeout(existing.timeout); - this.timers.delete(azureAccountId); + this.timers.delete(key); } } @@ -115,38 +122,50 @@ export class AzureTokenRefreshManager implements OnModuleDestroy { this.timers.clear(); } - private async refreshToken(azureAccountId: string): Promise { - this.logger.debug(`Refreshing token for account ${azureAccountId}`); + /** Active clients for a given account and tenant. */ + private getClientsForTenant(azureAccountId: string, tenantId?: string) { + return this.redisClientStorage + .getClientsByDatabaseField( + 'providerDetails.azureAccountId', + azureAccountId, + ) + .filter( + (client) => client.database.providerDetails?.tenantId === tenantId, + ); + } + + private async refreshToken( + azureAccountId: string, + tenantId?: string, + ): Promise { + const key = refreshKey(azureAccountId, tenantId); + this.logger.debug(`Refreshing token for ${key}`); // Clear the stale timer entry - the timer has fired, so the entry is no longer valid. // This ensures that when getRedisTokenByAccountId emits the Acquired event, // scheduleRefresh won't skip due to matching expiresOn (e.g., MSAL cached token). - this.clearTimer(azureAccountId); + this.clearTimer(azureAccountId, tenantId); - // Stop the refresh cycle if no clients are using this account - const clients = this.redisClientStorage.getClientsByDatabaseField( - 'providerDetails.azureAccountId', - azureAccountId, - ); + // Stop the refresh cycle if no clients are using this account+tenant + const clients = this.getClientsForTenant(azureAccountId, tenantId); if (clients.length === 0) { - this.logger.debug( - `No active clients for account ${azureAccountId}, stopping refresh cycle`, - ); + this.logger.debug(`No active clients for ${key}, stopping refresh cycle`); return; } - await this.azureAuthService.getRedisTokenByAccountId(azureAccountId); + await this.azureAuthService.getRedisTokenByAccountId( + azureAccountId, + tenantId, + ); } private async reAuthenticateClients( azureAccountId: string, + tenantId: string | undefined, tokenResult: AzureTokenResult, ): Promise { - const clients = this.redisClientStorage.getClientsByDatabaseField( - 'providerDetails.azureAccountId', - azureAccountId, - ); + const clients = this.getClientsForTenant(azureAccountId, tenantId); if (clients.length === 0) { return; @@ -161,13 +180,13 @@ export class AzureTokenRefreshManager implements OnModuleDestroy { if (clientsToReauth.length === 0) { this.logger.debug( - `All clients for account ${azureAccountId} already have current token`, + `All clients for ${refreshKey(azureAccountId, tenantId)} already have current token`, ); return; } this.logger.debug( - `Re-authenticating ${clientsToReauth.length} of ${clients.length} client(s) for account ${azureAccountId}`, + `Re-authenticating ${clientsToReauth.length} of ${clients.length} client(s) for ${refreshKey(azureAccountId, tenantId)}`, ); await Promise.all( diff --git a/redisinsight/api/src/modules/azure/constants.ts b/redisinsight/api/src/modules/azure/constants.ts index 939beca570..6f6cb14bd0 100644 --- a/redisinsight/api/src/modules/azure/constants.ts +++ b/redisinsight/api/src/modules/azure/constants.ts @@ -5,11 +5,24 @@ */ export const AZURE_OAUTH_STORAGE_KEY = 'ri_azure_oauth_result'; +/** + * Azure AD authority host. Per-tenant authorities are built as + * `${AZURE_AUTHORITY_HOST}/${tenantId}`; because they share this host with the + * `/common` default, AAD instance discovery trusts them without extra config. + */ +export const AZURE_AUTHORITY_HOST = 'https://login.microsoftonline.com'; + /** * Azure AD authority URL for multi-tenant authentication. * Uses 'common' endpoint to allow any Azure AD tenant. */ -export const AZURE_AUTHORITY = 'https://login.microsoftonline.com/common'; +export const AZURE_AUTHORITY = `${AZURE_AUTHORITY_HOST}/common`; + +/** + * Build a per-tenant Azure AD authority URL from a tenant id or domain. + */ +export const buildAzureAuthority = (tenantId: string): string => + `${AZURE_AUTHORITY_HOST}/${tenantId}`; /** * Azure App Registration Client ID. @@ -139,6 +152,16 @@ export const AUTODISCOVERY_MAX_CONCURRENT_REQUESTS = 20; export const AZURE_SUBSCRIPTION_ID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; +// MSAL reports the realm that issued a token as a GUID, so only a tenant given +// in this form can be compared against it. +export const AZURE_TENANT_GUID_REGEX = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; + +// A tenant id is either a GUID or a domain (e.g. your-tenant.onmicrosoft.com). +// MSAL accepts both as the authority path segment. +export const AZURE_TENANT_ID_REGEX = + /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,})$/i; + export const AzureApiUrls = { getSubscriptions: () => `/subscriptions?api-version=${API_VERSION_SUBSCRIPTIONS}`, diff --git a/redisinsight/api/src/modules/azure/exceptions/azure-entra-id-token-expired.exception.ts b/redisinsight/api/src/modules/azure/exceptions/azure-entra-id-token-expired.exception.ts index 98d7fb2df8..666316ec6b 100644 --- a/redisinsight/api/src/modules/azure/exceptions/azure-entra-id-token-expired.exception.ts +++ b/redisinsight/api/src/modules/azure/exceptions/azure-entra-id-token-expired.exception.ts @@ -8,6 +8,9 @@ import { CustomErrorCodes } from 'src/constants'; export class AzureEntraIdTokenExpiredException extends HttpException { constructor( + // Realm the expired connection was created for, so interactive recovery + // re-authenticates against it instead of the home tenant. + tenantId?: string, message = ERROR_MESSAGES.AZURE_ENTRA_ID_TOKEN_EXPIRED, options?: HttpExceptionOptions, ) { @@ -18,6 +21,7 @@ export class AzureEntraIdTokenExpiredException extends HttpException { errorCode: CustomErrorCodes.AzureEntraIdTokenExpired, additionalInfo: { errorCode: CustomErrorCodes.AzureEntraIdTokenExpired, + tenantId, }, }; diff --git a/redisinsight/api/src/modules/azure/models/azure-resource.ts b/redisinsight/api/src/modules/azure/models/azure-resource.ts index 166a6768b2..f8b9776da4 100644 --- a/redisinsight/api/src/modules/azure/models/azure-resource.ts +++ b/redisinsight/api/src/modules/azure/models/azure-resource.ts @@ -168,6 +168,12 @@ export class AzureConnectionDetails { }) azureAccountId?: string; + @ApiPropertyOptional({ + description: 'Azure tenant the token was issued against', + type: String, + }) + tenantId?: string; + @ApiProperty({ description: 'Azure subscription ID', type: String, diff --git a/redisinsight/api/src/modules/browser/keys/dto/get.namespace-searchable.dto.ts b/redisinsight/api/src/modules/browser/keys/dto/get.namespace-searchable.dto.ts deleted file mode 100644 index 816ae4ee2e..0000000000 --- a/redisinsight/api/src/modules/browser/keys/dto/get.namespace-searchable.dto.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { ArrayNotEmpty, IsDefined, IsString } from 'class-validator'; -import { RedisStringType } from 'src/common/decorators'; -import { RedisString } from 'src/common/constants'; - -export class GetNamespaceSearchableDto { - @ApiProperty({ - description: 'List of namespace prefixes to check for searchable keys', - type: [String], - example: ['user:', 'session:'], - }) - @IsDefined() - @IsString({ each: true }) - @ArrayNotEmpty() - prefixes: string[]; -} - -export class NamespaceSearchableKeyResponse { - @ApiProperty({ - description: 'Key name', - type: String, - }) - @RedisStringType() - name: RedisString; - - @ApiProperty({ - description: 'Key type (hash or ReJSON-RL)', - type: String, - }) - type: string; -} - -export class NamespaceSearchableResponse { - @ApiProperty({ - description: 'Namespace prefix', - type: String, - }) - prefix: string; - - @ApiPropertyOptional({ - description: 'First searchable key found in the namespace, if any', - type: NamespaceSearchableKeyResponse, - }) - key?: NamespaceSearchableKeyResponse; -} diff --git a/redisinsight/api/src/modules/browser/keys/dto/index.ts b/redisinsight/api/src/modules/browser/keys/dto/index.ts index b317f191f5..2b06962260 100644 --- a/redisinsight/api/src/modules/browser/keys/dto/index.ts +++ b/redisinsight/api/src/modules/browser/keys/dto/index.ts @@ -12,4 +12,3 @@ export * from './rename.key.response'; export * from './scan-data-type.dto'; export * from './update.key-ttl.dto'; export * from './update.key-ttl.response'; -export * from './get.namespace-searchable.dto'; diff --git a/redisinsight/api/src/modules/browser/keys/keys.controller.ts b/redisinsight/api/src/modules/browser/keys/keys.controller.ts index 172ac73e5e..f11e35d56a 100644 --- a/redisinsight/api/src/modules/browser/keys/keys.controller.ts +++ b/redisinsight/api/src/modules/browser/keys/keys.controller.ts @@ -35,8 +35,6 @@ import { UpdateKeyTtlDto, KeyTtlResponse, GetKeysInfoDto, - GetNamespaceSearchableDto, - NamespaceSearchableResponse, } from 'src/modules/browser/keys/dto'; import { BrowserSerializeInterceptor } from 'src/common/interceptors'; @@ -110,25 +108,6 @@ export class KeysController { ); } - @Post('get-namespace-searchable') - @HttpCode(200) - @ApiOperation({ - description: 'Check if namespaces contain searchable keys (hash/json)', - }) - @ApiBody({ type: GetNamespaceSearchableDto }) - @ApiRedisParams() - @ApiOkResponse({ - description: 'Searchable key info per namespace prefix', - type: [NamespaceSearchableResponse], - }) - @ApiQueryRedisStringEncoding() - async getNamespaceSearchable( - @BrowserClientMetadata() clientMetadata: ClientMetadata, - @Body() dto: GetNamespaceSearchableDto, - ): Promise { - return this.keysService.getNamespaceSearchable(clientMetadata, dto); - } - @Delete('') @ApiOperation({ description: 'Delete key' }) @ApiRedisParams() diff --git a/redisinsight/api/src/modules/browser/keys/keys.service.spec.ts b/redisinsight/api/src/modules/browser/keys/keys.service.spec.ts index b0a7a3d6ef..e4e3e5f784 100644 --- a/redisinsight/api/src/modules/browser/keys/keys.service.spec.ts +++ b/redisinsight/api/src/modules/browser/keys/keys.service.spec.ts @@ -466,105 +466,6 @@ describe('KeysService', () => { }); }); - describe('getNamespaceSearchable', () => { - const dto = { prefixes: ['user:', 'session:'] }; - - beforeEach(() => { - mockStandaloneRedisClient.sendPipeline.mockReset(); - }); - - it('should return searchable key when hash key found', async () => { - mockStandaloneRedisClient.sendPipeline - .mockResolvedValueOnce([ - [null, ['0', ['user:1']]], - [null, ['0', []]], - ]) - .mockResolvedValueOnce([ - [null, ['0', []]], - [null, ['0', []]], - ]); - - const result = await service.getNamespaceSearchable( - mockBrowserClientMetadata, - dto, - ); - - expect(result).toEqual([ - { prefix: 'user:', key: { name: 'user:1', type: 'hash' } }, - { prefix: 'session:' }, - ]); - }); - - it('should return searchable key when json key found', async () => { - mockStandaloneRedisClient.sendPipeline - .mockResolvedValueOnce([ - [null, ['0', []]], - [null, ['0', ['user:json1']]], - ]) - .mockResolvedValueOnce([ - [null, ['0', []]], - [null, ['0', []]], - ]); - - const result = await service.getNamespaceSearchable( - mockBrowserClientMetadata, - dto, - ); - - expect(result).toEqual([ - { prefix: 'user:', key: { name: 'user:json1', type: 'ReJSON-RL' } }, - { prefix: 'session:' }, - ]); - }); - - it('should return empty when no searchable keys found', async () => { - mockStandaloneRedisClient.sendPipeline.mockResolvedValue([ - [null, ['0', []]], - [null, ['0', []]], - ]); - - const result = await service.getNamespaceSearchable( - mockBrowserClientMetadata, - dto, - ); - - expect(result).toEqual([{ prefix: 'user:' }, { prefix: 'session:' }]); - }); - - it('should iterate scan until key is found', async () => { - const singleDto = { prefixes: ['user:'] }; - - mockStandaloneRedisClient.sendPipeline - .mockResolvedValueOnce([ - [null, ['42', []]], - [null, ['0', []]], - ]) - .mockResolvedValueOnce([[null, ['0', ['user:2']]]]); - - const result = await service.getNamespaceSearchable( - mockBrowserClientMetadata, - singleDto, - ); - - expect(result).toEqual([ - { prefix: 'user:', key: { name: 'user:2', type: 'hash' } }, - ]); - expect(mockStandaloneRedisClient.sendPipeline).toHaveBeenCalledTimes(2); - }); - - it('should throw on ACL error', async () => { - const replyError = { - ...mockRedisNoPermError, - command: 'SCAN', - }; - mockStandaloneRedisClient.sendPipeline.mockRejectedValue(replyError); - - await expect( - service.getNamespaceSearchable(mockBrowserClientMetadata, dto), - ).rejects.toThrow(ForbiddenException); - }); - }); - describe('removeKeyExpiration', () => { const keyName = 'testString'; it('should remove key expiration', async () => { diff --git a/redisinsight/api/src/modules/browser/keys/keys.service.ts b/redisinsight/api/src/modules/browser/keys/keys.service.ts index 5d0e7a4f23..974287e1ca 100644 --- a/redisinsight/api/src/modules/browser/keys/keys.service.ts +++ b/redisinsight/api/src/modules/browser/keys/keys.service.ts @@ -18,16 +18,13 @@ import { GetKeysDto, GetKeysInfoDto, GetKeysWithDetailsResponse, - GetNamespaceSearchableDto, KeyTtlResponse, - NamespaceSearchableResponse, RenameKeyDto, RenameKeyResponse, UpdateKeyTtlDto, } from 'src/modules/browser/keys/dto'; import { RedisDataType } from 'src/modules/browser/keys/dto/key.dto'; import { BrowserToolKeysCommands } from 'src/modules/browser/constants/browser-tool-commands'; -import { RedisClientCommand } from 'src/modules/redis/client'; import { ClientMetadata } from 'src/common/models'; import { Scanner } from 'src/modules/browser/keys/scanner/scanner'; import { BrowserHistoryMode, RedisString } from 'src/common/constants'; @@ -277,126 +274,6 @@ export class KeysService { } } - private static readonly SEARCHABLE_TYPES = [ - RedisDataType.Hash, - RedisDataType.JSON, - ]; - - private static readonly SCAN_SEARCHABLE_COUNT = 500; - - /** - * Check if namespaces contain searchable keys (hash/json) - * Uses SCAN with TYPE filter, fully iterating until a match - * is found or the keyspace is exhausted - * @param clientMetadata - * @param dto - */ - public async getNamespaceSearchable( - clientMetadata: ClientMetadata, - dto: GetNamespaceSearchableDto, - ): Promise { - try { - this.logger.debug('Checking namespace searchable keys.', clientMetadata); - - const client = - await this.databaseClientFactory.getOrCreateClient(clientMetadata); - - const results = await Promise.all( - dto.prefixes.map((prefix) => - this.findFirstSearchableKey(client, prefix), - ), - ); - - this.logger.debug( - 'Succeed to check namespace searchable keys.', - clientMetadata, - ); - - return results; - } catch (error) { - this.logger.error( - `Failed to check namespace searchable keys. ${error.message}.`, - error, - clientMetadata, - ); - - if (error.message?.includes(RedisErrorCodes.CommandSyntaxError)) { - return dto.prefixes.map((prefix) => ({ prefix })); - } - - throw catchAclError(error); - } - } - - private async findFirstSearchableKey( - client: any, - prefix: string, - ): Promise { - const scanCursors = KeysService.SEARCHABLE_TYPES.map(() => '0'); - const isTypeExhausted = KeysService.SEARCHABLE_TYPES.map(() => false); - - while (!isTypeExhausted.every(Boolean)) { - const scanCommands: RedisClientCommand[] = []; - const pendingTypeIndexes: number[] = []; - - for ( - let typeIndex = 0; - typeIndex < KeysService.SEARCHABLE_TYPES.length; - typeIndex++ - ) { - if (isTypeExhausted[typeIndex]) continue; - pendingTypeIndexes.push(typeIndex); - scanCommands.push([ - BrowserToolKeysCommands.Scan, - scanCursors[typeIndex], - 'MATCH', - `${prefix}*`, - 'COUNT', - `${KeysService.SCAN_SEARCHABLE_COUNT}`, - 'TYPE', - KeysService.SEARCHABLE_TYPES[typeIndex], - ]); - } - - const pipelineResults = (await client.sendPipeline(scanCommands, { - replyEncoding: 'utf8', - })) as [any, [string, string[]]][]; - - for ( - let resultIndex = 0; - resultIndex < pipelineResults.length; - resultIndex++ - ) { - const typeIndex = pendingTypeIndexes[resultIndex]; - const [scanError, scanResult] = pipelineResults[resultIndex]; - - if (scanError || !scanResult) { - isTypeExhausted[typeIndex] = true; - continue; - } - - const [nextCursor, matchedKeys] = scanResult; - - if (matchedKeys?.length > 0) { - return plainToInstance(NamespaceSearchableResponse, { - prefix, - key: { - name: matchedKeys[0], - type: KeysService.SEARCHABLE_TYPES[typeIndex], - }, - }); - } - - scanCursors[typeIndex] = nextCursor; - if (nextCursor === '0') { - isTypeExhausted[typeIndex] = true; - } - } - } - - return plainToInstance(NamespaceSearchableResponse, { prefix }); - } - public async updateTtl( clientMetadata: ClientMetadata, dto: UpdateKeyTtlDto, diff --git a/redisinsight/api/src/modules/browser/redisearch/dto/index.info.dto.ts b/redisinsight/api/src/modules/browser/redisearch/dto/index.info.dto.ts index 13e5c0e6fa..308dfa2ee2 100644 --- a/redisinsight/api/src/modules/browser/redisearch/dto/index.info.dto.ts +++ b/redisinsight/api/src/modules/browser/redisearch/dto/index.info.dto.ts @@ -133,6 +133,29 @@ export class IndexAttibuteDto { @Expose() NOSTEM?: boolean; + @ApiPropertyOptional({ + description: + 'Text attributes can have the WITHSUFFIXTRIE argument that enables suffix trie indexing.', + type: Boolean, + }) + @Expose() + WITHSUFFIXTRIE?: boolean; + + @ApiPropertyOptional({ + description: 'Indicates that empty values are indexed for this attribute.', + type: Boolean, + }) + @Expose() + INDEXEMPTY?: boolean; + + @ApiPropertyOptional({ + description: + 'Indicates that missing values are indexed for this attribute.', + type: Boolean, + }) + @Expose() + INDEXMISSING?: boolean; + @ApiPropertyOptional({ description: `Indicates how the text contained in the attribute is to be split into individual tags. The default is ,. The value must be a single character.`, diff --git a/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.spec.ts b/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.spec.ts index 77aeb5ce00..ec8956284a 100644 --- a/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.spec.ts +++ b/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.spec.ts @@ -11,6 +11,7 @@ import { import { buildIndexInfoRaw } from 'src/__mocks__/redisearch'; import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory'; import { KeyIndexesService } from 'src/modules/browser/redisearch/key-indexes.service'; +import { RedisDataType } from 'src/modules/browser/keys/dto'; const mockMovieInfoRaw = buildIndexInfoRaw({ indexName: 'idx:movie', @@ -42,6 +43,16 @@ describe('KeyIndexesService', () => { const standaloneClient = mockStandaloneRedisClient; const clusterClient = mockClusterRedisClient; let service: KeyIndexesService; + let databaseClientFactory: DatabaseClientFactory; + + const mockKeyType = ( + key: string | Buffer, + type: string = RedisDataType.Hash, + ) => { + when(standaloneClient.sendCommand) + .calledWith(['TYPE', key], expect.anything()) + .mockResolvedValue(type); + }; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -55,6 +66,9 @@ describe('KeyIndexesService', () => { }).compile(); service = module.get(KeyIndexesService); + databaseClientFactory = module.get( + DatabaseClientFactory, + ); standaloneClient.sendCommand = jest.fn().mockResolvedValue(undefined); clusterClient.sendCommand = jest.fn().mockResolvedValue(undefined); @@ -66,6 +80,7 @@ describe('KeyIndexesService', () => { describe('getKeyIndexes', () => { it('should return matching index when key matches a prefix', async () => { + mockKeyType('movie:1'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:movie')]); @@ -84,6 +99,7 @@ describe('KeyIndexesService', () => { }); it('should return empty array when key matches no prefix', async () => { + mockKeyType('session:abc'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:movie')]); @@ -99,6 +115,7 @@ describe('KeyIndexesService', () => { }); it('should return multiple indexes when key matches several', async () => { + mockKeyType('user:42'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([ @@ -123,6 +140,7 @@ describe('KeyIndexesService', () => { }); it('should match index with empty prefixes to any key', async () => { + mockKeyType('anything:here'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:global')]); @@ -139,6 +157,7 @@ describe('KeyIndexesService', () => { }); it('should match key against index with multiple prefixes', async () => { + mockKeyType('item:99', RedisDataType.JSON); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:multi')]); @@ -156,6 +175,7 @@ describe('KeyIndexesService', () => { }); it('should return empty when no indexes exist', async () => { + mockKeyType('movie:1'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([]); @@ -168,6 +188,7 @@ describe('KeyIndexesService', () => { }); it('should skip indexes whose FT.INFO fails', async () => { + mockKeyType('movie:1'); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([ @@ -190,9 +211,12 @@ describe('KeyIndexesService', () => { }); it('should deduplicate index names from cluster shards', async () => { + databaseClientFactory.getOrCreateClient = jest + .fn() + .mockResolvedValue(clusterClient); when(clusterClient.sendCommand) - .calledWith(['FT._LIST']) - .mockResolvedValue([Buffer.from('idx:movie')]); + .calledWith(['TYPE', 'movie:1'], expect.anything()) + .mockResolvedValue(RedisDataType.Hash); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:movie')]); @@ -216,6 +240,7 @@ describe('KeyIndexesService', () => { }); it('should handle Buffer keys', async () => { + mockKeyType(Buffer.from('movie:1')); when(standaloneClient.sendCommand) .calledWith(['FT._LIST']) .mockResolvedValue([Buffer.from('idx:movie')]); @@ -230,5 +255,34 @@ describe('KeyIndexesService', () => { expect(result.indexes).toHaveLength(1); expect(result.indexes[0].name).toBe('idx:movie'); }); + + it('should not match an index of a different key type', async () => { + mockKeyType('movie:1', RedisDataType.JSON); + when(standaloneClient.sendCommand) + .calledWith(['FT._LIST']) + .mockResolvedValue([Buffer.from('idx:movie')]); + when(standaloneClient.sendCommand) + .calledWith(['FT.INFO', 'idx:movie'], expect.anything()) + .mockResolvedValue(mockMovieInfoRaw); + + const result = await service.getKeyIndexes(mockBrowserClientMetadata, { + key: 'movie:1', + }); + + expect(result.indexes).toHaveLength(0); + }); + + it('should return empty for unsupported key types without listing indexes', async () => { + mockKeyType('mylist', RedisDataType.List); + + const result = await service.getKeyIndexes(mockBrowserClientMetadata, { + key: 'mylist', + }); + + expect(result.indexes).toHaveLength(0); + expect(standaloneClient.sendCommand).not.toHaveBeenCalledWith([ + 'FT._LIST', + ]); + }); }); }); diff --git a/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.ts b/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.ts index 2cfca265e4..1227a5a74c 100644 --- a/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.ts +++ b/redisinsight/api/src/modules/browser/redisearch/key-indexes.service.ts @@ -5,6 +5,7 @@ import { ClientMetadata } from 'src/common/models'; import { plainToInstance } from 'class-transformer'; import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory'; import { RedisClient } from 'src/modules/redis/client'; +import { RedisDataType } from 'src/modules/browser/keys/dto'; import { IndexInfoDto, IndexSummaryDto, @@ -19,6 +20,12 @@ interface IndexEntry { info: IndexInfoDto; } +// Redis TYPE reply -> FT.INFO key_type +const REDIS_TYPE_TO_INDEX_KEY_TYPE: Record = { + [RedisDataType.Hash]: 'HASH', + [RedisDataType.JSON]: 'JSON', +}; + @Injectable() export class KeyIndexesService { private logger = new Logger('KeyIndexesService'); @@ -26,7 +33,7 @@ export class KeyIndexesService { constructor(private databaseClientFactory: DatabaseClientFactory) {} /** - * Find all indexes whose prefixes cover the given key. + * Find all indexes whose key_type and prefixes cover the given key. * An index with no prefixes matches all keys of its key_type. */ public async getKeyIndexes( @@ -42,9 +49,22 @@ export class KeyIndexesService { const client: RedisClient = await this.databaseClientFactory.getOrCreateClient(clientMetadata); + const keyType = (await client.sendCommand(['TYPE', key], { + replyEncoding: 'utf8', + })) as string; + const targetKeyType = REDIS_TYPE_TO_INDEX_KEY_TYPE[keyType]; + + if (!targetKeyType) { + return plainToInstance(KeyIndexesResponse, { indexes: [] }); + } + const indexNames = await this.listIndexNames(client); const entries = await this.fetchIndexesInfo(client, indexNames); - const matchingIndexes = this.findMatchingIndexes(keyStr, entries); + const matchingIndexes = this.findMatchingIndexes( + keyStr, + targetKeyType, + entries, + ); return plainToInstance(KeyIndexesResponse, { indexes: matchingIndexes }); } catch (e) { @@ -93,6 +113,7 @@ export class KeyIndexesService { private findMatchingIndexes( keyStr: string, + targetKeyType: string, entries: IndexEntry[], ): IndexSummaryDto[] { const matching: IndexSummaryDto[] = []; @@ -107,7 +128,8 @@ export class KeyIndexesService { const { prefixes = [], key_type: keyType = '' } = definition; const isMatch = - prefixes.length === 0 || prefixes.some((p) => keyStr.startsWith(p)); + keyType.toUpperCase() === targetKeyType && + (prefixes.length === 0 || prefixes.some((p) => keyStr.startsWith(p))); if (isMatch) { matching.push( diff --git a/redisinsight/api/src/modules/browser/utils/redisIndexInfo.spec.ts b/redisinsight/api/src/modules/browser/utils/redisIndexInfo.spec.ts new file mode 100644 index 0000000000..45191ce139 --- /dev/null +++ b/redisinsight/api/src/modules/browser/utils/redisIndexInfo.spec.ts @@ -0,0 +1,134 @@ +import { + convertArrayReplyToObject, + convertIndexInfoAttributeReply, + convertIndexInfoReply, +} from './redisIndexInfo'; + +describe('redisIndexInfo', () => { + describe('convertIndexInfoAttributeReply', () => { + it('parses key/value pairs and trailing boolean flags', () => { + expect( + convertIndexInfoAttributeReply([ + 'identifier', + '$.chunkText', + 'attribute', + 'chunkText_trie', + 'type', + 'TEXT', + 'WEIGHT', + '1', + 'WITHSUFFIXTRIE', + ]), + ).toEqual({ + identifier: '$.chunkText', + attribute: 'chunkText_trie', + type: 'TEXT', + WEIGHT: '1', + WITHSUFFIXTRIE: true, + }); + }); + + it('does not treat a field alias named like a flag as enabling that flag', () => { + expect( + convertIndexInfoAttributeReply([ + 'identifier', + '$.chunkText', + 'attribute', + 'WITHSUFFIXTRIE', + 'type', + 'TEXT', + 'WEIGHT', + '1', + ]), + ).toEqual({ + identifier: '$.chunkText', + attribute: 'WITHSUFFIXTRIE', + type: 'TEXT', + WEIGHT: '1', + }); + }); + + it('enables the flag when both alias and option use the same token', () => { + expect( + convertIndexInfoAttributeReply([ + 'identifier', + '$.chunkText', + 'attribute', + 'WITHSUFFIXTRIE', + 'type', + 'TEXT', + 'WITHSUFFIXTRIE', + ]), + ).toEqual({ + identifier: '$.chunkText', + attribute: 'WITHSUFFIXTRIE', + type: 'TEXT', + WITHSUFFIXTRIE: true, + }); + }); + + it('parses interleaved boolean flags among valued keys', () => { + expect( + convertIndexInfoAttributeReply([ + 'identifier', + 'title', + 'attribute', + 'title', + 'type', + 'TEXT', + 'SORTABLE', + 'NOSTEM', + 'WEIGHT', + '2', + ]), + ).toEqual({ + identifier: 'title', + attribute: 'title', + type: 'TEXT', + SORTABLE: true, + NOSTEM: true, + WEIGHT: '2', + }); + }); + + it('returns empty object for non-arrays', () => { + expect(convertIndexInfoAttributeReply(null as any)).toEqual({}); + expect(convertIndexInfoAttributeReply(undefined as any)).toEqual({}); + expect(convertIndexInfoAttributeReply({} as any)).toEqual({}); + }); + }); + + describe('convertIndexInfoReply', () => { + it('maps attributes with boolean flags', () => { + const result = convertIndexInfoReply([ + 'index_name', + 'idx', + 'attributes', + [ + [ + 'identifier', + '$.a', + 'attribute', + 'a', + 'type', + 'TEXT', + 'WITHSUFFIXTRIE', + ], + ['identifier', '$.b', 'attribute', 'WITHSUFFIXTRIE', 'type', 'TEXT'], + ], + ] as any) as any; + + expect(result.attributes[0].WITHSUFFIXTRIE).toBe(true); + expect(result.attributes[1].attribute).toBe('WITHSUFFIXTRIE'); + expect(result.attributes[1].WITHSUFFIXTRIE).toBeUndefined(); + }); + }); + + describe('convertArrayReplyToObject', () => { + it('chunks key/value pairs', () => { + expect(convertArrayReplyToObject(['key', 'value'])).toEqual({ + key: 'value', + }); + }); + }); +}); diff --git a/redisinsight/api/src/modules/browser/utils/redisIndexInfo.ts b/redisinsight/api/src/modules/browser/utils/redisIndexInfo.ts index 250a91005d..b3f2d560fc 100644 --- a/redisinsight/api/src/modules/browser/utils/redisIndexInfo.ts +++ b/redisinsight/api/src/modules/browser/utils/redisIndexInfo.ts @@ -12,6 +12,23 @@ const infoFieldsToConvert = [ errorField, ]; +/** + * Valueless FT.INFO attribute flags. These appear as standalone tokens in the + * attribute array (not as key/value pairs), so they must only be matched when + * the parser is expecting a key — never via array.includes(), which false-positives + * when a field identifier/alias is literally named the same as a flag. + */ +export const INDEX_INFO_ATTRIBUTE_BOOLEAN_FLAGS = [ + 'SORTABLE', + 'NOINDEX', + 'CASESENSITIVE', + 'UNF', + 'NOSTEM', + 'WITHSUFFIXTRIE', + 'INDEXEMPTY', + 'INDEXMISSING', +] as const; + export const convertArrayReplyToObject = ( input: ArrayReplyEntry[], ): { [key: string]: any } => { @@ -25,14 +42,27 @@ export const convertArrayReplyToObject = ( }; export const convertIndexInfoAttributeReply = (input: string[]): object => { - const attribute = convertArrayReplyToObject(input); + if (!isArray(input)) { + return {}; + } + + const attribute: Record = {}; + let i = 0; + + while (i < input.length) { + const token = input[i]; + + if ( + typeof token === 'string' && + (INDEX_INFO_ATTRIBUTE_BOOLEAN_FLAGS as readonly string[]).includes(token) + ) { + attribute[token] = true; + i += 1; + continue; + } - if (isArray(input)) { - attribute['SORTABLE'] = input.includes('SORTABLE') || undefined; - attribute['NOINDEX'] = input.includes('NOINDEX') || undefined; - attribute['CASESENSITIVE'] = input.includes('CASESENSITIVE') || undefined; - attribute['UNF'] = input.includes('UNF') || undefined; - attribute['NOSTEM'] = input.includes('NOSTEM') || undefined; + attribute[token as string] = input[i + 1]; + i += 2; } return attribute; diff --git a/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.spec.ts b/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.spec.ts index 30a7219d19..c1d078e67c 100644 --- a/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.spec.ts +++ b/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.spec.ts @@ -346,6 +346,25 @@ describe('CloudAuthService', () => { ).rejects.toThrow(CloudOauthUnknownAuthorizationRequestException); }); }); + describe('logout', () => { + it('should delete the local session before revoking the refresh token', async () => { + mockedAxios.post.mockResolvedValueOnce({ data: undefined }); + + await service.logout(mockSessionMetadata); + + expect(sessionService.deleteSessionData).toHaveBeenCalledWith( + mockSessionMetadata.sessionId, + ); + expect(mockedAxios.post).toHaveBeenCalled(); + // a slow remote revocation must not race a concurrent sign-in, so the + // local session is cleared before the revoke call + const deleteOrder = + sessionService.deleteSessionData.mock.invocationCallOrder[0]; + const revokeOrder = mockedAxios.post.mock.invocationCallOrder[0]; + expect(deleteOrder).toBeLessThan(revokeOrder); + }); + }); + describe('revokeRefreshToken', () => { let spy; diff --git a/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.ts b/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.ts index 9c34cd0b11..5b9b2d14ec 100644 --- a/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.ts +++ b/redisinsight/api/src/modules/cloud/auth/cloud-auth.service.ts @@ -9,6 +9,7 @@ import { import { CloudAuthStrategy } from 'src/modules/cloud/auth/auth-strategy/cloud-auth.strategy'; import { SessionMetadata } from 'src/common/models'; import { CloudSessionService } from 'src/modules/cloud/session/cloud-session.service'; +import { CloudSession } from 'src/modules/cloud/session/models/cloud-session'; import { GithubIdpCloudAuthStrategy } from 'src/modules/cloud/auth/auth-strategy/github-idp.cloud.auth-strategy'; import { SsoIdpCloudAuthStrategy } from 'src/modules/cloud/auth/auth-strategy/sso-idp.cloud.auth-strategy'; import { wrapHttpError } from 'src/common/utils'; @@ -253,11 +254,12 @@ export class CloudAuthService { private async revokeRefreshToken( sessionMetadata: SessionMetadata, + capturedSession?: CloudSession, ): Promise { try { - const session = await this.sessionService.getSession( - sessionMetadata.sessionId, - ); + const session = + capturedSession ?? + (await this.sessionService.getSession(sessionMetadata.sessionId)); if (!session?.refreshToken) { return; } @@ -383,10 +385,17 @@ export class CloudAuthService { try { this.logger.debug('Logout cloud user', sessionMetadata); - await this.revokeRefreshToken(sessionMetadata); + // clear the local session first, then revoke with the captured token: a + // slow remote revocation must not delete a session that a concurrent + // sign-in may have re-credentialed in the meantime + const session = await this.sessionService.getSession( + sessionMetadata.sessionId, + ); await this.sessionService.deleteSessionData(sessionMetadata.sessionId); + await this.revokeRefreshToken(sessionMetadata, session); + this.eventEmitter.emit(CloudAuthServerEvent.Logout, sessionMetadata); } catch (e) { this.logger.error('Unable to logout', e, sessionMetadata); diff --git a/redisinsight/api/src/modules/cloud/common/constants/index.ts b/redisinsight/api/src/modules/cloud/common/constants/index.ts index b3c34b6ff1..ec60fc5c9e 100644 --- a/redisinsight/api/src/modules/cloud/common/constants/index.ts +++ b/redisinsight/api/src/modules/cloud/common/constants/index.ts @@ -5,3 +5,15 @@ export enum CloudAuthServerEvent { export enum CloudJobEvents { Monitor = 'cloud:job:monitor', } + +// Error codes returned by the Redis Cloud API in response.data.errors.code +export enum CloudApiErrorCodes { + MfaRequired = 'user-mfa-required', + MfaInvalidCode = 'mfa-invalid-code', + MfaQuotaExceeded = 'mfa-quota-exceeded', +} + +// mfa_type value expected by the Redis Cloud API login endpoint (SMS is deprecated) +export enum CloudApiMfaType { + Totp = 'Totp', +} diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/__tests__/cloud-api-error.factory.ts b/redisinsight/api/src/modules/cloud/common/exceptions/__tests__/cloud-api-error.factory.ts new file mode 100644 index 0000000000..065bd825f6 --- /dev/null +++ b/redisinsight/api/src/modules/cloud/common/exceptions/__tests__/cloud-api-error.factory.ts @@ -0,0 +1,35 @@ +import { Factory } from 'fishery'; +import { faker } from '@faker-js/faker'; +import { AxiosError } from 'axios'; +import { CloudApiMfaFactors } from 'src/modules/cloud/common/exceptions/cloud-api.mfa-required.exception'; + +export const cloudApiMfaFactorsFactory = Factory.define( + () => ({ + phoneNumber: faker.phone.number(), + smsFactorAvailable: false, + totpFactorAvailable: true, + }), +); + +/** + * Builds the AxiosError shape that `wrapCloudApiError` inspects for a given + * status and response body. + */ +export const buildCloudApiError = ( + status: number, + data: unknown = null, +): AxiosError => + ({ + name: '', + message: `Request failed with status code ${status}`, + isAxiosError: true, + config: null, + response: { + statusText: '', + data, + headers: {}, + config: null, + status, + }, + toJSON: () => null, + }) as unknown as AxiosError; diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.spec.ts b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.spec.ts new file mode 100644 index 0000000000..233ab602c7 --- /dev/null +++ b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.spec.ts @@ -0,0 +1,116 @@ +import { AxiosError } from 'axios'; +import { HttpStatus } from '@nestjs/common'; +import { CustomErrorCodes } from 'src/constants'; +import { + CloudApiBadRequestException, + CloudApiForbiddenException, + CloudApiInternalServerErrorException, + CloudApiMfaInvalidCodeException, + CloudApiMfaQuotaExceededException, + CloudApiMfaRequiredException, + CloudApiNotFoundException, + CloudApiUnauthorizedException, + wrapCloudApiError, +} from 'src/modules/cloud/common/exceptions'; +import { + buildCloudApiError, + cloudApiMfaFactorsFactory, +} from 'src/modules/cloud/common/exceptions/__tests__/cloud-api-error.factory'; + +describe('wrapCloudApiError', () => { + it('should return the error untouched when it is already an HttpException', () => { + const error = new CloudApiNotFoundException(); + + expect(wrapCloudApiError(error as unknown as AxiosError)).toBe(error); + }); + + test.each([ + [400, CloudApiBadRequestException], + [401, CloudApiUnauthorizedException], + [403, CloudApiForbiddenException], + [404, CloudApiNotFoundException], + [429, CloudApiInternalServerErrorException], + [500, CloudApiInternalServerErrorException], + ])('should map status %i by default', (status, exception) => { + expect(wrapCloudApiError(buildCloudApiError(status))).toBeInstanceOf( + exception, + ); + }); + + describe('mfa errors', () => { + it('should map user-mfa-required to CloudApiMfaRequiredException with parsed factors', () => { + const factors = cloudApiMfaFactorsFactory.build(); + const error = wrapCloudApiError( + buildCloudApiError(401, { + errors: { + code: 'user-mfa-required', + params: JSON.stringify(factors), + }, + }), + ); + + expect(error).toBeInstanceOf(CloudApiMfaRequiredException); + expect(error.getResponse()).toMatchObject({ + statusCode: HttpStatus.UNAUTHORIZED, + errorCode: CustomErrorCodes.CloudApiMfaRequired, + factors, + }); + }); + + it('should map user-mfa-required without factors when params are not valid JSON', () => { + const error = wrapCloudApiError( + buildCloudApiError(401, { + errors: { code: 'user-mfa-required', params: 'not-json' }, + }), + ); + + expect(error).toBeInstanceOf(CloudApiMfaRequiredException); + const response = error.getResponse() as Record; + expect(response).toMatchObject({ + errorCode: CustomErrorCodes.CloudApiMfaRequired, + }); + expect(response.factors).toBeUndefined(); + }); + + test.each([401, 429])( + 'should map mfa-quota-exceeded to CloudApiMfaQuotaExceededException regardless of status (%i)', + (status) => { + const error = wrapCloudApiError( + buildCloudApiError(status, { + errors: { code: 'mfa-quota-exceeded' }, + }), + ); + + expect(error).toBeInstanceOf(CloudApiMfaQuotaExceededException); + expect(error.getResponse()).toMatchObject({ + statusCode: HttpStatus.TOO_MANY_REQUESTS, + errorCode: CustomErrorCodes.CloudApiMfaQuotaExceeded, + }); + }, + ); + + it('should map mfa-invalid-code to CloudApiMfaInvalidCodeException', () => { + const error = wrapCloudApiError( + buildCloudApiError(400, { + errors: { code: 'mfa-invalid-code' }, + }), + ); + + expect(error).toBeInstanceOf(CloudApiMfaInvalidCodeException); + expect(error.getResponse()).toMatchObject({ + statusCode: HttpStatus.BAD_REQUEST, + errorCode: CustomErrorCodes.CloudApiMfaInvalidCode, + }); + }); + + it('should keep default status mapping for unknown cloud error codes', () => { + const error = wrapCloudApiError( + buildCloudApiError(401, { + errors: { code: 'some-other-error' }, + }), + ); + + expect(error).toBeInstanceOf(CloudApiUnauthorizedException); + }); + }); +}); diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.ts b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.ts index 875b92fe51..a991d09caf 100644 --- a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.ts +++ b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.error.handler.ts @@ -1,11 +1,27 @@ import { AxiosError } from 'axios'; import { HttpException } from '@nestjs/common'; +import { CloudApiErrorCodes } from 'src/modules/cloud/common/constants'; import { CloudApiUnauthorizedException } from 'src/modules/cloud/common/exceptions/cloud-api.unauthorized.exception'; +import { + CloudApiMfaFactors, + CloudApiMfaRequiredException, +} from 'src/modules/cloud/common/exceptions/cloud-api.mfa-required.exception'; +import { CloudApiMfaInvalidCodeException } from 'src/modules/cloud/common/exceptions/cloud-api.mfa-invalid-code.exception'; +import { CloudApiMfaQuotaExceededException } from 'src/modules/cloud/common/exceptions/cloud-api.mfa-quota-exceeded.exception'; import { CloudApiForbiddenException } from 'src/modules/cloud/common/exceptions/cloud-api.forbidden.exception'; import { CloudApiBadRequestException } from 'src/modules/cloud/common/exceptions/cloud-api.bad-request.exception'; import { CloudApiNotFoundException } from 'src/modules/cloud/common/exceptions/cloud-api.not-found.exception'; import { CloudApiInternalServerErrorException } from 'src/modules/cloud/common/exceptions/cloud-api.internal-server-error.exception'; +// the cloud api serializes mfa factor availability as a JSON string in errors.params +const parseMfaFactors = (params: unknown): CloudApiMfaFactors | undefined => { + try { + return JSON.parse(String(params)); + } catch { + return undefined; + } +}; + export const wrapCloudApiError = ( error: AxiosError, message?: string, @@ -24,6 +40,22 @@ export const wrapCloudApiError = ( if (response) { const errorOptions = { cause: response?.data }; + + // cloud error codes take precedence over the http status + switch ((response.data as any)?.errors?.code) { + case CloudApiErrorCodes.MfaRequired: + return new CloudApiMfaRequiredException( + undefined, + errorOptions, + parseMfaFactors((response.data as any).errors.params), + ); + case CloudApiErrorCodes.MfaInvalidCode: + return new CloudApiMfaInvalidCodeException(undefined, errorOptions); + case CloudApiErrorCodes.MfaQuotaExceeded: + return new CloudApiMfaQuotaExceededException(undefined, errorOptions); + default: + break; + } switch (response?.status) { case 401: return new CloudApiUnauthorizedException(errorMessage, errorOptions); diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-invalid-code.exception.ts b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-invalid-code.exception.ts new file mode 100644 index 0000000000..7cd1361927 --- /dev/null +++ b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-invalid-code.exception.ts @@ -0,0 +1,23 @@ +import { + HttpException, + HttpExceptionOptions, + HttpStatus, +} from '@nestjs/common'; +import { CustomErrorCodes } from 'src/constants'; +import ERROR_MESSAGES from 'src/constants/error-messages'; + +export class CloudApiMfaInvalidCodeException extends HttpException { + constructor( + message = ERROR_MESSAGES.CLOUD_MFA_INVALID_CODE, + options?: HttpExceptionOptions, + ) { + const response = { + message, + statusCode: HttpStatus.BAD_REQUEST, + error: 'CloudApiMfaInvalidCode', + errorCode: CustomErrorCodes.CloudApiMfaInvalidCode, + }; + + super(response, response.statusCode, options); + } +} diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-quota-exceeded.exception.ts b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-quota-exceeded.exception.ts new file mode 100644 index 0000000000..a42f178d24 --- /dev/null +++ b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-quota-exceeded.exception.ts @@ -0,0 +1,23 @@ +import { + HttpException, + HttpExceptionOptions, + HttpStatus, +} from '@nestjs/common'; +import { CustomErrorCodes } from 'src/constants'; +import ERROR_MESSAGES from 'src/constants/error-messages'; + +export class CloudApiMfaQuotaExceededException extends HttpException { + constructor( + message = ERROR_MESSAGES.CLOUD_MFA_QUOTA_EXCEEDED, + options?: HttpExceptionOptions, + ) { + const response = { + message, + statusCode: HttpStatus.TOO_MANY_REQUESTS, + error: 'CloudApiMfaQuotaExceeded', + errorCode: CustomErrorCodes.CloudApiMfaQuotaExceeded, + }; + + super(response, response.statusCode, options); + } +} diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-required.exception.ts b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-required.exception.ts new file mode 100644 index 0000000000..f19d96df72 --- /dev/null +++ b/redisinsight/api/src/modules/cloud/common/exceptions/cloud-api.mfa-required.exception.ts @@ -0,0 +1,34 @@ +import { + HttpException, + HttpExceptionOptions, + HttpStatus, +} from '@nestjs/common'; +import { CustomErrorCodes } from 'src/constants'; +import ERROR_MESSAGES from 'src/constants/error-messages'; + +export interface CloudApiMfaFactors { + totpFactorAvailable?: boolean; + smsFactorAvailable?: boolean; + phoneNumber?: string; +} + +export class CloudApiMfaRequiredException extends HttpException { + // JSESSIONID set by the challenge response; not exposed to the client + apiSessionId?: string; + + constructor( + message = ERROR_MESSAGES.CLOUD_MFA_REQUIRED, + options?: HttpExceptionOptions, + factors?: CloudApiMfaFactors, + ) { + const response = { + message, + statusCode: HttpStatus.UNAUTHORIZED, + error: 'CloudApiMfaRequired', + errorCode: CustomErrorCodes.CloudApiMfaRequired, + factors, + }; + + super(response, response.statusCode, options); + } +} diff --git a/redisinsight/api/src/modules/cloud/common/exceptions/index.ts b/redisinsight/api/src/modules/cloud/common/exceptions/index.ts index 3a57ebadd5..c5b5759236 100644 --- a/redisinsight/api/src/modules/cloud/common/exceptions/index.ts +++ b/redisinsight/api/src/modules/cloud/common/exceptions/index.ts @@ -1,4 +1,7 @@ export * from './cloud-api.unauthorized.exception'; +export * from './cloud-api.mfa-required.exception'; +export * from './cloud-api.mfa-invalid-code.exception'; +export * from './cloud-api.mfa-quota-exceeded.exception'; export * from './cloud-api.bad-request.exception'; export * from './cloud-api.forbidden.exception'; export * from './cloud-api.internal-server-error.exception'; diff --git a/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.spec.ts b/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.spec.ts index 718a0e32b7..98c4a03e8b 100644 --- a/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.spec.ts +++ b/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.spec.ts @@ -13,6 +13,8 @@ import { CloudSessionService } from 'src/modules/cloud/session/cloud-session.ser import { CloudUserApiProvider } from 'src/modules/cloud/user/providers/cloud-user.api.provider'; import { CloudApiForbiddenException, + CloudApiMfaQuotaExceededException, + CloudApiMfaRequiredException, CloudApiUnauthorizedException, } from 'src/modules/cloud/common/exceptions'; import { CloudAuthIdpType } from 'src/modules/cloud/auth/models'; @@ -169,6 +171,24 @@ describe('CloudApiProvider', () => { ).rejects.toBeInstanceOf(CloudApiForbiddenException); expect(sessionService.invalidateApiSession).toHaveBeenCalledTimes(0); }); + // no retry on MFA errors: a retry re-fires /login and burns the server-side MFA attempt quota, + // and the session must be kept so the pending login can be completed with a TOTP code + it('should not retry and keep session on CloudApiMfaRequiredException', async () => { + mockedFn.mockRejectedValueOnce(new CloudApiMfaRequiredException()); + await expect( + service.callWithAuthRetry(mockSessionMetadata.sessionId, mockedFn), + ).rejects.toBeInstanceOf(CloudApiMfaRequiredException); + expect(mockedFn).toHaveBeenCalledTimes(1); + expect(sessionService.invalidateApiSession).toHaveBeenCalledTimes(0); + }); + it('should not retry and keep session on CloudApiMfaQuotaExceededException', async () => { + mockedFn.mockRejectedValueOnce(new CloudApiMfaQuotaExceededException()); + await expect( + service.callWithAuthRetry(mockSessionMetadata.sessionId, mockedFn), + ).rejects.toBeInstanceOf(CloudApiMfaQuotaExceededException); + expect(mockedFn).toHaveBeenCalledTimes(1); + expect(sessionService.invalidateApiSession).toHaveBeenCalledTimes(0); + }); it('should throw CloudApiForbiddenException error from 2nd attempt (by default)', async () => { mockedFn.mockRejectedValueOnce(new CloudApiUnauthorizedException()); mockedFn.mockRejectedValueOnce(new CloudApiUnauthorizedException()); diff --git a/redisinsight/api/src/modules/cloud/session/models/cloud-session.ts b/redisinsight/api/src/modules/cloud/session/models/cloud-session.ts index 39b04aa43c..e135a0b045 100644 --- a/redisinsight/api/src/modules/cloud/session/models/cloud-session.ts +++ b/redisinsight/api/src/modules/cloud/session/models/cloud-session.ts @@ -21,6 +21,11 @@ export class CloudSession { @Expose() apiSessionId?: string; + // session id set by an mfa-challenged login; the mfa_code re-login must + // reuse it so the cloud api can correlate the pending challenge + @Expose() + mfaApiSessionId?: string; + @Expose() user?: CloudUser; } diff --git a/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.spec.ts b/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.spec.ts index 427e9ee6a6..6ae18bb78b 100644 --- a/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.spec.ts +++ b/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.spec.ts @@ -21,6 +21,8 @@ import { import { when, resetAllWhenMocks } from 'jest-when'; import { CloudApiInternalServerErrorException, + CloudApiMfaQuotaExceededException, + CloudApiMfaRequiredException, CloudApiUnauthorizedException, } from 'src/modules/cloud/common/exceptions'; import { CloudUserApiService } from 'src/modules/cloud/user/cloud-user.api.service'; @@ -249,6 +251,39 @@ describe('CloudUserApiService', () => { it('Should throw CloudApiUnauthorizedException error if there is no session', async () => { sessionService.getSession.mockResolvedValueOnce(null); + await expect( + service['ensureAccessToken'](mockSessionMetadata), + ).rejects.toThrow(CloudApiUnauthorizedException); + expect(authService.renewTokens).not.toHaveBeenCalled(); + }); + it('Should proceed without renewing when the token is within the renewal buffer, still unexpired, and there is no refresh token', async () => { + // exp within the 2-min proactive-renewal buffer but not yet expired + const mockedAccessToken = sign( + { exp: Math.trunc(Date.now() / 1000) + 60 }, + 'test', + ); + sessionService.getSession.mockResolvedValueOnce({ + ...mockCloudApiAuthDto, + accessToken: mockedAccessToken, + refreshToken: undefined, + }); + + await expect( + service['ensureAccessToken'](mockSessionMetadata), + ).resolves.toEqual(undefined); + expect(authService.renewTokens).not.toHaveBeenCalled(); + }); + it('Should throw when the token is actually expired and there is no refresh token', async () => { + const mockedAccessToken = sign( + { exp: Math.trunc(Date.now() / 1000) - 60 }, + 'test', + ); + sessionService.getSession.mockResolvedValueOnce({ + ...mockCloudApiAuthDto, + accessToken: mockedAccessToken, + refreshToken: undefined, + }); + await expect( service['ensureAccessToken'](mockSessionMetadata), ).rejects.toThrow(CloudApiUnauthorizedException); @@ -422,6 +457,42 @@ describe('CloudUserApiService', () => { expect.anything(), ); }); + it('should store the challenge session id when login is challenged for mfa', async () => { + when(mockedAxios.post) + .calledWith('login', expect.anything(), expect.anything()) + .mockRejectedValueOnce({ + message: 'Request failed with status code 401', + isAxiosError: true, + response: { + status: 401, + data: { + errors: { + code: 'user-mfa-required', + params: '{"totpFactorAvailable":true}', + }, + }, + headers: { + 'set-cookie': [ + 'anything;JSESSIONID=pending-mfa-session;anything;', + ], + }, + }, + }); + sessionService.getSession.mockResolvedValueOnce({ + ...mockCloudSession, + apiSessionId: null, + }); + + await expect( + service['ensureLogin'](mockSessionMetadata), + ).rejects.toBeInstanceOf(CloudApiMfaRequiredException); + expect(sessionService.updateSessionData).toHaveBeenCalledWith( + mockSessionMetadata.sessionId, + { + mfaApiSessionId: 'pending-mfa-session', + }, + ); + }); it('should throw unauthorized error when no session id successfully fetched', async () => { when(mockedAxios.post) .calledWith('login', expect.anything(), expect.anything()) @@ -473,6 +544,144 @@ describe('CloudUserApiService', () => { }); }); + describe('verifyMfaCode', () => { + let spyEnsureAccessToken: jest.SpyInstance; + let spyEnsureCsrf: jest.SpyInstance; + + const mockMfaLoginAxiosError = (data: unknown) => ({ + message: 'Request failed with status code 401', + isAxiosError: true, + response: { status: 401, data }, + }); + + beforeEach(async () => { + spyEnsureAccessToken = jest.spyOn(service as any, 'ensureAccessToken'); + spyEnsureAccessToken.mockResolvedValue(undefined); + spyEnsureCsrf = jest.spyOn(service as any, 'ensureCsrf'); + spyEnsureCsrf.mockResolvedValue(undefined); + when(mockedAxios.post) + .calledWith('login', expect.anything(), expect.anything()) + .mockResolvedValue({ + status: 200, + headers: { + 'set-cookie': [ + `anything;JSESSIONID=${mockCloudApiAuthDto.apiSessionId};anything;`, + ], + }, + }); + sessionService.getSession.mockResolvedValueOnce({ + ...mockCloudSession, + apiSessionId: null, + }); + }); + + it('should re-login with mfa_code and mfa_type and store apiSessionId', async () => { + expect( + await service.verifyMfaCode(mockSessionMetadata, '123456'), + ).toEqual(undefined); + expect(spyEnsureAccessToken).toHaveBeenCalledTimes(1); + expect(spyEnsureCsrf).toHaveBeenCalledTimes(1); + expect(mockedAxios.post).toHaveBeenCalledTimes(1); + expect(mockedAxios.post).toHaveBeenNthCalledWith( + 1, + 'login', + expect.objectContaining({ + mfa_code: '123456', + mfa_type: 'Totp', + }), + expect.anything(), + ); + expect(sessionService.updateSessionData).toHaveBeenCalledWith( + mockSessionMetadata.sessionId, + { + apiSessionId: mockCloudApiAuthDto.apiSessionId, + mfaApiSessionId: null, + }, + ); + }); + it('should still submit the code when an apiSessionId is already set (no silent skip)', async () => { + sessionService.getSession.mockReset(); + sessionService.getSession.mockResolvedValue({ + ...mockCloudSession, + apiSessionId: 'stale-session-id', + }); + + expect( + await service.verifyMfaCode(mockSessionMetadata, '123456'), + ).toEqual(undefined); + // the /login must still fire with the code, not be short-circuited + expect(mockedAxios.post).toHaveBeenNthCalledWith( + 1, + 'login', + expect.objectContaining({ + mfa_code: '123456', + mfa_type: 'Totp', + }), + expect.anything(), + ); + }); + it('should send the challenge cookie and keep its session id when no new cookie is returned', async () => { + sessionService.getSession.mockReset(); + sessionService.getSession.mockResolvedValueOnce({ + ...mockCloudSession, + apiSessionId: null, + mfaApiSessionId: 'pending-mfa-session', + }); + when(mockedAxios.post) + .calledWith('login', expect.anything(), expect.anything()) + .mockResolvedValue({ status: 200, headers: {} }); + + expect( + await service.verifyMfaCode(mockSessionMetadata, '123456'), + ).toEqual(undefined); + expect(mockedAxios.post).toHaveBeenNthCalledWith( + 1, + 'login', + expect.objectContaining({ mfa_code: '123456' }), + expect.objectContaining({ + headers: expect.objectContaining({ + cookie: 'JSESSIONID=pending-mfa-session', + }), + }), + ); + expect(sessionService.updateSessionData).toHaveBeenCalledWith( + mockSessionMetadata.sessionId, + { + apiSessionId: 'pending-mfa-session', + mfaApiSessionId: null, + }, + ); + }); + it('should throw CloudApiMfaRequiredException when the code is rejected', async () => { + when(mockedAxios.post) + .calledWith('login', expect.anything(), expect.anything()) + .mockRejectedValueOnce( + mockMfaLoginAxiosError({ + errors: { code: 'user-mfa-required', params: '{}' }, + }), + ); + + await expect( + service.verifyMfaCode(mockSessionMetadata, '000000'), + ).rejects.toBeInstanceOf(CloudApiMfaRequiredException); + expect(sessionService.updateSessionData).not.toHaveBeenCalled(); + }); + it('should throw CloudApiMfaQuotaExceededException when the attempt quota is exhausted', async () => { + when(mockedAxios.post) + .calledWith('login', expect.anything(), expect.anything()) + .mockRejectedValueOnce( + mockMfaLoginAxiosError({ + errors: { code: 'mfa-quota-exceeded' }, + }), + ); + + await expect( + service.verifyMfaCode(mockSessionMetadata, '111111'), + ).rejects.toBeInstanceOf(CloudApiMfaQuotaExceededException); + expect(sessionService.updateSessionData).not.toHaveBeenCalled(); + }); + }); + describe('ensureCloudUser', () => { let spy; diff --git a/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.ts b/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.ts index a703008957..1b1f67b539 100644 --- a/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.ts +++ b/redisinsight/api/src/modules/cloud/user/cloud-user.api.service.ts @@ -5,13 +5,16 @@ import { CloudUserRepository } from 'src/modules/cloud/user/repositories/cloud-u import { CloudUser, CloudUserAccount } from 'src/modules/cloud/user/models'; import { CloudSessionService } from 'src/modules/cloud/session/cloud-session.service'; import { wrapHttpError } from 'src/common/utils'; -import { CloudApiUnauthorizedException } from 'src/modules/cloud/common/exceptions'; +import { + CloudApiMfaRequiredException, + CloudApiUnauthorizedException, +} from 'src/modules/cloud/common/exceptions'; import { CloudUserApiProvider } from 'src/modules/cloud/user/providers/cloud-user.api.provider'; import { CloudRequestUtm } from 'src/modules/cloud/common/models'; import { CloudAuthService } from 'src/modules/cloud/auth/cloud-auth.service'; import { CloudSession } from 'src/modules/cloud/session/models/cloud-session'; import { ServerService } from 'src/modules/server/server.service'; -import { isValidToken } from './utils'; +import { isTokenExpired, isValidToken } from './utils'; @Injectable() export class CloudUserApiService { @@ -76,16 +79,19 @@ export class CloudUserApiService { ); if (!isValidToken(session?.accessToken)) { - if (!session?.refreshToken) { + if (session?.refreshToken) { + await this.cloudAuthService.renewTokens( + sessionMetadata, + session?.idpType, + session?.refreshToken, + ); + } else if (isTokenExpired(session?.accessToken)) { this.logger.error('Refresh token is undefined'); throw new CloudApiUnauthorizedException(); } - - await this.cloudAuthService.renewTokens( - sessionMetadata, - session?.idpType, - session?.refreshToken, - ); + // within the proactive-renewal buffer but still unexpired and no refresh + // token to renew with: proceed with the current token. Covers the MFA + // login where the human delay entering the code crosses the buffer. } } catch (e) { this.logger.error('Error trying renew token', e); @@ -97,11 +103,13 @@ export class CloudUserApiService { * Login user to api using accessToken from oauth flow * @param sessionMetadata * @param utm + * @param mfaCode * @private */ private async ensureLogin( sessionMetadata: SessionMetadata, utm?: CloudRequestUtm, + mfaCode?: string, ): Promise { try { await this.ensureAccessToken(sessionMetadata); @@ -110,7 +118,9 @@ export class CloudUserApiService { sessionMetadata.sessionId, ); - if (!session?.apiSessionId) { + // an mfa code must always be submitted via /login: a stale apiSessionId + // must not short-circuit the verification into a false success + if (!session?.apiSessionId || mfaCode) { this.logger.debug('Trying to login user', sessionMetadata); const preparedUtm = utm && { ...utm }; @@ -130,10 +140,16 @@ export class CloudUserApiService { }); } - const apiSessionId = await this.api.getApiSessionId( - session, - preparedUtm, - ); + const apiSessionId = + (await this.api.getApiSessionId( + mfaCode + ? { ...session, apiSessionId: session?.mfaApiSessionId } + : session, + preparedUtm, + mfaCode, + )) || + // the mfa re-login reuses the challenge session and may not re-set the cookie + (mfaCode ? session?.mfaApiSessionId : undefined); if (!apiSessionId) { throw new CloudApiUnauthorizedException(); @@ -141,16 +157,35 @@ export class CloudUserApiService { await this.sessionService.updateSessionData(sessionMetadata.sessionId, { apiSessionId, + ...(mfaCode ? { mfaApiSessionId: null } : {}), }); } await this.ensureCsrf(sessionMetadata); } catch (e) { + if (e instanceof CloudApiMfaRequiredException && e.apiSessionId) { + await this.sessionService.updateSessionData(sessionMetadata.sessionId, { + mfaApiSessionId: e.apiSessionId, + }); + } + this.logger.error('Unable to login user', e, sessionMetadata); throw wrapHttpError(e); } } + /** + * Complete a cloud login that was challenged for MFA by re-sending it with a TOTP code + * @param sessionMetadata + * @param mfaCode + */ + async verifyMfaCode( + sessionMetadata: SessionMetadata, + mfaCode: string, + ): Promise { + return this.ensureLogin(sessionMetadata, undefined, mfaCode); + } + /** * Sync cloud user profile when needed * Always sync with force=true diff --git a/redisinsight/api/src/modules/cloud/user/cloud-user.controller.ts b/redisinsight/api/src/modules/cloud/user/cloud-user.controller.ts index 7f3d6bbef2..681c1b03f8 100644 --- a/redisinsight/api/src/modules/cloud/user/cloud-user.controller.ts +++ b/redisinsight/api/src/modules/cloud/user/cloud-user.controller.ts @@ -1,8 +1,10 @@ import { + Body, ClassSerializerInterceptor, Controller, Get, Param, + Post, Put, Query, UseInterceptors, @@ -17,6 +19,7 @@ import { CloudUserApiService } from 'src/modules/cloud/user/cloud-user.api.servi import { CloudRequestUtm } from 'src/modules/cloud/common/models'; import { SessionMetadata } from 'src/common/models'; import { CloudAuthService } from 'src/modules/cloud/auth/cloud-auth.service'; +import { CloudUserMfaLoginDto } from 'src/modules/cloud/user/dto'; @ApiTags('Cloud User') @UseInterceptors(ClassSerializerInterceptor) @@ -41,6 +44,18 @@ export class CloudUserController { return this.service.me(sessionMetadata, false, utm); } + @Post('login/mfa') + @ApiEndpoint({ + description: 'Complete cloud login that was challenged for MFA', + statusCode: 200, + }) + async verifyMfaCode( + @RequestSessionMetadata() sessionMetadata: SessionMetadata, + @Body() dto: CloudUserMfaLoginDto, + ): Promise { + return this.service.verifyMfaCode(sessionMetadata, dto.code); + } + @Put('/accounts/:id/current') @ApiEndpoint({ description: 'Activate user account', diff --git a/redisinsight/api/src/modules/cloud/user/dto/cloud-user.mfa-login.dto.ts b/redisinsight/api/src/modules/cloud/user/dto/cloud-user.mfa-login.dto.ts new file mode 100644 index 0000000000..1dde2ad46a --- /dev/null +++ b/redisinsight/api/src/modules/cloud/user/dto/cloud-user.mfa-login.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsDefined, IsNotEmpty, IsString, Matches } from 'class-validator'; + +// TOTP codes are 6 digits; reject anything else locally so a malformed value +// does not consume one of the user's server-side MFA attempts +const TOTP_CODE_PATTERN = /^\d{6}$/; + +export class CloudUserMfaLoginDto { + @ApiProperty({ + description: 'TOTP code from the authenticator app', + type: String, + example: '123456', + }) + @IsDefined() + @IsNotEmpty() + @IsString() + @Matches(TOTP_CODE_PATTERN, { message: 'code must be a 6-digit number' }) + code: string; +} diff --git a/redisinsight/api/src/modules/cloud/user/dto/index.ts b/redisinsight/api/src/modules/cloud/user/dto/index.ts new file mode 100644 index 0000000000..2863cfc5da --- /dev/null +++ b/redisinsight/api/src/modules/cloud/user/dto/index.ts @@ -0,0 +1 @@ +export * from './cloud-user.mfa-login.dto'; diff --git a/redisinsight/api/src/modules/cloud/user/providers/cloud-user.api.provider.ts b/redisinsight/api/src/modules/cloud/user/providers/cloud-user.api.provider.ts index 2aa66bf645..c3853b09a7 100644 --- a/redisinsight/api/src/modules/cloud/user/providers/cloud-user.api.provider.ts +++ b/redisinsight/api/src/modules/cloud/user/providers/cloud-user.api.provider.ts @@ -1,12 +1,16 @@ import { get } from 'lodash'; import { Injectable } from '@nestjs/common'; import { ICloudApiAccount, ICloudApiUser } from 'src/modules/cloud/user/models'; -import { wrapCloudApiError } from 'src/modules/cloud/common/exceptions'; +import { + CloudApiMfaRequiredException, + wrapCloudApiError, +} from 'src/modules/cloud/common/exceptions'; import { CloudRequestUtm, ICloudApiCredentials, } from 'src/modules/cloud/common/models'; import { CloudApiProvider } from 'src/modules/cloud/common/providers/cloud.api.provider'; +import { CloudApiMfaType } from 'src/modules/cloud/common/constants'; @Injectable() export class CloudUserApiProvider extends CloudApiProvider { @@ -32,13 +36,16 @@ export class CloudUserApiProvider extends CloudApiProvider { /** * Login user to api using accessToken from oauth flow * returns JSESSIONID + * When the login was challenged for MFA, re-call with mfaCode to complete it * @param credentials * @param utm + * @param mfaCode * @private */ async getApiSessionId( credentials: ICloudApiCredentials, utm?: CloudRequestUtm, + mfaCode?: string, ): Promise { try { const { headers } = await this.api.post( @@ -46,20 +53,33 @@ export class CloudUserApiProvider extends CloudApiProvider { { ...CloudApiProvider.generateUtmBody(utm), auth_mode: credentials?.idpType, + ...(mfaCode + ? { mfa_code: mfaCode, mfa_type: CloudApiMfaType.Totp } + : {}), }, - { - ...CloudApiProvider.getHeaders(credentials), - }, + CloudApiProvider.getHeaders(credentials), ); - return get(headers, 'set-cookie', []) - .find((header) => header.indexOf('JSESSIONID=') > -1) - ?.match(/JSESSIONID=([^;]+)/)?.[1]; + return CloudUserApiProvider.getJsessionId(headers); } catch (e) { - throw wrapCloudApiError(e); + const error = wrapCloudApiError(e); + + if (error instanceof CloudApiMfaRequiredException) { + error.apiSessionId = CloudUserApiProvider.getJsessionId( + e?.response?.headers, + ); + } + + throw error; } } + private static getJsessionId(headers: unknown): string | undefined { + return (get(headers, 'set-cookie', []) as string[]) + .find((header) => header.indexOf('JSESSIONID=') > -1) + ?.match(/JSESSIONID=([^;]+)/)?.[1]; + } + /** * Get current user profile * @param credentials diff --git a/redisinsight/api/src/modules/cloud/user/utils/token.spec.ts b/redisinsight/api/src/modules/cloud/user/utils/token.spec.ts index 01d2ae5682..222d589382 100644 --- a/redisinsight/api/src/modules/cloud/user/utils/token.spec.ts +++ b/redisinsight/api/src/modules/cloud/user/utils/token.spec.ts @@ -1,5 +1,5 @@ import { sign } from 'jsonwebtoken'; -import { isValidToken } from './token'; +import { isTokenExpired, isValidToken } from './token'; describe('isValidToken', () => { it('should return false if no token has been provided', () => { @@ -16,3 +16,24 @@ describe('isValidToken', () => { expect(isValidToken(valid)).toBe(true); }); }); + +describe('isTokenExpired', () => { + it('should treat a missing token as expired', () => { + expect(isTokenExpired()).toBe(true); + }); + + it('should be false for an unexpired token', () => { + const valid = sign({ exp: Math.trunc(Date.now() / 1000) + 3600 }, 'test'); + expect(isTokenExpired(valid)).toBe(false); + }); + + it('should be true for an expired token', () => { + const expired = sign({ exp: Math.trunc(Date.now() / 1000) - 3600 }, 'test'); + expect(isTokenExpired(expired)).toBe(true); + }); + + it('should treat a token without an exp claim as expired', () => { + const noExp = sign({ sub: 'user' }, 'test'); + expect(isTokenExpired(noExp)).toBe(true); + }); +}); diff --git a/redisinsight/api/src/modules/cloud/user/utils/token.ts b/redisinsight/api/src/modules/cloud/user/utils/token.ts index 0132737dfb..f974e2e96e 100644 --- a/redisinsight/api/src/modules/cloud/user/utils/token.ts +++ b/redisinsight/api/src/modules/cloud/user/utils/token.ts @@ -2,16 +2,37 @@ import config from 'src/utils/config'; const cloudConfig = config.get('cloud'); +const getTokenExp = (token: string): number => { + const { exp } = JSON.parse( + Buffer.from(token.split('.')[1], 'base64').toString(), + ); + + return exp * 1_000; +}; + export const isValidToken = (token?: string) => { if (!token) { return false; } - const { exp } = JSON.parse( - Buffer.from(token.split('.')[1], 'base64').toString(), - ); - - const expiresIn = exp * 1_000 - Date.now(); + const expiresIn = getTokenExp(token) - Date.now(); return expiresIn > cloudConfig.renewTokensBeforeExpire; }; + +// Actual expiry, ignoring the proactive-renewal buffer. A token can be past the +// renewal buffer (isValidToken === false) while still usable for a request. +export const isTokenExpired = (token?: string): boolean => { + if (!token) { + return true; + } + + try { + const exp = getTokenExp(token); + // a token without an exp claim yields NaN; treat it as expired rather than + // letting `NaN <= now` (false) report it as still valid + return Number.isNaN(exp) || exp <= Date.now(); + } catch { + return true; + } +}; diff --git a/redisinsight/api/src/modules/cluster-monitor/models/cluster-node-details.ts b/redisinsight/api/src/modules/cluster-monitor/models/cluster-node-details.ts index 1b3dc80290..77f9fb317a 100644 --- a/redisinsight/api/src/modules/cluster-monitor/models/cluster-node-details.ts +++ b/redisinsight/api/src/modules/cluster-monitor/models/cluster-node-details.ts @@ -48,7 +48,6 @@ export class ClusterNodeDetails { port: number; @ApiProperty({ - type: String, enum: NodeRole, enumName: 'NodeRole', description: 'Node role in cluster', @@ -63,7 +62,6 @@ export class ClusterNodeDetails { primary?: string; @ApiProperty({ - type: String, enum: HealthStatus, enumName: 'HealthStatus', description: "Node's current health status", diff --git a/redisinsight/api/src/modules/cluster-monitor/strategies/__tests__/cluster-shards.factory.ts b/redisinsight/api/src/modules/cluster-monitor/strategies/__tests__/cluster-shards.factory.ts index a019eff88e..28a1a2f139 100644 --- a/redisinsight/api/src/modules/cluster-monitor/strategies/__tests__/cluster-shards.factory.ts +++ b/redisinsight/api/src/modules/cluster-monitor/strategies/__tests__/cluster-shards.factory.ts @@ -34,17 +34,24 @@ export const toNodeReplyArray = (obj: Record): any[] => { }; export const clusterShardNodeRawFactory = Factory.define( - () => ({ - id: faker.string.hexadecimal({ length: 40, prefix: '' }), - port: faker.number.int({ min: 6379, max: 6400 }), - ip: faker.internet.ipv4(), - endpoint: faker.internet.ipv4(), - hostname: '', - role: 'master', - 'replication-offset': faker.number.int({ min: 0, max: 200000 }), - health: faker.helpers.arrayElement(Object.values(HealthStatus)), - 'tls-port': undefined, - }), + () => { + const ip = faker.internet.ipv4(); + + return { + id: faker.string.hexadecimal({ length: 40, prefix: '' }), + port: faker.number.int({ min: 6379, max: 6400 }), + ip, + // `cluster-preferred-endpoint-type ip` is Redis's own default, so the + // preferred endpoint equals the ip unless a test explicitly overrides + // it to simulate a `hostname` or unknown-endpoint configuration. + endpoint: ip, + hostname: '', + role: 'master', + 'replication-offset': faker.number.int({ min: 0, max: 200000 }), + health: faker.helpers.arrayElement(Object.values(HealthStatus)), + 'tls-port': undefined, + }; + }, ); export const clusterShardRawFactory = Factory.define( diff --git a/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.spec.ts b/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.spec.ts index 8e674e5d36..16c45ce866 100644 --- a/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.spec.ts +++ b/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.spec.ts @@ -26,7 +26,7 @@ describe('ClusterShardsInfoStrategy', () => { }); describe('getClusterNodesFromRedis', () => { - it('should return cluster info with ip when hostname is empty', async () => { + it('should use the ip when it is the preferred endpoint (cluster-preferred-endpoint-type ip, the default)', async () => { const node1 = clusterShardNodeRawFactory.build(); const node2 = clusterShardNodeRawFactory.build(); const shard1 = clusterShardRawFactory.build( @@ -51,18 +51,21 @@ describe('ClusterShardsInfoStrategy', () => { expect(info[1].slots).toEqual([formatSlotRange(5001, 16383)]); }); - it('should use hostname when cluster-announce-hostname is configured', async () => { + it('should use the endpoint when the preferred endpoint type is hostname', async () => { const hostname1 = 'redis-node-1.example.com'; const hostname2 = 'redis-node-2.example.com'; const master1 = clusterShardNodeRawFactory.build({ hostname: hostname1, + endpoint: hostname1, }); const replica1 = clusterShardNodeRawFactory.build({ hostname: hostname1, + endpoint: hostname1, role: 'slave', }); const master2 = clusterShardNodeRawFactory.build({ hostname: hostname2, + endpoint: hostname2, }); const shard1 = clusterShardRawFactory.build( @@ -89,10 +92,31 @@ describe('ClusterShardsInfoStrategy', () => { expect(info[1].host).toBe(hostname2); }); + it('should use the ip, not an announced hostname, when the preferred endpoint type is ip', async () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3546234089: + // a node may announce a hostname purely as metadata while + // cluster-preferred-endpoint-type still resolves to ip. + const node = clusterShardNodeRawFactory.build({ + hostname: 'redis-node-1.example.com', + }); + const shard = clusterShardRawFactory.build( + {}, + { transient: { slotStart: 0, slotEnd: 16383, nodes: [node] } }, + ); + const reply = [shard].map(toClusterShardsReplyEntry); + when(clusterClient.sendCommand).mockResolvedValue(reply); + + const info = await service.getClusterNodesFromRedis(clusterClient); + + expect(info).toHaveLength(1); + expect(info[0].host).toBe(node.ip); + }); + it('should use tls-port when regular port is not available', async () => { const tlsPort = 6380; const node = clusterShardNodeRawFactory.build({ hostname: 'redis-tls.example.com', + endpoint: 'redis-tls.example.com', port: undefined, 'tls-port': tlsPort, }); @@ -114,7 +138,7 @@ describe('ClusterShardsInfoStrategy', () => { describe('processShardNodes', () => { const slots = ['0-5000']; - it('should use ip as host when hostname is empty string', () => { + it('should use ip as host when it is the preferred endpoint (default)', () => { const raw = clusterShardNodeRawFactory.build(); const result = ClusterShardsInfoStrategy.processShardNodes( @@ -125,9 +149,12 @@ describe('ClusterShardsInfoStrategy', () => { expect(result[0]).toHaveProperty('ip', raw.ip); }); - it('should prefer hostname over ip when hostname is set', () => { + it('should use the endpoint when the preferred endpoint type is hostname', () => { const hostname = 'redis.example.com'; - const raw = clusterShardNodeRawFactory.build({ hostname }); + const raw = clusterShardNodeRawFactory.build({ + hostname, + endpoint: hostname, + }); const result = ClusterShardsInfoStrategy.processShardNodes( [toNodeReplyArray(raw)], @@ -137,7 +164,19 @@ describe('ClusterShardsInfoStrategy', () => { expect(result[0]).toHaveProperty('ip', raw.ip); }); - it('should fall back to ip when hostname is not present in reply', () => { + it('should use ip, not an announced hostname, when the preferred endpoint type is ip', () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3546234089 + const hostname = 'redis.example.com'; + const raw = clusterShardNodeRawFactory.build({ hostname }); + + const result = ClusterShardsInfoStrategy.processShardNodes( + [toNodeReplyArray(raw)], + slots, + ); + expect(result[0].host).toBe(raw.ip); + }); + + it('should fall back to ip when endpoint is not present in reply', () => { const ip = '10.0.0.99'; const shardNodes = [ [ @@ -162,6 +201,83 @@ describe('ClusterShardsInfoStrategy', () => { expect(result[0]).toHaveProperty('ip', ip); }); + it('should fall back to ip when endpoint is an empty string', () => { + const raw = clusterShardNodeRawFactory.build({ endpoint: '' }); + + const result = ClusterShardsInfoStrategy.processShardNodes( + [toNodeReplyArray(raw)], + slots, + ); + expect(result[0].host).toBe(raw.ip); + }); + + it('should use fallbackHost when endpoint is null (unknown endpoint) and no ip is present', () => { + const shardNodes = [ + [ + 'id', + 'n1', + 'port', + 6379, + 'endpoint', + null, + 'role', + 'master', + 'health', + 'online', + ], + ]; + + const result = ClusterShardsInfoStrategy.processShardNodes( + shardNodes, + slots, + '203.0.113.10', + ); + expect(result[0].host).toBe('203.0.113.10'); + }); + + it('should prefer the node ip over fallbackHost when endpoint is null (unknown endpoint)', () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3632382937: + // getClusterNodesFromRedis always passes the connection host as + // fallbackHost, so every node with a null/empty endpoint must still be + // labeled with its own ip - falling straight to fallbackHost would + // mislabel every such node with the same shared connection host. + const ip = '10.0.0.42'; + const shardNodes = [ + [ + 'id', + 'n1', + 'port', + 6379, + 'ip', + ip, + 'endpoint', + null, + 'role', + 'master', + 'health', + 'online', + ], + ]; + + const result = ClusterShardsInfoStrategy.processShardNodes( + shardNodes, + slots, + '203.0.113.10', + ); + expect(result[0].host).toBe(ip); + }); + + it('should fall back to ip when endpoint is the "?" misconfigured marker', () => { + const raw = clusterShardNodeRawFactory.build({ endpoint: '?' }); + + const result = ClusterShardsInfoStrategy.processShardNodes( + [toNodeReplyArray(raw)], + slots, + '203.0.113.10', // must be ignored - '?' is not necessarily this node + ); + expect(result[0].host).toBe(raw.ip); + }); + it('should use tls-port when port is missing', () => { const tlsPort = 6380; const raw = clusterShardNodeRawFactory.build({ @@ -230,11 +346,13 @@ describe('ClusterShardsInfoStrategy', () => { const tlsPort = 6390; const primary = clusterShardNodeRawFactory.build({ hostname, + endpoint: hostname, port: undefined, 'tls-port': tlsPort, }); const replica = clusterShardNodeRawFactory.build({ hostname, + endpoint: hostname, port: undefined, 'tls-port': tlsPort + 1, role: 'slave', diff --git a/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts b/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts index b73deeb714..bfaf0a1d27 100644 --- a/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts +++ b/redisinsight/api/src/modules/cluster-monitor/strategies/cluster-shards.info.strategy.ts @@ -4,20 +4,29 @@ import { ClusterNodeDetails, NodeRole, } from 'src/modules/cluster-monitor/models'; -import { convertArrayReplyToObject } from 'src/modules/redis/utils'; +import { + convertArrayReplyToObject, + resolvePreferredEndpoint, +} from 'src/modules/redis/utils'; import { RedisClient } from 'src/modules/redis/client'; export class ClusterShardsInfoStrategy extends AbstractInfoStrategy { - async getClusterNodesFromRedis(client: RedisClient) { + async getClusterNodesFromRedis( + client: RedisClient, + ): Promise[]> { const resp = (await client.sendCommand(['cluster', 'shards'], { replyEncoding: 'utf8', })) as any[]; - return [].concat( + return ([] as Partial[]).concat( ...resp.map((shardArray) => { const shard = convertArrayReplyToObject(shardArray); const slots = ClusterShardsInfoStrategy.calculateSlots(shard.slots); - return ClusterShardsInfoStrategy.processShardNodes(shard.nodes, slots); + return ClusterShardsInfoStrategy.processShardNodes( + shard.nodes, + slots, + client.options?.host, + ); }), ); } @@ -35,13 +44,25 @@ export class ClusterShardsInfoStrategy extends AbstractInfoStrategy { static processShardNodes( shardNodes: any[], slots: string[], + fallbackHost?: string, ): Partial[] { let primary; const nodes = shardNodes.map((nodeArray) => { const nodeObj = convertArrayReplyToObject(nodeArray); const node = { id: nodeObj.id, - host: nodeObj.hostname || nodeObj.ip, + // `endpoint` is CLUSTER SHARDS' server-resolved preferred address + // (respects `cluster-preferred-endpoint-type`) - `hostname` alone is + // only supplementary metadata and must not drive this on its own. + // Fall back to this node's own `ip` for an unknown/misconfigured + // endpoint (this is a display-only value, not a connection target), + // and only to the shared connection entrypoint as a last resort when + // the node has no ip either - otherwise every node with an + // unknown/empty endpoint would be mislabeled with the same host. + host: + resolvePreferredEndpoint(nodeObj.endpoint) || + nodeObj.ip || + fallbackHost, ip: nodeObj.ip, port: nodeObj.port || nodeObj['tls-port'], tlsPort: nodeObj['tls-port'], diff --git a/redisinsight/api/src/modules/database-import/certificate-import.service.spec.ts b/redisinsight/api/src/modules/database-import/certificate-import.service.spec.ts index 65cb009c89..9f3e956885 100644 --- a/redisinsight/api/src/modules/database-import/certificate-import.service.spec.ts +++ b/redisinsight/api/src/modules/database-import/certificate-import.service.spec.ts @@ -16,24 +16,29 @@ import { } from 'src/__mocks__'; import * as utils from 'src/common/utils'; import { Test, TestingModule } from '@nestjs/testing'; -import { - InvalidCaCertificateBodyException, - InvalidCertificateNameException, - InvalidClientCertificateBodyException, - InvalidClientPrivateKeyException, -} from 'src/modules/database-import/exceptions'; +import config, { Config } from 'src/utils/config'; +import { BuildType } from 'src/modules/server/models/server'; import { CertificateImportService } from 'src/modules/database-import/certificate-import.service'; import { EncryptionService } from 'src/modules/encryption/encryption.service'; import { Repository } from 'typeorm'; import { CaCertificateEntity } from 'src/modules/certificate/entities/ca-certificate.entity'; import { ClientCertificateEntity } from 'src/modules/certificate/entities/client-certificate.entity'; import { getRepositoryToken } from '@nestjs/typeorm'; +import { + InvalidCaCertificateBodyException, + InvalidCertificateNameException, + InvalidClientCertificateBodyException, + InvalidClientPrivateKeyException, +} from 'src/modules/database-import/exceptions'; jest.mock('src/common/utils', () => ({ ...(jest.requireActual('src/common/utils') as object), getPemBodyFromFileSync: jest.fn(), })); +const mockServerConfig = config.get('server') as Config['server']; +const originalBuildType = mockServerConfig.buildType; + describe('CertificateImportService', () => { let service: CertificateImportService; let caRepository: MockType>; @@ -96,10 +101,10 @@ describe('CertificateImportService', () => { }); }); - let determineAvailableNameSpy; - let getPemBodyFromFileSyncSpy; - let prepareCaCertificateForImportSpy; - let prepareClientCertificateForImportSpy; + let determineAvailableNameSpy: jest.SpyInstance; + let getPemBodyFromFileSyncSpy: jest.SpyInstance; + let prepareCaCertificateForImportSpy: jest.SpyInstance; + let prepareClientCertificateForImportSpy: jest.SpyInstance; describe('processCaCertificate', () => { beforeEach(() => { @@ -136,32 +141,62 @@ describe('CertificateImportService', () => { } }); - it('should successfully process certificate from file', async () => { - const response = await service['processCaCertificate']({ - certificate: '/path/ca.crt', + describe('from filesystem path (desktop build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.Electron; }); - expect(response).toEqual(mockCaCertificate); - expect(prepareCaCertificateForImportSpy).toHaveBeenCalledWith({ - name: 'ca', - certificate: mockCaCertificate.certificate, + afterEach(() => { + mockServerConfig.buildType = originalBuildType; }); - }); - it('should fail when no file found', async () => { - getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { - throw new Error(); + it('should successfully process certificate from file', async () => { + const response = await service['processCaCertificate']({ + certificate: '/path/ca.crt', + }); + + expect(response).toEqual(mockCaCertificate); + expect(prepareCaCertificateForImportSpy).toHaveBeenCalledWith({ + name: 'ca', + certificate: mockCaCertificate.certificate, + }); }); - try { - await service['processCaCertificate']({ - name: undefined, - certificate: '/path/ca.crt', + it('should fail when no file found', async () => { + getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { + throw new Error(); }); - fail(); - } catch (e) { - expect(e).toBeInstanceOf(InvalidCaCertificateBodyException); - } + + try { + await service['processCaCertificate']({ + name: undefined, + certificate: '/path/ca.crt', + }); + fail(); + } catch (e) { + expect(e).toBeInstanceOf(InvalidCaCertificateBodyException); + } + }); + }); + + describe('from filesystem path (network build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.DockerOnPremise; + }); + + afterEach(() => { + mockServerConfig.buildType = originalBuildType; + }); + + it('should reject a path without reading any file', async () => { + await expect( + service['processCaCertificate']({ + certificate: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt', + }), + ).rejects.toBeInstanceOf(InvalidCaCertificateBodyException); + + expect(getPemBodyFromFileSyncSpy).not.toHaveBeenCalled(); + }); }); }); @@ -264,60 +299,93 @@ describe('CertificateImportService', () => { } }); - it('should successfully process certificate from file', async () => { - getPemBodyFromFileSyncSpy.mockReturnValueOnce( - mockClientCertificate.certificate, - ); - getPemBodyFromFileSyncSpy.mockReturnValueOnce(mockClientCertificate.key); + describe('from filesystem path (desktop build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.Electron; + }); - const response = await service['processClientCertificate']({ - certificate: '/path/client.crt', - key: '/path/key.key', + afterEach(() => { + mockServerConfig.buildType = originalBuildType; }); - expect(response).toEqual(mockClientCertificate); - expect(prepareClientCertificateForImportSpy).toHaveBeenCalledWith({ - name: 'client', - certificate: mockClientCertificate.certificate, - key: mockClientCertificate.key, + it('should successfully process certificate from file', async () => { + getPemBodyFromFileSyncSpy.mockReturnValueOnce( + mockClientCertificate.certificate, + ); + getPemBodyFromFileSyncSpy.mockReturnValueOnce( + mockClientCertificate.key, + ); + + const response = await service['processClientCertificate']({ + certificate: '/path/client.crt', + key: '/path/key.key', + }); + + expect(response).toEqual(mockClientCertificate); + expect(prepareClientCertificateForImportSpy).toHaveBeenCalledWith({ + name: 'client', + certificate: mockClientCertificate.certificate, + key: mockClientCertificate.key, + }); }); - }); - it('should fail when no cert file found', async () => { - getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { - throw new Error(); + it('should fail when no cert file found', async () => { + getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { + throw new Error(); + }); + + try { + await service['processClientCertificate']({ + name: undefined, + certificate: '/path/client1.crt', + key: '/path/key1.key', + }); + fail(); + } catch (e) { + expect(e).toBeInstanceOf(InvalidClientCertificateBodyException); + } }); - try { - await service['processClientCertificate']({ - name: undefined, - certificate: '/path/client1.crt', - key: '/path/key1.key', + it('should fail when no key file found', async () => { + getPemBodyFromFileSyncSpy.mockReturnValueOnce( + mockClientCertificate.certificate, + ); + getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { + throw new Error(); }); - fail(); - } catch (e) { - expect(e).toBeInstanceOf(InvalidClientCertificateBodyException); - } + + try { + await service['processClientCertificate']({ + name: undefined, + certificate: '/path/client.crt', + key: '/path/key.key', + }); + fail(); + } catch (e) { + expect(e).toBeInstanceOf(InvalidClientPrivateKeyException); + } + }); }); - it('should fail when no key file found', async () => { - getPemBodyFromFileSyncSpy.mockReturnValueOnce( - mockClientCertificate.certificate, - ); - getPemBodyFromFileSyncSpy.mockImplementationOnce(() => { - throw new Error(); + describe('from filesystem path (network build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.DockerOnPremise; }); - try { - await service['processClientCertificate']({ - name: undefined, - certificate: '/path/client.crt', - key: '/path/key.key', - }); - fail(); - } catch (e) { - expect(e).toBeInstanceOf(InvalidClientPrivateKeyException); - } + afterEach(() => { + mockServerConfig.buildType = originalBuildType; + }); + + it('should reject cert and key paths without reading any file', async () => { + await expect( + service['processClientCertificate']({ + certificate: '/etc/redis/tls/redis.crt', + key: '/etc/redis/tls/redis.key', + }), + ).rejects.toBeInstanceOf(InvalidClientCertificateBodyException); + + expect(getPemBodyFromFileSyncSpy).not.toHaveBeenCalled(); + }); }); }); diff --git a/redisinsight/api/src/modules/database-import/certificate-import.service.ts b/redisinsight/api/src/modules/database-import/certificate-import.service.ts index 36e084f142..e884fd2bd4 100644 --- a/redisinsight/api/src/modules/database-import/certificate-import.service.ts +++ b/redisinsight/api/src/modules/database-import/certificate-import.service.ts @@ -11,6 +11,7 @@ import { classToClass } from 'src/utils'; import { getCertNameFromFilename, getPemBodyFromFileSync, + isImportFromFileAllowed, isValidPemCertificate, isValidPemPrivateKey, } from 'src/common/utils'; @@ -57,7 +58,7 @@ export class CertificateImportService { if (isValidPemCertificate(cert.certificate)) { toImport.certificate = cert.certificate; - } else { + } else if (isImportFromFileAllowed()) { try { toImport.certificate = getPemBodyFromFileSync(cert.certificate); toImport.name = getCertNameFromFilename(cert.certificate); @@ -130,7 +131,7 @@ export class CertificateImportService { if (isValidPemCertificate(cert.certificate)) { toImport.certificate = cert.certificate; - } else { + } else if (isImportFromFileAllowed()) { try { toImport.certificate = getPemBodyFromFileSync(cert.certificate); toImport.name = getCertNameFromFilename(cert.certificate); @@ -143,7 +144,7 @@ export class CertificateImportService { if (isValidPemPrivateKey(cert.key)) { toImport.key = cert.key; - } else { + } else if (isImportFromFileAllowed()) { try { toImport.key = getPemBodyFromFileSync(cert.key); } catch (e) { diff --git a/redisinsight/api/src/modules/database-import/database-import.service.spec.ts b/redisinsight/api/src/modules/database-import/database-import.service.spec.ts index 7340248626..ac2b63226d 100644 --- a/redisinsight/api/src/modules/database-import/database-import.service.spec.ts +++ b/redisinsight/api/src/modules/database-import/database-import.service.spec.ts @@ -204,6 +204,7 @@ describe('DatabaseImportService', () => { 'compressor', 'modules', 'environment', + 'connectionFamily', ]), provider: 'REDIS_CLOUD', new: true, @@ -232,6 +233,7 @@ describe('DatabaseImportService', () => { 'compressor', 'modules', 'environment', + 'connectionFamily', ]), name: `${mockDatabase.host}:${mockDatabase.port}`, new: true, @@ -260,6 +262,7 @@ describe('DatabaseImportService', () => { 'compressor', 'modules', 'environment', + 'connectionFamily', ]), compressor: Compressor.NONE, new: true, @@ -290,6 +293,7 @@ describe('DatabaseImportService', () => { 'modules', 'tlsServername', 'environment', + 'connectionFamily', ]), compressor: Compressor.GZIP, tlsServername: 'redis-insight', @@ -319,6 +323,7 @@ describe('DatabaseImportService', () => { 'compressor', 'modules', 'environment', + 'connectionFamily', ]), connectionType: ConnectionType.CLUSTER, new: true, diff --git a/redisinsight/api/src/modules/database-import/database-import.service.ts b/redisinsight/api/src/modules/database-import/database-import.service.ts index c9a79f4328..d5317d0721 100644 --- a/redisinsight/api/src/modules/database-import/database-import.service.ts +++ b/redisinsight/api/src/modules/database-import/database-import.service.ts @@ -115,6 +115,7 @@ export class DatabaseImportService { ['tags', ['tags']], ['providerDetails', ['providerDetails']], ['environment', ['environment']], + ['connectionFamily', ['connectionFamily']], ]; constructor( diff --git a/redisinsight/api/src/modules/database-import/dto/import.database.dto.ts b/redisinsight/api/src/modules/database-import/dto/import.database.dto.ts index 122c8cf38f..4b26dc643b 100644 --- a/redisinsight/api/src/modules/database-import/dto/import.database.dto.ts +++ b/redisinsight/api/src/modules/database-import/dto/import.database.dto.ts @@ -43,6 +43,7 @@ export class ImportDatabaseDto extends PickType(Database, [ 'forceStandalone', 'tags', 'environment', + 'connectionFamily', ] as const) { @Expose() @IsNotEmpty() diff --git a/redisinsight/api/src/modules/database-import/ssh-import.service.spec.ts b/redisinsight/api/src/modules/database-import/ssh-import.service.spec.ts index 302bc74c13..0a5df36c2f 100644 --- a/redisinsight/api/src/modules/database-import/ssh-import.service.spec.ts +++ b/redisinsight/api/src/modules/database-import/ssh-import.service.spec.ts @@ -2,6 +2,8 @@ import { mockSshOptionsBasic, mockSshOptionsPrivateKey } from 'src/__mocks__'; import * as utils from 'src/common/utils'; import { Test, TestingModule } from '@nestjs/testing'; import { SshImportService } from 'src/modules/database-import/ssh-import.service'; +import config, { Config } from 'src/utils/config'; +import { BuildType } from 'src/modules/server/models/server'; import { InvalidSshPrivateKeyBodyException, InvalidSshBodyException, @@ -13,6 +15,9 @@ jest.mock('src/common/utils', () => ({ getPemBodyFromFileSync: jest.fn(), })); +const mockServerConfig = config.get('server') as Config['server']; +const originalBuildType = mockServerConfig.buildType; + const mockSshImportDataBasic = { sshHost: mockSshOptionsBasic.host, sshPort: mockSshOptionsBasic.port, @@ -39,7 +44,7 @@ describe('SshImportService', () => { service = await module.get(SshImportService); }); - let getPemBodyFromFileSyncSpy; + let getPemBodyFromFileSyncSpy: jest.SpyInstance; describe('processSshOptions', () => { beforeEach(() => { @@ -77,32 +82,63 @@ describe('SshImportService', () => { }); }); - it('should successfully process ssh PKP (from path)', async () => { - const response = await service.processSshOptions({ - ...mockSshImportDataPK, - sshPrivateKey: '/some/path', + describe('from filesystem path (desktop build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.Electron; }); - expect(response).toEqual({ - ...mockSshOptionsPrivateKey, - id: undefined, - password: undefined, + afterEach(() => { + mockServerConfig.buildType = originalBuildType; }); - }); - it('should throw an error when invalid privateKey body provided', async () => { - getPemBodyFromFileSyncSpy.mockImplementation(() => { - throw new Error('no file'); - }); - - try { - await service.processSshOptions({ + it('should successfully process ssh PKP (from path)', async () => { + const response = await service.processSshOptions({ ...mockSshImportDataPK, sshPrivateKey: '/some/path', }); - } catch (e) { - expect(e).toBeInstanceOf(InvalidSshPrivateKeyBodyException); - } + + expect(response).toEqual({ + ...mockSshOptionsPrivateKey, + id: undefined, + password: undefined, + }); + }); + + it('should throw an error when invalid privateKey body provided', async () => { + getPemBodyFromFileSyncSpy.mockImplementation(() => { + throw new Error('no file'); + }); + + try { + await service.processSshOptions({ + ...mockSshImportDataPK, + sshPrivateKey: '/some/path', + }); + } catch (e) { + expect(e).toBeInstanceOf(InvalidSshPrivateKeyBodyException); + } + }); + }); + + describe('from filesystem path (network build)', () => { + beforeEach(() => { + mockServerConfig.buildType = BuildType.DockerOnPremise; + }); + + afterEach(() => { + mockServerConfig.buildType = originalBuildType; + }); + + it('should reject a path without reading any file', async () => { + await expect( + service.processSshOptions({ + ...mockSshImportDataPK, + sshPrivateKey: '/root/.ssh/id_rsa', + }), + ).rejects.toBeInstanceOf(InvalidSshPrivateKeyBodyException); + + expect(getPemBodyFromFileSyncSpy).not.toHaveBeenCalled(); + }); }); it('should throw an error when ssh agent provided', async () => { diff --git a/redisinsight/api/src/modules/database-import/ssh-import.service.ts b/redisinsight/api/src/modules/database-import/ssh-import.service.ts index 315ad0e8eb..98e7e1f7d2 100644 --- a/redisinsight/api/src/modules/database-import/ssh-import.service.ts +++ b/redisinsight/api/src/modules/database-import/ssh-import.service.ts @@ -1,6 +1,10 @@ import { Injectable } from '@nestjs/common'; import { isUndefined } from 'lodash'; -import { getPemBodyFromFileSync, isValidSshPrivateKey } from 'src/common/utils'; +import { + getPemBodyFromFileSync, + isImportFromFileAllowed, + isValidSshPrivateKey, +} from 'src/common/utils'; import { InvalidSshPrivateKeyBodyException, InvalidSshBodyException, @@ -31,13 +35,15 @@ export class SshImportService { if (isValidSshPrivateKey(data.sshPrivateKey)) { sshOptions.privateKey = data.sshPrivateKey; - } else { + } else if (isImportFromFileAllowed()) { try { sshOptions.privateKey = getPemBodyFromFileSync(data.sshPrivateKey); } catch (e) { // ignore error sshOptions = null; } + } else { + throw new InvalidSshPrivateKeyBodyException(); } } else { sshOptions.password = data.sshPassword || null; diff --git a/redisinsight/api/src/modules/database/credentials/strategies/azure-access-key.credential-strategy.ts b/redisinsight/api/src/modules/database/credentials/strategies/azure-access-key.credential-strategy.ts index 948bd77d69..0612c3c34f 100644 --- a/redisinsight/api/src/modules/database/credentials/strategies/azure-access-key.credential-strategy.ts +++ b/redisinsight/api/src/modules/database/credentials/strategies/azure-access-key.credential-strategy.ts @@ -90,6 +90,7 @@ export class AzureAccessKeyCredentialStrategy implements ICredentialStrategy { providerDetails.resourceName, providerDetails.resourceType, providerDetails.clusterName, + providerDetails.tenantId, ); // Use plainToInstance to ensure the result is a proper Database class instance diff --git a/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.spec.ts b/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.spec.ts index 1d430bbdf3..a076967cac 100644 --- a/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.spec.ts +++ b/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.spec.ts @@ -173,6 +173,17 @@ describe('AzureEntraIdCredentialStrategy', () => { ); }); + it('should carry the connection tenant on the expired exception for recovery', async () => { + const database = createMockAzureDatabase(); + mockAzureAuthService.getRedisTokenByAccountId.mockResolvedValue(null); + + await expect(strategy.resolve(database)).rejects.toMatchObject({ + response: { + additionalInfo: { tenantId: database.providerDetails?.tenantId }, + }, + }); + }); + it('should return database with credentials from token result', async () => { const database = createMockAzureDatabase(); const tokenResult = createMockTokenResult(); @@ -186,7 +197,34 @@ describe('AzureEntraIdCredentialStrategy', () => { expect(result.password).toBe(tokenResult.token); expect( mockAzureAuthService.getRedisTokenByAccountId, - ).toHaveBeenCalledWith(database.providerDetails?.azureAccountId); + ).toHaveBeenCalledWith( + database.providerDetails?.azureAccountId, + database.providerDetails?.tenantId, + ); + }); + + it('should acquire the token against the stored tenant', async () => { + const tenantId = faker.string.uuid(); + const database = createMockAzureDatabase({ + providerDetails: { + provider: CloudProvider.Azure, + authType: AzureAuthType.EntraId, + azureAccountId: faker.string.uuid(), + tenantId, + }, + }); + mockAzureAuthService.getRedisTokenByAccountId.mockResolvedValue( + createMockTokenResult(), + ); + + await strategy.resolve(database); + + expect( + mockAzureAuthService.getRedisTokenByAccountId, + ).toHaveBeenCalledWith( + database.providerDetails?.azureAccountId, + tenantId, + ); }); it('should preserve other database properties', async () => { diff --git a/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.ts b/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.ts index a8952227c3..570f810956 100644 --- a/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.ts +++ b/redisinsight/api/src/modules/database/credentials/strategies/azure-entra-id.credential-strategy.ts @@ -45,13 +45,14 @@ export class AzureEntraIdCredentialStrategy implements ICredentialStrategy { const tokenResult = await this.azureAuthService.getRedisTokenByAccountId( providerDetails.azureAccountId, + providerDetails.tenantId, ); if (!tokenResult) { this.logger.warn( `Failed to acquire token for database ${database.id} - re-authentication needed`, ); - throw new AzureEntraIdTokenExpiredException(); + throw new AzureEntraIdTokenExpiredException(providerDetails.tenantId); } // Use plainToInstance to ensure the result is a proper Database class instance diff --git a/redisinsight/api/src/modules/database/database.service.spec.ts b/redisinsight/api/src/modules/database/database.service.spec.ts index 075bcb0f06..cb212a00d3 100644 --- a/redisinsight/api/src/modules/database/database.service.spec.ts +++ b/redisinsight/api/src/modules/database/database.service.spec.ts @@ -1,4 +1,5 @@ import { + BadRequestException, InternalServerErrorException, NotFoundException, } from '@nestjs/common'; @@ -38,6 +39,7 @@ import ERROR_MESSAGES from 'src/constants/error-messages'; import { Compressor, Environment, + RedisConnectionFamily, } from 'src/modules/database/entities/database.entity'; import { RedisClientFactory } from 'src/modules/redis/redis.client.factory'; import { RedisClientStorage } from 'src/modules/redis/redis.client.storage'; @@ -60,6 +62,7 @@ const updateDatabaseTests = [ { input: { sentinelMaster: 'master' }, expected: 1 }, { input: { caCert: mockCaCertificate }, expected: 1 }, { input: { clientCert: mockClientCertificate }, expected: 1 }, + { input: { connectionFamily: RedisConnectionFamily.IPv4 }, expected: 1 }, { input: { compressor: Compressor.NONE }, expected: 0 }, { input: { timeout: 45_000 }, expected: 0 }, { input: { port: 6379, timeout: 45_000 }, expected: 1 }, @@ -269,6 +272,7 @@ describe('DatabaseService', () => { timeout: 30000, compressor: Compressor.NONE, environment: Environment.Unspecified, + connectionFamily: RedisConnectionFamily.Auto, id: 'a77b23c1-7816-4ea4-b61f-d37795a0f805-db-id', name: 'database-name', host: '127.0.100.1', @@ -316,6 +320,7 @@ describe('DatabaseService', () => { timeout: 30000, compressor: Compressor.NONE, environment: Environment.Unspecified, + connectionFamily: RedisConnectionFamily.Auto, name: 'database-name', id: 'a77b23c1-7816-4ea4-b61f-d37795a0f805-db-id', host: '127.0.100.1', @@ -361,6 +366,163 @@ describe('DatabaseService', () => { ), ).rejects.toThrow(NotFoundException); }); + + describe('managed databases endpoint guard', () => { + it('should throw BadRequest when changing host of a cloud-managed database', async () => { + databaseRepository.get.mockResolvedValueOnce( + mockDatabaseWithCloudDetails, + ); + + await expect( + service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { host: 'new-host' }), + true, + ), + ).rejects.toThrow( + new BadRequestException( + ERROR_MESSAGES.HOST_PORT_NOT_EDITABLE_FOR_MANAGED_DATABASE, + ), + ); + expect(databaseRepository.update).not.toHaveBeenCalled(); + }); + + it('should throw BadRequest when changing port of an Azure-managed database', async () => { + databaseRepository.get.mockResolvedValueOnce( + mockDatabaseWithProviderDetails, + ); + + await expect( + service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { port: 6380 }), + true, + ), + ).rejects.toThrow( + new BadRequestException( + ERROR_MESSAGES.HOST_PORT_NOT_EDITABLE_FOR_MANAGED_DATABASE, + ), + ); + expect(databaseRepository.update).not.toHaveBeenCalled(); + }); + + it('should allow updating other fields of a managed database when the endpoint is unchanged', async () => { + databaseRepository.get.mockResolvedValueOnce( + mockDatabaseWithCloudDetails, + ); + databaseRepository.update.mockReturnValue({ + ...mockDatabaseWithCloudDetails, + name: 'new-name', + }); + + await service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { + name: 'new-name', + host: mockDatabaseWithCloudDetails.host, + port: mockDatabaseWithCloudDetails.port, + }), + true, + ); + + expect(databaseRepository.update).toHaveBeenCalled(); + }); + + it('should allow changing host of a non-managed database', async () => { + databaseRepository.update.mockReturnValue({ + ...mockDatabase, + host: 'new-host', + }); + + await service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { host: 'new-host' }), + true, + ); + + expect(databaseRepository.update).toHaveBeenCalled(); + }); + }); + + describe('endpoint name sync', () => { + const HOST = '127.0.100.1'; + const PORT = 6379; + + // Fresh object per call: merge mutates the returned database, and the + // shared mockDatabase can be mutated by other update tests. + const defaultNamedDatabase = () => ({ + ...mockDatabase, + host: HOST, + port: PORT, + name: `${HOST}:${PORT}`, + }); + + it('should sync the name to the new endpoint when the name was the default host:port', async () => { + databaseRepository.get.mockResolvedValueOnce(defaultNamedDatabase()); + + await service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { host: 'new-host' }), + true, + ); + + expect(databaseFactory.createDatabaseModel).toHaveBeenCalledWith( + mockSessionMetadata, + expect.objectContaining({ + host: 'new-host', + name: `new-host:${PORT}`, + }), + ); + }); + + it('should not override an explicit name provided in the update', async () => { + databaseRepository.get.mockResolvedValueOnce(defaultNamedDatabase()); + + await service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { + host: 'new-host', + name: 'custom-name', + }), + true, + ); + + expect(databaseFactory.createDatabaseModel).toHaveBeenCalledWith( + mockSessionMetadata, + expect.objectContaining({ host: 'new-host', name: 'custom-name' }), + ); + }); + + it('should not change a custom name when the endpoint changes', async () => { + databaseRepository.get.mockResolvedValueOnce({ + ...mockDatabase, + host: HOST, + port: PORT, + name: 'my-custom-alias', + }); + + await service.update( + mockSessionMetadata, + mockDatabase.id, + classToClass(UpdateDatabaseDto, { host: 'new-host' }), + true, + ); + + expect(databaseFactory.createDatabaseModel).toHaveBeenCalledWith( + mockSessionMetadata, + expect.objectContaining({ + host: 'new-host', + name: 'my-custom-alias', + }), + ); + }); + }); }); describe('test', () => { diff --git a/redisinsight/api/src/modules/database/database.service.ts b/redisinsight/api/src/modules/database/database.service.ts index a41fa63211..8ac03e4757 100644 --- a/redisinsight/api/src/modules/database/database.service.ts +++ b/redisinsight/api/src/modules/database/database.service.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Injectable, InternalServerErrorException, Logger, @@ -47,6 +48,7 @@ export class DatabaseService { static connectionFields: string[] = [ 'host', 'port', + 'connectionFamily', 'db', 'username', 'password', @@ -85,6 +87,39 @@ export class DatabaseService { ); } + /** + * Checks whether the endpoint (host/port) in the dto differs from the stored one. + * Unlike isEndpointAffected, this compares values so an unchanged host/port + * present in the payload is not treated as a change. + */ + static isEndpointChanged( + dto: UpdateDatabaseDto, + database: Database, + ): boolean { + return ( + (dto.host !== undefined && dto.host !== database.host) || + (dto.port !== undefined && dto.port !== database.port) + ); + } + + /** + * A database is considered managed when its endpoint is owned by a cloud + * provider (Redis Cloud subscription or Azure). For such databases the + * host/port are tied to provider metadata (cloudDetails/providerDetails) that + * would become stale if the endpoint were edited manually. + */ + static isManagedDatabase(database: Database): boolean { + return !!database.cloudDetails?.cloudId || !!database.providerDetails; + } + + /** + * Whether the database name is still the default "host:port" derived from its + * current endpoint (i.e. the user never set a custom alias). + */ + static hasDefaultEndpointName(database: Database): boolean { + return database.name === `${database.host}:${database.port}`; + } + private async merge( database: Database, dto: UpdateDatabaseDto, @@ -246,10 +281,34 @@ export class DatabaseService { this.logger.debug(`Updating database: ${id}`, sessionMetadata); const oldDatabase = await this.get(sessionMetadata, id, true); + if ( + DatabaseService.isEndpointChanged(dto, oldDatabase) && + DatabaseService.isManagedDatabase(oldDatabase) + ) { + throw new BadRequestException( + ERROR_MESSAGES.HOST_PORT_NOT_EDITABLE_FOR_MANAGED_DATABASE, + ); + } + + // When the name is still the default "host:port" and the endpoint changes, + // keep the name in sync with the new endpoint. Computed before merge (which + // mutates oldDatabase) and skipped when the caller sets a name explicitly or + // the user has a custom alias. + const syncedName = + dto.name === undefined && + DatabaseService.isEndpointChanged(dto, oldDatabase) && + DatabaseService.hasDefaultEndpointName(oldDatabase) + ? `${dto.host ?? oldDatabase.host}:${dto.port ?? oldDatabase.port}` + : undefined; + let database: Database; try { database = await this.merge(oldDatabase, dto); + if (syncedName !== undefined) { + database.name = syncedName; + } + if (DatabaseService.isConnectionAffected(dto)) { if (DatabaseService.isEndpointAffected(dto)) { database.provider = undefined; diff --git a/redisinsight/api/src/modules/database/dto/create.database.dto.ts b/redisinsight/api/src/modules/database/dto/create.database.dto.ts index 29469c0e38..1179a65f0e 100644 --- a/redisinsight/api/src/modules/database/dto/create.database.dto.ts +++ b/redisinsight/api/src/modules/database/dto/create.database.dto.ts @@ -55,6 +55,7 @@ export class CreateDatabaseDto extends PickType(Database, [ 'forceStandalone', 'keyNameFormat', 'environment', + 'connectionFamily', ] as const) { @ApiPropertyOptional({ description: 'CA Certificate', diff --git a/redisinsight/api/src/modules/database/entities/database.entity.ts b/redisinsight/api/src/modules/database/entities/database.entity.ts index 8c18b80be4..abb75002be 100644 --- a/redisinsight/api/src/modules/database/entities/database.entity.ts +++ b/redisinsight/api/src/modules/database/entities/database.entity.ts @@ -68,6 +68,13 @@ export enum Environment { Development = 'development', } +// IP protocol used to resolve the host: auto (dual-stack), IPv4, or IPv6. +export enum RedisConnectionFamily { + Auto = 'auto', + IPv4 = 'ipv4', + IPv6 = 'ipv6', +} + @Entity('database_instance') export class DatabaseEntity { @Expose() @@ -300,4 +307,8 @@ export class DatabaseEntity { @Expose() @Column({ nullable: false, default: Environment.Unspecified }) environment: Environment; + + @Expose() + @Column({ nullable: false, default: RedisConnectionFamily.Auto }) + connectionFamily: RedisConnectionFamily; } diff --git a/redisinsight/api/src/modules/database/models/database.ts b/redisinsight/api/src/modules/database/models/database.ts index 3626c27c14..62ac0d7fc5 100644 --- a/redisinsight/api/src/modules/database/models/database.ts +++ b/redisinsight/api/src/modules/database/models/database.ts @@ -9,6 +9,7 @@ import { Encoding, Environment, HostingProvider, + RedisConnectionFamily, } from 'src/modules/database/entities/database.entity'; import { IsBoolean, @@ -384,4 +385,20 @@ export class Database { }) @IsOptional() environment?: Environment = Environment.Unspecified; + + @ApiPropertyOptional({ + description: + 'IP protocol family to use when connecting. "auto" resolves both IPv4 and IPv6 (dual-stack), "ipv4" forces IPv4, "ipv6" forces IPv6.', + default: RedisConnectionFamily.Auto, + enum: RedisConnectionFamily, + enumName: 'RedisConnectionFamily', + }) + @Expose() + @IsEnum(RedisConnectionFamily, { + message: `connectionFamily must be a valid enum value. Valid values: ${Object.values( + RedisConnectionFamily, + )}.`, + }) + @IsOptional() + connectionFamily?: RedisConnectionFamily = RedisConnectionFamily.Auto; } diff --git a/redisinsight/api/src/modules/database/models/export-database.ts b/redisinsight/api/src/modules/database/models/export-database.ts index 60e923f7c0..290e9ef9cc 100644 --- a/redisinsight/api/src/modules/database/models/export-database.ts +++ b/redisinsight/api/src/modules/database/models/export-database.ts @@ -27,4 +27,5 @@ export class ExportDatabase extends PickType(Database, [ 'tags', 'providerDetails', 'environment', + 'connectionFamily', ] as const) {} diff --git a/redisinsight/api/src/modules/database/models/provider-details.ts b/redisinsight/api/src/modules/database/models/provider-details.ts index 0cedbe2b8c..e6a8d011f9 100644 --- a/redisinsight/api/src/modules/database/models/provider-details.ts +++ b/redisinsight/api/src/modules/database/models/provider-details.ts @@ -57,6 +57,18 @@ export class AzureProviderDetails { @IsString() azureAccountId?: string; + @ApiPropertyOptional({ + description: + 'Azure tenant the token was issued against. Used as the authority for ' + + 'silent token refresh so multi-tenant sign-ins keep refreshing against ' + + 'the correct tenant.', + type: String, + }) + @Expose() + @IsOptional() + @IsString() + tenantId?: string; + @ApiPropertyOptional({ description: 'Token expiration time for filtering during re-authentication', type: Date, diff --git a/redisinsight/api/src/modules/database/providers/database-info.provider.spec.ts b/redisinsight/api/src/modules/database/providers/database-info.provider.spec.ts index 9c95970426..1f557e7fc2 100644 --- a/redisinsight/api/src/modules/database/providers/database-info.provider.spec.ts +++ b/redisinsight/api/src/modules/database/providers/database-info.provider.spec.ts @@ -370,7 +370,7 @@ describe('DatabaseInfoProvider', () => { ); expect(result).toEqual([{ name: AdditionalRedisModuleName.RediSearch }]); }); - it('should return empty array if MODULE LIST and COMMAND command not allowed', async () => { + it('should return empty array if MODULE LIST, COMMAND INFO, and HELLO find no modules', async () => { when(standaloneClient.call) .calledWith(['module', 'list'], expect.anything()) .mockRejectedValue(mockUnknownCommandModule); @@ -380,11 +380,58 @@ describe('DatabaseInfoProvider', () => { expect.anything(), ) .mockRejectedValue(mockUnknownCommandModule); + when(standaloneClient.call) + .calledWith(['hello'], expect.anything()) + .mockRejectedValue(mockUnknownCommandModule); const result = await service.determineDatabaseModules(standaloneClient); expect(result).toEqual([]); }); + it('should detect modules from HELLO when MODULE LIST and COMMAND INFO are not allowed', async () => { + when(standaloneClient.call) + .calledWith(['module', 'list'], expect.anything()) + .mockRejectedValue(mockUnknownCommandModule); + when(standaloneClient.call) + .calledWith( + expect.arrayContaining(['command', 'info']), + expect.anything(), + ) + .mockRejectedValue(mockUnknownCommandModule); + when(standaloneClient.call) + .calledWith(['hello'], expect.anything()) + .mockResolvedValue([ + 'server', + 'redis', + 'version', + '7.4.0', + 'modules', + [ + ['name', 'timeseries', 'ver', 11000], + ['name', 'search', 'ver', 21000], + ], + ]); + + const result = await service.determineDatabaseModules(standaloneClient); + + expect(standaloneClient.call).toHaveBeenCalledWith( + ['hello'], + expect.anything(), + ); + expect(standaloneClient.getInfo).not.toHaveBeenCalled(); + expect(result).toEqual([ + { + name: AdditionalRedisModuleName.RedisTimeSeries, + version: 11000, + semanticVersion: '1.10.0', + }, + { + name: AdditionalRedisModuleName.RediSearch, + version: 21000, + semanticVersion: '2.10.0', + }, + ]); + }); }); describe('determineDatabaseServer', () => { diff --git a/redisinsight/api/src/modules/database/providers/database-info.provider.ts b/redisinsight/api/src/modules/database/providers/database-info.provider.ts index ce573a9e36..c093543892 100644 --- a/redisinsight/api/src/modules/database/providers/database-info.provider.ts +++ b/redisinsight/api/src/modules/database/providers/database-info.provider.ts @@ -9,7 +9,10 @@ import { import { AdditionalRedisModule } from 'src/modules/database/models/additional.redis.module'; import { REDIS_MODULES_COMMANDS, SUPPORTED_REDIS_MODULES } from 'src/constants'; import { get, isNil } from 'lodash'; -import { RedisDatabaseInfoResponse } from 'src/modules/database/dto/redis-info.dto'; +import { + RedisDatabaseInfoResponse, + RedisDatabaseModuleDto, +} from 'src/modules/database/dto/redis-info.dto'; import { FeatureService } from 'src/modules/feature/feature.service'; import { KnownFeatures } from 'src/modules/feature/constants'; import { @@ -73,15 +76,13 @@ export class DatabaseInfoProvider { reply.map((module: any[]) => convertArrayReplyToObject(module)), ); - return modules.map(({ name, ver }) => ({ - name: SUPPORTED_REDIS_MODULES[name] ?? name, - version: ver, - semanticVersion: SUPPORTED_REDIS_MODULES[name] - ? convertIntToSemanticVersion(ver) - : undefined, - })); + return this.mapToAdditionalRedisModules(modules); } catch (e) { - return this.determineDatabaseModulesUsingInfo(client); + const fromCommands = await this.determineDatabaseModulesUsingInfo(client); + if (fromCommands.length) { + return fromCommands; + } + return this.determineDatabaseModulesUsingHello(client); } } @@ -131,6 +132,82 @@ export class DatabaseInfoProvider { ); } + /** + * Determine database modules from HELLO when MODULE LIST and COMMAND INFO + * are unavailable (e.g. restricted ACL users). + * @param client + * @private + */ + public async determineDatabaseModulesUsingHello( + client: RedisClient, + ): Promise { + try { + const rawModules = await this.getModulesFromHello(client); + + if (!rawModules.length) { + return []; + } + + const modules = await this.filterRawModules( + client.clientMetadata.sessionMetadata, + rawModules, + ); + + return this.mapToAdditionalRedisModules(modules); + } catch (e) { + return []; + } + } + + private mapToAdditionalRedisModules( + modules: RedisDatabaseModuleDto[], + ): AdditionalRedisModule[] { + return modules.map(({ name, ver }) => { + const moduleName = String(name); + const supportedName = + SUPPORTED_REDIS_MODULES[ + moduleName as keyof typeof SUPPORTED_REDIS_MODULES + ]; + + return { + name: supportedName ?? moduleName, + version: ver, + semanticVersion: + supportedName && ver != null + ? convertIntToSemanticVersion(ver) + : undefined, + }; + }); + } + + private async getModulesFromHello( + client: RedisClient, + ): Promise { + try { + const helloResponse = (await client.call(['hello'], { + replyEncoding: 'utf8', + })) as string[]; + const helloInfo = convertArrayReplyToObject(helloResponse); + + if (!Array.isArray(helloInfo.modules)) { + return []; + } + + return helloInfo.modules + .map((module) => + Array.isArray(module) ? convertArrayReplyToObject(module) : module, + ) + .filter( + (module) => + module && + typeof module === 'object' && + typeof (module as RedisDatabaseModuleDto).name === 'string', + ) as RedisDatabaseModuleDto[]; + } catch { + return []; + } + } + public async getRedisDBSize(client: RedisClient): Promise { if (client.getConnectionType() === RedisClientConnectionType.CLUSTER) { const nodesResult: number[] = await Promise.all( diff --git a/redisinsight/api/src/modules/database/repositories/local.database.repository.ts b/redisinsight/api/src/modules/database/repositories/local.database.repository.ts index 09b5320e44..164cfc5df1 100644 --- a/redisinsight/api/src/modules/database/repositories/local.database.repository.ts +++ b/redisinsight/api/src/modules/database/repositories/local.database.repository.ts @@ -130,6 +130,7 @@ export class LocalDatabaseRepository extends DatabaseRepository { 'cd', 'd.createdAt', 'd.environment', + 'd.connectionFamily', 'tags', ]) .getMany(); diff --git a/redisinsight/api/src/modules/feature/constants/index.ts b/redisinsight/api/src/modules/feature/constants/index.ts index a3324283f6..7be7eb831b 100644 --- a/redisinsight/api/src/modules/feature/constants/index.ts +++ b/redisinsight/api/src/modules/feature/constants/index.ts @@ -33,15 +33,14 @@ export enum KnownFeatures { EnhancedCloudUI = 'enhancedCloudUI', DatabaseManagement = 'databaseManagement', CustomTutorials = 'customTutorials', - VectorSearchV2 = 'vectorSearchV2', AzureEntraId = 'azureEntraId', DevAzureEntraId = 'dev-azureEntraId', DevBrowser = 'dev-browser', - VectorSet = 'vectorSet', - DevArray = 'dev-array', - ProdMode = 'prodMode', + Array = 'array', DevLanguage = 'dev-language', - WhatsNew = 'whatsNew', + VectorSearchEnhancements = 'vectorSearchEnhancements', + ValueDecoder = 'valueDecoder', + AppUpdateStrategySettings = 'appUpdateStrategySettings', } export interface IFeatureFlag { diff --git a/redisinsight/api/src/modules/feature/constants/known-features.ts b/redisinsight/api/src/modules/feature/constants/known-features.ts index 5ef96a5599..e33d147678 100644 --- a/redisinsight/api/src/modules/feature/constants/known-features.ts +++ b/redisinsight/api/src/modules/feature/constants/known-features.ts @@ -70,11 +70,6 @@ export const knownFeatures: Record = { flag: SERVER_CONFIG.customTutorials, }), }, - [KnownFeatures.VectorSearchV2]: { - name: KnownFeatures.VectorSearchV2, - storage: FeatureStorage.Database, - }, - [KnownFeatures.AzureEntraId]: { name: KnownFeatures.AzureEntraId, storage: FeatureStorage.Database, @@ -87,24 +82,24 @@ export const knownFeatures: Record = { name: KnownFeatures.DevBrowser, storage: FeatureStorage.Database, }, - [KnownFeatures.VectorSet]: { - name: KnownFeatures.VectorSet, + [KnownFeatures.Array]: { + name: KnownFeatures.Array, storage: FeatureStorage.Database, }, - [KnownFeatures.DevArray]: { - name: KnownFeatures.DevArray, + [KnownFeatures.DevLanguage]: { + name: KnownFeatures.DevLanguage, storage: FeatureStorage.Database, }, - [KnownFeatures.ProdMode]: { - name: KnownFeatures.ProdMode, + [KnownFeatures.VectorSearchEnhancements]: { + name: KnownFeatures.VectorSearchEnhancements, storage: FeatureStorage.Database, }, - [KnownFeatures.DevLanguage]: { - name: KnownFeatures.DevLanguage, + [KnownFeatures.ValueDecoder]: { + name: KnownFeatures.ValueDecoder, storage: FeatureStorage.Database, }, - [KnownFeatures.WhatsNew]: { - name: KnownFeatures.WhatsNew, + [KnownFeatures.AppUpdateStrategySettings]: { + name: KnownFeatures.AppUpdateStrategySettings, storage: FeatureStorage.Database, }, }; diff --git a/redisinsight/api/src/modules/feature/providers/feature-flag/feature-flag.provider.ts b/redisinsight/api/src/modules/feature/providers/feature-flag/feature-flag.provider.ts index 5169c2c3ca..94584a9f52 100644 --- a/redisinsight/api/src/modules/feature/providers/feature-flag/feature-flag.provider.ts +++ b/redisinsight/api/src/modules/feature/providers/feature-flag/feature-flag.provider.ts @@ -88,13 +88,6 @@ export class FeatureFlagProvider { this.settingsService, ), ); - this.strategies.set( - KnownFeatures.VectorSearchV2, - new SwitchableFlagStrategy( - this.featuresConfigService, - this.settingsService, - ), - ); this.strategies.set( KnownFeatures.AzureEntraId, new CommonFlagStrategy(this.featuresConfigService, this.settingsService), @@ -104,29 +97,32 @@ export class FeatureFlagProvider { new CommonFlagStrategy(this.featuresConfigService, this.settingsService), ); this.strategies.set( - KnownFeatures.VectorSet, - new CommonFlagStrategy(this.featuresConfigService, this.settingsService), + KnownFeatures.Array, + new SwitchableFlagStrategy( + this.featuresConfigService, + this.settingsService, + ), ); this.strategies.set( - KnownFeatures.DevArray, + KnownFeatures.DevLanguage, new SwitchableFlagStrategy( this.featuresConfigService, this.settingsService, ), ); this.strategies.set( - KnownFeatures.ProdMode, + KnownFeatures.ValueDecoder, new CommonFlagStrategy(this.featuresConfigService, this.settingsService), ); this.strategies.set( - KnownFeatures.DevLanguage, + KnownFeatures.VectorSearchEnhancements, new SwitchableFlagStrategy( this.featuresConfigService, this.settingsService, ), ); this.strategies.set( - KnownFeatures.WhatsNew, + KnownFeatures.AppUpdateStrategySettings, new CommonFlagStrategy(this.featuresConfigService, this.settingsService), ); } diff --git a/redisinsight/api/src/modules/notification/repositories/local.notification.repository.spec.ts b/redisinsight/api/src/modules/notification/repositories/local.notification.repository.spec.ts index 99146b1698..0df30f1240 100644 --- a/redisinsight/api/src/modules/notification/repositories/local.notification.repository.spec.ts +++ b/redisinsight/api/src/modules/notification/repositories/local.notification.repository.spec.ts @@ -58,11 +58,13 @@ describe('LocalNotificationRepository', () => { }); }); describe('readNotifications', () => { - it('should read all notifications', async () => { + it('should read all notifications without an empty where clause', async () => { repository.createQueryBuilder().execute.mockResolvedValueOnce(undefined); expect(await service.readNotifications(mockSessionMetadata)).toEqual([]); - expect(repository.createQueryBuilder().where).toHaveBeenCalledWith({}); + // Empty criteria must NOT call .where({}) — since TypeORM 0.3.31 that + // throws; the update intentionally affects all rows instead. + expect(repository.createQueryBuilder().where).not.toHaveBeenCalled(); }); it('should read particular notification by timestamp', async () => { repository.createQueryBuilder().execute.mockResolvedValueOnce(undefined); diff --git a/redisinsight/api/src/modules/notification/repositories/local.notification.repository.ts b/redisinsight/api/src/modules/notification/repositories/local.notification.repository.ts index fc798c8c05..b4be547ed4 100644 --- a/redisinsight/api/src/modules/notification/repositories/local.notification.repository.ts +++ b/redisinsight/api/src/modules/notification/repositories/local.notification.repository.ts @@ -56,12 +56,19 @@ export class LocalNotificationRepository extends NotificationRepository { query.timestamp = timestamp; } - await this.repository + const queryBuilder = this.repository .createQueryBuilder('n') .update() - .where(query) - .set({ read: true }) - .execute(); + .set({ read: true }); + + // An empty criteria intentionally marks all notifications as read. + // Since TypeORM 0.3.31 an empty `.where({})` throws on update/delete, + // so only apply the WHERE clause when there is something to filter by. + if (Object.keys(query).length) { + queryBuilder.where(query); + } + + await queryBuilder.execute(); return []; } diff --git a/redisinsight/api/src/modules/profiler/models/log-file.spec.ts b/redisinsight/api/src/modules/profiler/models/log-file.spec.ts index 89d96c1a8c..1169c8f134 100644 --- a/redisinsight/api/src/modules/profiler/models/log-file.spec.ts +++ b/redisinsight/api/src/modules/profiler/models/log-file.spec.ts @@ -87,23 +87,30 @@ describe('LogFile', () => { ); }); - it('addProfilerClient + removeProfilerClient', async () => { - logFile['destroy'] = jest.fn(); - - expect(logFile['clientObservers'].size).toEqual(0); - logFile.addProfilerClient(mockSocket.id); - expect(logFile['clientObservers'].size).toEqual(1); - expect(logFile['idleSince']).toEqual(0); - logFile.removeProfilerClient('007'); - expect(logFile['clientObservers'].size).toEqual(1); - expect(logFile['idleSince']).toEqual(0); - logFile.removeProfilerClient(mockSocket.id); - expect(logFile['clientObservers'].size).toEqual(0); - expect(logFile['idleSince']).toBeGreaterThan(0); - expect(logFile.destroy).not.toHaveBeenCalled(); - // wait until idle threshold pass (2sec for test env) - await new Promise((resolve) => setTimeout(resolve, 3000)); - expect(logFile.destroy).toHaveBeenCalled(); + it('addProfilerClient + removeProfilerClient', () => { + jest.useFakeTimers(); + + try { + logFile['destroy'] = jest.fn(); + + expect(logFile['clientObservers'].size).toEqual(0); + logFile.addProfilerClient(mockSocket.id); + expect(logFile['clientObservers'].size).toEqual(1); + expect(logFile['idleSince']).toEqual(0); + logFile.removeProfilerClient('007'); + expect(logFile['clientObservers'].size).toEqual(1); + expect(logFile['idleSince']).toEqual(0); + logFile.removeProfilerClient(mockSocket.id); + expect(logFile['clientObservers'].size).toEqual(0); + expect(logFile['idleSince']).toBeGreaterThan(0); + expect(logFile.destroy).not.toHaveBeenCalled(); + + jest.advanceTimersByTime(config.get('profiler').logFileIdleThreshold); + + expect(logFile.destroy).toHaveBeenCalled(); + } finally { + jest.useRealTimers(); + } }); it('destroy', async () => { diff --git a/redisinsight/api/src/modules/redis/connection/ioredis.redis.connection.strategy.ts b/redisinsight/api/src/modules/redis/connection/ioredis.redis.connection.strategy.ts index c507c3adee..461cfad73e 100644 --- a/redisinsight/api/src/modules/redis/connection/ioredis.redis.connection.strategy.ts +++ b/redisinsight/api/src/modules/redis/connection/ioredis.redis.connection.strategy.ts @@ -15,7 +15,7 @@ import { SentinelIoredisClient, ClusterIoredisClient, } from 'src/modules/redis/client'; -import { discoverClusterNodes } from 'src/modules/redis/utils'; +import { discoverClusterNodes, getIpFamily } from 'src/modules/redis/utils'; import { SshTunnel } from 'src/modules/ssh/models/ssh-tunnel'; import { getRedisConnectionException } from 'src/utils'; import { ReplyError } from 'src/models'; @@ -46,13 +46,22 @@ export class IoredisRedisConnectionStrategy extends RedisConnectionStrategy { database: Database, options: IRedisConnectionOptions, ): Promise { - const { host, port, password, username, tls, db, timeout } = database; + const { + host, + port, + password, + username, + tls, + db, + timeout, + connectionFamily, + } = database; const redisOptions: RedisOptions = { host, port, username, password, - family: 0, // Enable dual-stack IPv4/IPv6 (auto-detect) + family: getIpFamily(connectionFamily), connectTimeout: timeout, db: isNumber(clientMetadata.db) ? clientMetadata.db : db, connectionName: diff --git a/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.spec.ts b/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.spec.ts index 1e3bf041a5..cf60c58cc0 100644 --- a/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.spec.ts +++ b/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.spec.ts @@ -8,6 +8,7 @@ import { import { SshTunnelProvider } from 'src/modules/ssh/ssh-tunnel.provider'; import { NodeRedisConnectionStrategy } from 'src/modules/redis/connection/node.redis.connection.strategy'; import { StandaloneNodeRedisClient } from 'src/modules/redis/client/node-redis/standalone.node-redis.client'; +import { RedisConnectionFamily } from 'src/modules/database/entities/database.entity'; jest.mock('redis', () => ({ ...jest.requireActual('redis'), @@ -39,12 +40,16 @@ describe('NodeRedisConnectionStrategy', () => { }); describe('createStandaloneClient', () => { - it('should include family: 0 in socket options for dual-stack IPv4/IPv6 support', async () => { + const mockCreateClient = () => { const mockClient = { on: jest.fn().mockReturnThis(), connect: jest.fn().mockResolvedValue(undefined), }; createClientSpy.mockReturnValue(mockClient); + }; + + it('should default to family: 0 (dual-stack IPv4/IPv6) when not set', async () => { + mockCreateClient(); const result = await service.createStandaloneClient( mockClientMetadata, @@ -61,5 +66,37 @@ describe('NodeRedisConnectionStrategy', () => { }), ); }); + + it('should map connection family IPv4 to socket family: 4', async () => { + mockCreateClient(); + + await service.createStandaloneClient( + mockClientMetadata, + { ...mockDatabase, connectionFamily: RedisConnectionFamily.IPv4 }, + {}, + ); + + expect(createClientSpy).toHaveBeenCalledWith( + expect.objectContaining({ + socket: expect.objectContaining({ family: 4 }), + }), + ); + }); + + it('should map connection family IPv6 to socket family: 6', async () => { + mockCreateClient(); + + await service.createStandaloneClient( + mockClientMetadata, + { ...mockDatabase, connectionFamily: RedisConnectionFamily.IPv6 }, + {}, + ); + + expect(createClientSpy).toHaveBeenCalledWith( + expect.objectContaining({ + socket: expect.objectContaining({ family: 6 }), + }), + ); + }); }); }); diff --git a/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.ts b/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.ts index ce5eb2564a..d95d684d46 100644 --- a/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.ts +++ b/redisinsight/api/src/modules/redis/connection/node.redis.connection.strategy.ts @@ -14,7 +14,7 @@ import { ConnectionOptions } from 'tls'; import { ClusterNodeRedisClient, RedisClient } from 'src/modules/redis/client'; import { StandaloneNodeRedisClient } from 'src/modules/redis/client/node-redis/standalone.node-redis.client'; import { SshTunnel } from 'src/modules/ssh/models/ssh-tunnel'; -import { discoverClusterNodes } from 'src/modules/redis/utils'; +import { discoverClusterNodes, getIpFamily } from 'src/modules/redis/utils'; const REDIS_CLIENTS_CONFIG = serverConfig.get('redis_clients'); @@ -43,7 +43,16 @@ export class NodeRedisConnectionStrategy extends RedisConnectionStrategy { database: Database, options: IRedisConnectionOptions, ): Promise { - const { host, port, password, username, tls, db, timeout } = database; + const { + host, + port, + password, + username, + tls, + db, + timeout, + connectionFamily, + } = database; let tlsOptions = {}; if (tls) { @@ -57,7 +66,7 @@ export class NodeRedisConnectionStrategy extends RedisConnectionStrategy { socket: { host, port, - family: 0, // Enable dual-stack IPv4/IPv6 (auto-detect) + family: getIpFamily(connectionFamily), connectTimeout: timeout, ...tlsOptions, reconnectStrategy: options?.useRetry diff --git a/redisinsight/api/src/modules/redis/utils/cluster.util.spec.ts b/redisinsight/api/src/modules/redis/utils/cluster.util.spec.ts index 2ea3d1fb4d..281ee65d02 100644 --- a/redisinsight/api/src/modules/redis/utils/cluster.util.spec.ts +++ b/redisinsight/api/src/modules/redis/utils/cluster.util.spec.ts @@ -1,10 +1,11 @@ import { mockRedisClusterFailInfoResponse, - mockRedisClusterNodesResponse, mockRedisClusterOkInfoResponse, mockStandaloneRedisClient, + generateMockRedisClient, } from 'src/__mocks__'; import { IRedisClusterNodeAddress, ReplyError } from 'src/models'; +import { RedisClusterSlotsReply } from 'src/modules/redis/utils/reply.util'; import { isCluster, discoverClusterNodes } from './cluster.util'; describe('isCluster', () => { @@ -32,25 +33,22 @@ describe('isCluster', () => { }); describe('discoverClusterNodes', () => { - const mockClusterNodeAddresses: IRedisClusterNodeAddress[] = [ - { - host: '127.0.0.1', - port: 30004, - }, - { - host: '127.0.0.1', - port: 30001, - }, - ]; - - it('should return nodes in a defined format', async () => { - mockStandaloneRedisClient.sendCommand.mockResolvedValue( - mockRedisClusterNodesResponse, - ); + it('should return nodes in a defined format, using the ip when it is the preferred endpoint', async () => { + const slots: RedisClusterSlotsReply = [ + [0, 5460, ['127.0.0.1', 30004, 'node-1']], + [5461, 16383, ['127.0.0.1', 30001, 'node-2']], + ]; + mockStandaloneRedisClient.sendCommand.mockResolvedValue(slots); + + const expected: IRedisClusterNodeAddress[] = [ + { host: '127.0.0.1', port: 30004 }, + { host: '127.0.0.1', port: 30001 }, + ]; expect(await discoverClusterNodes(mockStandaloneRedisClient)).toEqual( - mockClusterNodeAddresses, + expected, ); }); + it('cluster not supported', async () => { const replyError: ReplyError = { name: 'ReplyError', @@ -66,4 +64,99 @@ describe('discoverClusterNodes', () => { expect(err).toEqual(replyError); } }); + + it('should use the announced hostname as root node address when it is the resolved preferred endpoint', async () => { + // Reproduces https://github.com/redis/RedisInsight/issues/5393, + // https://github.com/redis/RedisInsight/issues/3416 and + // https://github.com/redis/RedisInsight/issues/3429: nodes behind + // per-node load balancers / NAT announce a client-facing hostname + // because their raw ip is not routable to RedisInsight, and the + // server resolves `cluster-preferred-endpoint-type hostname` into + // CLUSTER SLOTS' preferred-endpoint field. + const slots: RedisClusterSlotsReply = [ + [0, 16383, ['node-1.redis.example.com', 7379, 'node-1']], + ]; + mockStandaloneRedisClient.sendCommand.mockResolvedValue(slots); + + expect(await discoverClusterNodes(mockStandaloneRedisClient)).toEqual([ + { host: 'node-1.redis.example.com', port: 7379 }, + ]); + }); + + it('should use the ip, not an announced hostname, when the preferred endpoint type is ip', async () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3546234089: + // a node can announce a hostname as metadata while + // `cluster-preferred-endpoint-type` still resolves to `ip` - the raw ip + // must be used in that case even though a hostname exists. + const slots: RedisClusterSlotsReply = [ + [0, 16383, ['10.0.161.40', 7379, 'node-1']], + ]; + mockStandaloneRedisClient.sendCommand.mockResolvedValue(slots); + + expect(await discoverClusterNodes(mockStandaloneRedisClient)).toEqual([ + { host: '10.0.161.40', port: 7379 }, + ]); + }); + + it('should fall back to the host used to connect when a node has an unknown (null) endpoint', async () => { + const client = generateMockRedisClient( + { databaseId: 'unknown-endpoint-test' }, + undefined, + { host: '203.0.113.10', port: 6379 }, + ); + const slots: RedisClusterSlotsReply = [[0, 16383, [null, 6379, 'node-1']]]; + client.sendCommand = jest.fn().mockResolvedValue(slots); + + expect(await discoverClusterNodes(client)).toEqual([ + { host: '203.0.113.10', port: 6379 }, + ]); + }); + + it('should still discover nodes from a pre-4.0.0 cluster reply with no node id', async () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3551046293 + const slots = [ + [0, 5460, ['127.0.0.1', 30001]], + [5461, 16383, ['127.0.0.1', 30002]], + ] as unknown as RedisClusterSlotsReply; + mockStandaloneRedisClient.sendCommand.mockResolvedValue(slots); + + expect(await discoverClusterNodes(mockStandaloneRedisClient)).toEqual([ + { host: '127.0.0.1', port: 30001 }, + { host: '127.0.0.1', port: 30002 }, + ]); + }); + + it('should skip a node whose endpoint is the "?" misconfigured marker', async () => { + const slots: RedisClusterSlotsReply = [ + [ + 0, + 16383, + ['?', 6379, 'node-1'], + ['node-2.redis.example.com', 6380, 'node-2'], + ], + ]; + mockStandaloneRedisClient.sendCommand.mockResolvedValue(slots); + + expect(await discoverClusterNodes(mockStandaloneRedisClient)).toEqual([ + { host: 'node-2.redis.example.com', port: 6380 }, + ]); + }); + + it('should fall back to the connection entrypoint when every node is the "?" misconfigured marker', async () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3629962716: + // CLUSTER SLOTS omits unassigned-slot / '?' nodes entirely, so a + // partially-configured cluster can resolve to an empty node list; keep + // the discovery entrypoint as a seed instead of returning no root nodes. + const client = generateMockRedisClient( + { databaseId: 'all-misconfigured-test' }, + undefined, + { host: '203.0.113.10', port: 6379 }, + ); + const slots: RedisClusterSlotsReply = [[0, 16383, ['?', 6379, 'node-1']]]; + client.sendCommand = jest.fn().mockResolvedValue(slots); + + expect(await discoverClusterNodes(client)).toEqual([ + { host: '203.0.113.10', port: 6379 }, + ]); + }); }); diff --git a/redisinsight/api/src/modules/redis/utils/cluster.util.ts b/redisinsight/api/src/modules/redis/utils/cluster.util.ts index ac43e7a2c5..770400bfff 100644 --- a/redisinsight/api/src/modules/redis/utils/cluster.util.ts +++ b/redisinsight/api/src/modules/redis/utils/cluster.util.ts @@ -1,12 +1,10 @@ import { RedisClient } from 'src/modules/redis/client'; import { convertMultilineReplyToObject, - parseNodesFromClusterInfoReply, + parseNodesFromClusterSlotsReply, + RedisClusterSlotsReply, } from 'src/modules/redis/utils/reply.util'; -import { - IRedisClusterNodeAddress, - RedisClusterNodeLinkState, -} from 'src/models'; +import { IRedisClusterNodeAddress } from 'src/models'; /** * Check weather database is a cluster @@ -30,20 +28,31 @@ export const isCluster = async (client: RedisClient): Promise => { }; /** - * Discover all cluster nodes for current connection + * Discover all cluster nodes for current connection. + * + * Uses "CLUSTER SLOTS" rather than "CLUSTER NODES": each node's preferred + * connection address there is already resolved server-side according to + * the `cluster-preferred-endpoint-type` config (ip / hostname / + * unknown-endpoint), so clusters behind per-node load balancers or NAT + * (where the raw ip is not routable to clients) remain reachable without + * the client re-deriving an ip-vs-hostname preference itself - which + * "CLUSTER NODES" has no way to express correctly, since it only exposes + * the announced hostname as unconditional metadata, not the server's + * actual preference. * @param client */ export const discoverClusterNodes = async ( client: RedisClient, ): Promise => { - const nodes = parseNodesFromClusterInfoReply( - (await client.sendCommand(['cluster', 'nodes'], { - replyEncoding: 'utf8', - })) as string, - ).filter((node) => node.linkState === RedisClusterNodeLinkState.Connected); + const slots = (await client.sendCommand(['cluster', 'slots'], { + replyEncoding: 'utf8', + })) as RedisClusterSlotsReply; - return nodes.map((node) => ({ - host: node.host, - port: node.port, - })); + const nodes = parseNodesFromClusterSlotsReply(slots, client.options?.host); + if (!nodes.length && client.options?.host && client.options?.port) { + // CLUSTER SLOTS omits unassigned-slot / '?' nodes; keep the discovery + // entrypoint as a seed so a partially-configured cluster still connects. + return [{ host: client.options.host, port: client.options.port }]; + } + return nodes; }; diff --git a/redisinsight/api/src/modules/redis/utils/family.util.spec.ts b/redisinsight/api/src/modules/redis/utils/family.util.spec.ts new file mode 100644 index 0000000000..9f4fb855c4 --- /dev/null +++ b/redisinsight/api/src/modules/redis/utils/family.util.spec.ts @@ -0,0 +1,20 @@ +import { RedisConnectionFamily } from 'src/modules/database/entities/database.entity'; +import { getIpFamily } from './family.util'; + +describe('getIpFamily', () => { + it.each([ + [RedisConnectionFamily.Auto, 0], + [RedisConnectionFamily.IPv4, 4], + [RedisConnectionFamily.IPv6, 6], + ])('should map %s to numeric family %s', (family, expected) => { + expect(getIpFamily(family)).toEqual(expected); + }); + + it('should fall back to auto (0) when family is undefined', () => { + expect(getIpFamily(undefined)).toEqual(0); + }); + + it('should fall back to auto (0) for an unknown value', () => { + expect(getIpFamily('unknown' as RedisConnectionFamily)).toEqual(0); + }); +}); diff --git a/redisinsight/api/src/modules/redis/utils/family.util.ts b/redisinsight/api/src/modules/redis/utils/family.util.ts new file mode 100644 index 0000000000..e13bf150eb --- /dev/null +++ b/redisinsight/api/src/modules/redis/utils/family.util.ts @@ -0,0 +1,13 @@ +import { RedisConnectionFamily } from 'src/modules/database/entities/database.entity'; + +// Numeric `family` option accepted by ioredis / node-redis: +// 0 = auto (dual-stack), 4 = IPv4, 6 = IPv6. +const FAMILY_MAP: Record = { + [RedisConnectionFamily.Auto]: 0, + [RedisConnectionFamily.IPv4]: 4, + [RedisConnectionFamily.IPv6]: 6, +}; + +// Falls back to auto (dual-stack) for missing or unknown values. +export const getIpFamily = (family?: RedisConnectionFamily): 0 | 4 | 6 => + (family && FAMILY_MAP[family]) ?? 0; diff --git a/redisinsight/api/src/modules/redis/utils/index.ts b/redisinsight/api/src/modules/redis/utils/index.ts index 3366abc9a3..e76eba0ebe 100644 --- a/redisinsight/api/src/modules/redis/utils/index.ts +++ b/redisinsight/api/src/modules/redis/utils/index.ts @@ -2,3 +2,4 @@ export * from './reply.util'; export * from './keys.util'; export * from './sentinel.util'; export * from './cluster.util'; +export * from './family.util'; diff --git a/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts b/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts index bc9e78f7e2..1f7c6aff72 100644 --- a/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts +++ b/redisinsight/api/src/modules/redis/utils/reply.util.spec.ts @@ -1,14 +1,12 @@ -import { - mockRedisClusterNodesResponse, - mockRedisClusterNodesResponseIPv6, - mockRedisServerInfoResponse, -} from 'src/__mocks__'; +import { mockRedisServerInfoResponse } from 'src/__mocks__'; import { flatMap } from 'lodash'; -import { IRedisClusterNode, RedisClusterNodeLinkState } from 'src/models'; import { convertArrayReplyToObject, convertMultilineReplyToObject, - parseNodesFromClusterInfoReply, + parseNodesFromClusterSlotsReply, + RedisClusterSlotsReply, + resolvePreferredEndpoint, + UNKNOWN_ENDPOINT_MARKER, } from './reply.util'; const mockRedisServerInfo = { @@ -20,45 +18,6 @@ const mockRedisServerInfo = { uptime_in_seconds: '1000', }; -const mockRedisClusterNodes: IRedisClusterNode[] = [ - { - id: '07c37dfeb235213a872192d90877d0cd55635b91', - host: '127.0.0.1', - port: 30004, - replicaOf: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', - linkState: RedisClusterNodeLinkState.Connected, - slot: undefined, - }, - { - id: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', - host: '127.0.0.1', - port: 30001, - replicaOf: undefined, - linkState: RedisClusterNodeLinkState.Connected, - slot: '0-16383', - }, -]; - -// IPv6 expected results -const mockRedisClusterNodesIPv6: IRedisClusterNode[] = [ - { - id: '07c37dfeb235213a872192d90877d0cd55635b91', - host: '2001:db8::1', - port: 7001, - replicaOf: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', - linkState: RedisClusterNodeLinkState.Connected, - slot: undefined, - }, - { - id: 'e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca', - host: '2001:db8::2', - port: 7002, - replicaOf: undefined, - linkState: RedisClusterNodeLinkState.Connected, - slot: '0-16383', - }, -]; - const mockIncorrectString = '$6\r\nfoobar\r\n'; describe('convertArrayReplyToObject', () => { @@ -94,24 +53,178 @@ describe('convertMultilineReplyToObject', () => { }); }); -describe('parseNodesFromClusterInfoReply', () => { - it('should return array object in a defined format', async () => { - const result = parseNodesFromClusterInfoReply( - mockRedisClusterNodesResponse, +describe('resolvePreferredEndpoint', () => { + it('should use the preferred endpoint as-is when it is a normal ip', () => { + expect(resolvePreferredEndpoint('172.31.100.211', 'fallback')).toEqual( + '172.31.100.211', ); + }); + it('should use the preferred endpoint as-is when it is a normal hostname', () => { + expect( + resolvePreferredEndpoint('node-1.redis.example.com', 'fallback'), + ).toEqual('node-1.redis.example.com'); + }); + it('should fall back to the command host when endpoint is null (unknown endpoint)', () => { + expect(resolvePreferredEndpoint(null, '10.0.0.1')).toEqual('10.0.0.1'); + }); + it('should fall back to the command host when endpoint is an empty string', () => { + expect(resolvePreferredEndpoint('', '10.0.0.1')).toEqual('10.0.0.1'); + }); + it('should return undefined when endpoint is null and there is no fallback host', () => { + expect(resolvePreferredEndpoint(null, undefined)).toBeUndefined(); + }); + it('should return undefined for the "?" misconfigured-node marker, ignoring the fallback host', () => { + expect( + resolvePreferredEndpoint(UNKNOWN_ENDPOINT_MARKER, '10.0.0.1'), + ).toBeUndefined(); + }); +}); - expect(result).toEqual(mockRedisClusterNodes); +describe('parseNodesFromClusterSlotsReply', () => { + it('should use the ip as-is when cluster-preferred-endpoint-type is ip (default)', () => { + const slots: RedisClusterSlotsReply = [ + [0, 5460, ['172.31.100.211', 6379, 'node-1']], + [5461, 10922, ['172.31.100.212', 6379, 'node-2']], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: '172.31.100.211', port: 6379 }, + { host: '172.31.100.212', port: 6379 }, + ]); }); - it('should return empty array when incorrect string passed', async () => { - const result = parseNodesFromClusterInfoReply(mockIncorrectString); - expect(result).toEqual([]); + it('should use the announced hostname when it is the resolved preferred endpoint', () => { + const slots: RedisClusterSlotsReply = [ + [0, 16383, ['node-1.redis.example.com', 7379, 'node-1']], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: 'node-1.redis.example.com', port: 7379 }, + ]); + }); + + it('should use the ip even when the node also announces a hostname, when the preferred endpoint is the ip', () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3546234089: + // `cluster-announce-hostname` alone does not mean hostname is preferred - + // `cluster-preferred-endpoint-type` decides that, and CLUSTER SLOTS' + // first field already reflects the resolved decision. A node can + // announce a hostname purely as metadata while the preferred endpoint + // (what we must actually use) stays the ip. + const slots: RedisClusterSlotsReply = [ + [0, 16383, ['10.0.161.40', 7379, 'node-1']], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: '10.0.161.40', port: 7379 }, + ]); + }); + + it('should use an IPv6 preferred endpoint as-is', () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3629961342: + // the removed CLUSTER NODES parser had explicit IPv6 coverage; the + // preferred endpoint is used verbatim regardless of address family, so + // an IPv6 literal must pass through unchanged, same as an IPv4 one. + const slots: RedisClusterSlotsReply = [ + [0, 16383, ['2001:db8::1', 7001, 'node-1']], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: '2001:db8::1', port: 7001 }, + ]); + }); + + it('should fall back to the command host for an unknown (null) endpoint', () => { + const slots: RedisClusterSlotsReply = [[0, 16383, [null, 6379, 'node-1']]]; + + expect(parseNodesFromClusterSlotsReply(slots, '203.0.113.10')).toEqual([ + { host: '203.0.113.10', port: 6379 }, + ]); + }); + + it('should fall back to the command host for an unknown (empty string) endpoint', () => { + const slots: RedisClusterSlotsReply = [[0, 16383, ['', 6379, 'node-1']]]; + + expect(parseNodesFromClusterSlotsReply(slots, '203.0.113.10')).toEqual([ + { host: '203.0.113.10', port: 6379 }, + ]); + }); + + it('should skip a node whose endpoint is the "?" misconfigured marker', () => { + const slots: RedisClusterSlotsReply = [ + [ + 0, + 16383, + [UNKNOWN_ENDPOINT_MARKER, 6379, 'node-1'], + ['node-2.redis.example.com', 6380, 'node-2'], + ], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: 'node-2.redis.example.com', port: 6380 }, + ]); + }); + + it('should deduplicate the same node id across non-contiguous slot ranges', () => { + const slots: RedisClusterSlotsReply = [ + [0, 400, ['node-1.redis.example.com', 7379, 'node-1']], + [900, 900, ['node-1.redis.example.com', 7379, 'node-1']], + [1800, 6000, ['node-1.redis.example.com', 7379, 'node-1']], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: 'node-1.redis.example.com', port: 7379 }, + ]); + }); + + it('should still discover nodes from a pre-4.0.0 cluster reply with no node id ([ip, port] only)', () => { + // Regression test for https://github.com/redis/RedisInsight/pull/6180#discussion_r3551046293: + // node ids were only added to CLUSTER SLOTS in Redis 4.0.0 - older + // clusters return just [ip, port] per node, so `id` is undefined and + // must not cause every node to be dropped. + const slots = [ + [0, 5460, ['127.0.0.1', 30001]], + [5461, 10922, ['127.0.0.1', 30002]], + ] as unknown as RedisClusterSlotsReply; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: '127.0.0.1', port: 30001 }, + { host: '127.0.0.1', port: 30002 }, + ]); + }); + + it('should deduplicate pre-4.0.0 nodes without an id by host:port across non-contiguous slot ranges', () => { + const slots = [ + [0, 400, ['127.0.0.1', 30001]], + [900, 900, ['127.0.0.1', 30001]], + [1800, 6000, ['127.0.0.1', 30001]], + ] as unknown as RedisClusterSlotsReply; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: '127.0.0.1', port: 30001 }, + ]); + }); + + it('should include replica nodes in addition to the master for each slot range', () => { + const slots: RedisClusterSlotsReply = [ + [ + 0, + 16383, + ['node-1.redis.example.com', 7379, 'master-1'], + ['node-2.redis.example.com', 7380, 'replica-1'], + ], + ]; + + expect(parseNodesFromClusterSlotsReply(slots)).toEqual([ + { host: 'node-1.redis.example.com', port: 7379 }, + { host: 'node-2.redis.example.com', port: 7380 }, + ]); }); - it('should parse IPv6 addresses correctly', async () => { - const result = parseNodesFromClusterInfoReply( - mockRedisClusterNodesResponseIPv6, - ); - expect(result).toEqual(mockRedisClusterNodesIPv6); + it('should return empty array in case of an error', () => { + expect( + parseNodesFromClusterSlotsReply( + null as unknown as RedisClusterSlotsReply, + ), + ).toEqual([]); }); }); diff --git a/redisinsight/api/src/modules/redis/utils/reply.util.ts b/redisinsight/api/src/modules/redis/utils/reply.util.ts index 399c68bc61..33ca9880b4 100644 --- a/redisinsight/api/src/modules/redis/utils/reply.util.ts +++ b/redisinsight/api/src/modules/redis/utils/reply.util.ts @@ -1,5 +1,5 @@ import { chunk, isArray } from 'lodash'; -import { IRedisClusterNode } from 'src/models'; +import { IRedisClusterNodeAddress } from 'src/models'; /** * Converts array of strings to object when each even element is a key and odd is a value @@ -83,60 +83,128 @@ export const convertMultilineReplyToObject = ( }; /** - * Parse and return all endpoints from the nodes list returned by "cluster info" command - * @Input + * The `?` endpoint marker Redis returns for a misconfigured node (preferred + * endpoint type is `hostname` but no `cluster-announce-hostname` is set). + * Per the spec this must NOT be treated the same as an unknown ("connect to + * the same host used to send the command") endpoint - the node may not be + * the one that served the command at all. + * See https://redis.io/docs/latest/commands/cluster-slots/ and + * https://redis.io/docs/latest/commands/cluster-shards/ + */ +export const UNKNOWN_ENDPOINT_MARKER = '?'; + +/** + * Resolve the address to use for a node from Redis's own "preferred + * endpoint" (`CLUSTER SLOTS` / `CLUSTER SHARDS`), which is already resolved + * server-side according to the `cluster-preferred-endpoint-type` config + * (`ip` | `hostname` | `unknown-endpoint`). Clients must use this value + * as-is rather than re-deriving an ip-vs-hostname preference themselves, + * since a node may announce a hostname purely as metadata while the server + * is actually configured to prefer the ip (or vice versa). + * + * Handles the endpoint field's documented abnormal values: + * - `null` / `''`: unknown endpoint - resolves to `fallbackHost` (the host + * used to send the command). + * - `'?'`: misconfigured node - the spec explicitly warns this may not be + * the same node that served the command, so `undefined` is returned + * instead of guessing; callers decide how to handle an unresolvable node. + * @param endpoint + * @param fallbackHost + */ +export const resolvePreferredEndpoint = ( + endpoint: string | null | undefined, + fallbackHost?: string, +): string | undefined => { + if (endpoint === UNKNOWN_ENDPOINT_MARKER) { + return undefined; + } + if (!endpoint) { + return fallbackHost || undefined; + } + return endpoint; +}; + +/** + * A single node entry within a "CLUSTER SLOTS" slot range: + * `[preferredEndpoint, port, nodeId?, metadata?]`. `nodeId` was only added + * in Redis 4.0.0 (see the "Behavior change history" on + * https://redis.io/docs/latest/commands/cluster-slots/) - pre-4.0 clusters + * return just `[ip, port]`. + */ +export type RedisClusterSlotsNode = [string | null, number, string?, unknown?]; + +/** + * Raw "CLUSTER SLOTS" reply shape once decoded from RESP into JS values: + * an array of slot ranges, each `[startSlot, endSlot, ...nodes]`. + * See https://redis.io/docs/latest/commands/cluster-slots/ + */ +export type RedisClusterSlotsReply = Array< + [number, number, ...RedisClusterSlotsNode[]] +>; + +/** + * Parse the reply of "CLUSTER SLOTS" into a deduplicated list of node + * addresses (one entry per unique node across all slot ranges, keyed by + * node id when present or by "host:port" on pre-4.0.0 clusters that don't + * return one), using each node's server-resolved preferred endpoint (see + * `resolvePreferredEndpoint`) rather than any raw ip/hostname field. + * + * CLUSTER SLOTS is used over the newer CLUSTER SHARDS here for broader + * compatibility - it has been available since Redis 3.0.0, while CLUSTER + * SHARDS requires 7.0+. + * + * @Input (already parsed into nested arrays, see `RedisClusterSlotsReply`) * ``` - * 08418e3514990489e48fa05d642efc33e205f5 172.31.100.211:6379@16379 myself,master - 0 1698694904000 1 connected 0-5460 - * d2dee846c715a917ec9a4963e8885b06130f9f 172.31.100.212:6379@16379 master - 0 1698694905285 2 connected 5461-10922 - * 3e92457ab813ad7a62dacf768ec7309210feaf [2001:db8::1]:7001@17001 master - 0 1698694906000 3 connected 10923-16383 + * [ + * [0, 5460, ["10.0.161.40", 7379, "07c37dfe...", []], ["10.0.146.93", 7379, "e7d1eecc...", []]], + * ... + * ] * ``` * @Output * ``` * [ - * { - * host: "172.31.100.211", - * port: 6379 - * }, - * { - * host: "172.31.100.212", - * port: 6379 - * }, - * { - * host: "2001:db8::1", - * port: 7001 - * } + * { host: "10.0.161.40", port: 7379 }, + * { host: "10.0.146.93", port: 7379 } * ] * ``` - * @param info + * @param slots + * @param fallbackHost host used to send the "CLUSTER SLOTS" command, used + * to resolve nodes with an unknown (`null`/`''`) preferred endpoint */ -export const parseNodesFromClusterInfoReply = ( - info: string, -): IRedisClusterNode[] => { +export const parseNodesFromClusterSlotsReply = ( + slots: RedisClusterSlotsReply, + fallbackHost?: string, +): IRedisClusterNodeAddress[] => { try { - const lines = info.split('\n'); - const nodes = []; - lines.forEach((line: string) => { - if (line && line.split) { - // fields = [id, endpoint, flags, master, pingSent, pongRecv, configEpoch, linkState, slot] - const fields = line.split(' '); - const [id, endpoint, , master, , , , linkState, slot] = fields; + const nodeById = new Map(); - const hostAndPort = endpoint.split('@')[0]; - const lastColonIndex = hostAndPort.lastIndexOf(':'); + slots.forEach((slotRange) => { + // slotRange = [startSlot, endSlot, master, ...replicas] + for (let i = 2; i < slotRange.length; i++) { + const [endpoint, port, id] = slotRange[ + i + ] as unknown as RedisClusterSlotsNode; + + const host = resolvePreferredEndpoint(endpoint, fallbackHost); + if (!host) { + // '?' (misconfigured node) - spec says this may not be the same + // node used to send the command, so don't guess an address. + continue; + } - const host = hostAndPort.substring(0, lastColonIndex); - const port = hostAndPort.substring(lastColonIndex + 1); - nodes.push({ - id, - host, - port: parseInt(port, 10), - replicaOf: master !== '-' ? master : undefined, - linkState, - slot, - }); + // Pre-4.0.0 clusters have no node id (just [ip, port]); fall back to + // "host:port" as a stable dedup key so those nodes are still + // discovered instead of being silently dropped. + const dedupeKey = id || `${host}:${port}`; + if (nodeById.has(dedupeKey)) { + continue; + } + + nodeById.set(dedupeKey, { host, port }); } }); - return nodes; + + return [...nodeById.values()]; } catch (e) { return []; } diff --git a/redisinsight/api/src/modules/workbench/plugins.service.spec.ts b/redisinsight/api/src/modules/workbench/plugins.service.spec.ts index a893207ddd..98c814ef79 100644 --- a/redisinsight/api/src/modules/workbench/plugins.service.spec.ts +++ b/redisinsight/api/src/modules/workbench/plugins.service.spec.ts @@ -14,6 +14,7 @@ import { WorkbenchCommandsExecutor } from 'src/modules/workbench/providers/workb import { BadRequestException } from '@nestjs/common'; import ERROR_MESSAGES from 'src/constants/error-messages'; import { PluginsService } from 'src/modules/workbench/plugins.service'; +import { CommandExecutionStatus } from 'src/modules/cli/dto/cli.dto'; import { PluginCommandsWhitelistProvider } from 'src/modules/workbench/providers/plugin-commands-whitelist.provider'; import { PluginStateRepository } from 'src/modules/workbench/repositories/plugin-state.repository'; import { PluginState } from 'src/modules/workbench/models/plugin-state'; @@ -52,9 +53,13 @@ const mockPluginStateProvider = () => ({ describe('PluginsService', () => { let service: PluginsService; - let workbenchCommandsExecutor; - let pluginsCommandsWhitelistProvider; - let pluginStateProvider; + let workbenchCommandsExecutor: ReturnType< + typeof mockWorkbenchCommandsExecutor + >; + let pluginsCommandsWhitelistProvider: ReturnType< + typeof mockPluginCommandsWhitelistProvider + >; + let pluginStateProvider: ReturnType; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -80,14 +85,15 @@ describe('PluginsService', () => { }).compile(); service = module.get(PluginsService); - workbenchCommandsExecutor = module.get( + workbenchCommandsExecutor = module.get( WorkbenchCommandsExecutor, - ); - pluginsCommandsWhitelistProvider = - module.get( - PluginCommandsWhitelistProvider, - ); - pluginStateProvider = module.get(PluginStateRepository); + ) as unknown as typeof workbenchCommandsExecutor; + pluginsCommandsWhitelistProvider = module.get( + PluginCommandsWhitelistProvider, + ) as unknown as typeof pluginsCommandsWhitelistProvider; + pluginStateProvider = module.get( + PluginStateRepository, + ) as unknown as typeof pluginStateProvider; }); describe('sendCommand', () => { @@ -128,6 +134,42 @@ describe('PluginsService', () => { }); expect(workbenchCommandsExecutor.sendCommand).not.toHaveBeenCalled(); }); + it.each(['getdel foo', 'getex foo', 'getset foo bar', 'getdel\tfoo'])( + 'should reject non-whitelisted command "%s" that shares a prefix with a whitelisted command', + async (command) => { + pluginsCommandsWhitelistProvider.getWhitelistCommands.mockResolvedValueOnce( + mockWhitelistCommandsResponse, + ); + + const dto = { command, mode: RunQueryMode.ASCII }; + + const result = await service.sendCommand( + mockWorkbenchClientMetadata, + dto, + ); + + expect(result.result?.[0]?.status).toEqual(CommandExecutionStatus.Fail); + expect(workbenchCommandsExecutor.sendCommand).not.toHaveBeenCalled(); + }, + ); + it.each(['GET foo', 'get\tfoo'])( + 'should allow whitelisted command "%s" regardless of casing or delimiter', + async (command) => { + pluginsCommandsWhitelistProvider.getWhitelistCommands.mockResolvedValueOnce( + mockWhitelistCommandsResponse, + ); + + const result = await service.sendCommand(mockWorkbenchClientMetadata, { + command, + mode: RunQueryMode.ASCII, + }); + + expect(result.result?.[0]?.status).not.toEqual( + CommandExecutionStatus.Fail, + ); + expect(workbenchCommandsExecutor.sendCommand).toHaveBeenCalled(); + }, + ); it('should throw an error when command execution failed', async () => { pluginsCommandsWhitelistProvider.getWhitelistCommands.mockResolvedValueOnce( mockWhitelistCommandsResponse, diff --git a/redisinsight/api/src/modules/workbench/plugins.service.ts b/redisinsight/api/src/modules/workbench/plugins.service.ts index df23d82e73..635aa6b3c8 100644 --- a/redisinsight/api/src/modules/workbench/plugins.service.ts +++ b/redisinsight/api/src/modules/workbench/plugins.service.ts @@ -13,6 +13,7 @@ import config from 'src/utils/config'; import { ClientMetadata } from 'src/common/models'; import { PluginStateRepository } from 'src/modules/workbench/repositories/plugin-state.repository'; import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory'; +import { splitCliCommandLine } from 'src/utils/cli-helper'; const PLUGINS_CONFIG = config.get('plugins'); @@ -133,14 +134,22 @@ export class PluginsService { clientMetadata: ClientMetadata, commandLine: string, ) { - const targetCommand = commandLine.toLowerCase(); + let targetCommand = ''; + try { + // Tokenize exactly as the executor does so validation and execution + // agree on the command word; unparseable input stays rejected. + targetCommand = + `${splitCliCommandLine(commandLine)[0] ?? ''}`.toLowerCase(); + } catch (e) { + // ignore parsing errors and fall through to the not-supported error + } const whitelist = await this.getWhitelistCommands(clientMetadata); - if (!whitelist.find((command) => targetCommand.startsWith(command))) { + if (!targetCommand || !whitelist.includes(targetCommand)) { throw new CommandNotSupportedError( ERROR_MESSAGES.PLUGIN_COMMAND_NOT_SUPPORTED( - targetCommand.split(' ')[0].toUpperCase(), + targetCommand.toUpperCase(), ), ); } diff --git a/redisinsight/api/src/utils/logsFormatter.spec.ts b/redisinsight/api/src/utils/logsFormatter.spec.ts index beaf2d2355..f125865c42 100644 --- a/redisinsight/api/src/utils/logsFormatter.spec.ts +++ b/redisinsight/api/src/utils/logsFormatter.spec.ts @@ -10,6 +10,7 @@ import { import { getOriginalErrorCause, logDataToPlain, + prepareLogsData, sanitizeError, sanitizeErrors, } from './logsFormatter'; @@ -278,6 +279,64 @@ describe('logsFormatter', () => { }); }); + describe('prepareLogsData', () => { + it('should sanitize errors in the log and omit stacks when sensitive data is omitted', () => { + const formatter = prepareLogsData({ omitSensitiveData: true }); + + expect( + formatter.transform( + { level: 'error', message: 'Failed', error: simpleError }, + formatter.options, + ), + ).toEqual({ + level: 'error', + message: 'Failed', + error: { + type: 'Error', + message: simpleError.message, + }, + }); + }); + + it('should keep stacks when sensitive data is not omitted', () => { + const formatter = prepareLogsData({}); + + expect( + formatter.transform( + { level: 'error', message: 'Failed', error: simpleError }, + formatter.options, + ), + ).toEqual({ + level: 'error', + message: 'Failed', + error: { + type: 'Error', + message: simpleError.message, + stack: simpleError.stack, + }, + }); + }); + + it('should keep stacks when no options are passed', () => { + const formatter = prepareLogsData(); + + expect( + formatter.transform( + { level: 'error', message: 'Failed', error: simpleError }, + formatter.options, + ), + ).toEqual({ + level: 'error', + message: 'Failed', + error: { + type: 'Error', + message: simpleError.message, + stack: simpleError.stack, + }, + }); + }); + }); + describe('logDataToPlain', () => { it('should sanitize all errors and replace circular dependencies after safeTransform of the data', () => { const result: any = logDataToPlain(mockUnsafeLog); diff --git a/redisinsight/api/src/utils/logsFormatter.ts b/redisinsight/api/src/utils/logsFormatter.ts index dc779be5b9..27de4f0127 100644 --- a/redisinsight/api/src/utils/logsFormatter.ts +++ b/redisinsight/api/src/utils/logsFormatter.ts @@ -1,4 +1,4 @@ -import { format } from 'winston'; +import { format, Logform } from 'winston'; import { isArray, isObject, isPlainObject, omit } from 'lodash'; import { inspect } from 'util'; import config, { Config } from 'src/utils/config'; @@ -68,11 +68,15 @@ export const sanitizeErrors = ( return clone; }; -export const prepareLogsData = format((info, opts: SanitizeOptions = {}) => { - return sanitizeErrors(info, opts); -}); +// logform types format options as `unknown`, and is installed twice, so the +// formats below need narrowing and an explicit type. +export const prepareLogsData: Logform.FormatWrap = format( + (info, opts?: unknown) => { + return sanitizeErrors(info, (opts as SanitizeOptions) ?? {}); + }, +); -export const prettyFileFormat = format.printf((info) => { +export const prettyFileFormat: Logform.Format = format.printf((info) => { const separator = ' | '; const timestamp = new Date().toLocaleString(); const { level, context, message } = info; diff --git a/redisinsight/api/test/README.md b/redisinsight/api/test/README.md index 5ba73b9268..6dcd3d9a3e 100644 --- a/redisinsight/api/test/README.md +++ b/redisinsight/api/test/README.md @@ -19,7 +19,7 @@ From the root directory of the repository, run the following command: ```bash - yarn test:api:integration + npm run test:api:integration ``` #### Example @@ -52,7 +52,7 @@ Let’s walk through an example where you need to run tests related to `string`. Finally, execute the tests from the root directory: ```bash - yarn test:api:integration + npm run test:api:integration ``` --- diff --git a/redisinsight/api/test/api/.mocharc.cjs b/redisinsight/api/test/api/.mocharc.cjs index 7fce0732fa..7fe0bf67dd 100644 --- a/redisinsight/api/test/api/.mocharc.cjs +++ b/redisinsight/api/test/api/.mocharc.cjs @@ -1,13 +1,15 @@ // Mocha config. Dynamic so the spec list can react to TEST_TAGS. // -// When TEST_TAGS is set on an RTE (e.g. oss-st-8 sets TEST_TAGS=array +// When TEST_TAGS is set on an RTE (e.g. oss-st-8 sets TEST_TAGS=array,vectorSet // because redis:8.8-alpine lacks modules and other suites fail against // Redis 8.8 semantics — per-field hash TTL, RediSearch flag changes, // etc.), mocha only loads the file globs that map to the requested tag(s). +// TEST_TAGS is comma-separated, so an RTE can opt into several suites. // When TEST_TAGS is unset (every other RTE) the wildcard runs everything, // preserving prior behaviour exactly. const TAG_SPECS = { array: ['test/api/array/**/*.test.ts'], + vectorSet: ['test/api/vector-set/**/*.test.ts'], }; const tags = (process.env.TEST_TAGS || '') diff --git a/redisinsight/api/test/api/cloud/user/GET-cloud-me.test.ts b/redisinsight/api/test/api/cloud/user/GET-cloud-me.test.ts index d9789786ad..f701d70777 100644 --- a/redisinsight/api/test/api/cloud/user/GET-cloud-me.test.ts +++ b/redisinsight/api/test/api/cloud/user/GET-cloud-me.test.ts @@ -5,9 +5,10 @@ import { Joi, getMainCheckFn, expect, + nock, } from './../../deps'; -import { mockCloudUserSafe } from 'src/__mocks__'; -import { initApiUserProfileNockScope } from '../constants'; +import { mockCapiUnauthorizedError, mockCloudUserSafe } from 'src/__mocks__'; +import { initApiUserProfileNockScope, initSMApiNockScope } from '../constants'; const { request, server } = deps; @@ -31,11 +32,14 @@ const responseSchema = Joi.object() const mainCheckFn = getMainCheckFn(endpoint); -initApiUserProfileNockScope(); - describe('GET /cloud/me', () => { requirements('rte.serverType=local'); + beforeEach(async () => { + nock.cleanAll(); + initApiUserProfileNockScope(); + }); + describe('Common', () => { [ { @@ -47,4 +51,64 @@ describe('GET /cloud/me', () => { }, ].map(mainCheckFn); }); + + describe('MFA challenge', () => { + // The API keeps one shared, in-memory cloud session for the whole suite. By + // the time this runs a prior test has logged in, so the session holds an + // apiSessionId + cached user and GET /cloud/me returns that cached profile + // without ever calling /login. Reset it to a pre-login state first: a failed + // account switch (and its failed re-login) drives the auth-retry to + // invalidate the apiSessionId and cached user, so the next GET /cloud/me + // performs a real login and reaches the challenge. + beforeEach(async () => { + nock.cleanAll(); + initSMApiNockScope() + .persist() + .post('/accounts/setcurrent/1') + .reply(401, mockCapiUnauthorizedError) + .get('/users/me') + .reply(401, mockCapiUnauthorizedError) + .post('/login') + .query(true) + .reply(401, mockCapiUnauthorizedError); + await request(server).put('/cloud/me/accounts/1/current'); + nock.cleanAll(); + }); + + [ + { + name: 'Should surface the cloud mfa-required challenge as errorCode 11025 without retrying /login', + before: () => { + initSMApiNockScope() + // stubbed once: a retried /login would not match and fail the test + .post('/login') + .query(true) + .reply( + 401, + { + errors: { + code: 'user-mfa-required', + params: JSON.stringify({ + smsFactorAvailable: false, + totpFactorAvailable: true, + }), + }, + }, + { 'set-cookie': 'JSESSIONID=mfa-challenge' }, + ); + }, + statusCode: 401, + checkFn: ({ body }: any) => { + // errorCode the frontend interceptor keys off to keep the session + expect(body.errorCode).to.eq(11025); + expect(body.error).to.eq('CloudApiMfaRequired'); + // factors arrive as a JSON string in errors.params; assert it parses + expect(body.factors).to.deep.eq({ + smsFactorAvailable: false, + totpFactorAvailable: true, + }); + }, + }, + ].map(mainCheckFn); + }); }); diff --git a/redisinsight/api/test/api/cloud/user/POST-cloud-me-login-mfa.test.ts b/redisinsight/api/test/api/cloud/user/POST-cloud-me-login-mfa.test.ts new file mode 100644 index 0000000000..8c744f1eb8 --- /dev/null +++ b/redisinsight/api/test/api/cloud/user/POST-cloud-me-login-mfa.test.ts @@ -0,0 +1,64 @@ +import { mockCloudApiCsrfToken } from 'src/__mocks__'; +import { + describe, + deps, + requirements, + Joi, + getMainCheckFn, + generateInvalidDataTestCases, + validateInvalidDataTestCase, + nock, +} from '../../deps'; +import { initSMApiNockScope } from '../constants'; + +const { request, server } = deps; + +const endpoint = () => request(server).post('/cloud/me/login/mfa'); + +const dataSchema = Joi.object({ + code: Joi.string().required(), +}).strict(); + +const validInputData = { code: '123456' }; + +const mainCheckFn = getMainCheckFn(endpoint); + +describe('POST /cloud/me/login/mfa', () => { + requirements('rte.serverType=local'); + + beforeEach(async () => { + nock.cleanAll(); + }); + + describe('Validation', () => { + generateInvalidDataTestCases(dataSchema, validInputData).map( + validateInvalidDataTestCase(endpoint, dataSchema), + ); + }); + + describe('Common', () => { + [ + { + name: 'Should complete the login by re-sending /login with the mfa code', + data: validInputData, + before: () => { + // the /login matcher only matches when mfa_code + mfa_type are in the + // body, so a 200 proves the code was forwarded. /csrf is mocked for the + // case where the session has no csrf yet (otherwise it is skipped). + initSMApiNockScope() + .post( + '/login', + (body) => + body.mfa_code === validInputData.code && + body.mfa_type === 'Totp', + ) + .query(true) + .reply(200, {}, { 'set-cookie': 'JSESSIONID=jsessionid' }) + .get('/csrf') + .reply(200, { csrfToken: mockCloudApiCsrfToken }); + }, + statusCode: 200, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/api/database-import/POST-databases-import.test.ts b/redisinsight/api/test/api/database-import/POST-databases-import.test.ts index 02b3761c84..b43be111c1 100644 --- a/redisinsight/api/test/api/database-import/POST-databases-import.test.ts +++ b/redisinsight/api/test/api/database-import/POST-databases-import.test.ts @@ -244,6 +244,19 @@ const importDatabaseFormat3 = { : undefined, }; +// Non-desktop builds no longer resolve certificate/key paths, so importing a +// database that references certs by path is rejected with these errors. +const invalidCaCertBodyError = { + message: 'Invalid CA body', + statusCode: 400, + error: 'Invalid Ca Certificate Body', +}; +const invalidClientCertBodyError = { + message: 'Invalid certificate body', + statusCode: 400, + error: 'Invalid Client Certificate Body', +}; + const mainCheckFn = getMainCheckFn(endpoint); const checkConnection = async (databaseId: string, statusCode = 200) => { @@ -1148,20 +1161,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'STANDALONE', 'STANDALONE'); + await validatePartialImportedDatabase(name, 'STANDALONE', 'STANDALONE'); }); it('Import standalone with CA tls partial with no ca file (format 1)', async () => { await validateApiCall({ @@ -1222,20 +1236,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA tls (format 3)', async () => { await validateApiCall({ @@ -1254,20 +1273,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); }); describe('TLS AUTH', function () { @@ -1425,20 +1449,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'STANDALONE', 'STANDALONE'); + await validatePartialImportedDatabase(name, 'STANDALONE', 'STANDALONE'); }); it('Import standalone with CA + CLIENT tls partial with wrong key (format 1)', async () => { await validateApiCall({ @@ -1502,20 +1527,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls (format 3)', async () => { await validateApiCall({ @@ -1534,20 +1564,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); }); }); @@ -1672,20 +1707,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'STANDALONE', 'STANDALONE'); + await validatePartialImportedDatabase(name, 'STANDALONE', 'STANDALONE'); }); it('Import standalone with CA + CLIENT tls + ssh PK (format 1)', async () => { await validateApiCall({ @@ -1705,20 +1741,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'STANDALONE', 'STANDALONE'); + await validatePartialImportedDatabase(name, 'STANDALONE', 'STANDALONE'); }); it('Import standalone with CA + CLIENT tls + ssh PKP (format 1)', async () => { await validateApiCall({ @@ -1738,20 +1775,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'STANDALONE', 'STANDALONE'); + await validatePartialImportedDatabase(name, 'STANDALONE', 'STANDALONE'); }); it('Import standalone with CA + CLIENT tls + ssh basic (format 2)', async () => { await validateApiCall({ @@ -1773,20 +1811,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls + ssh PK (format 2)', async () => { await validateApiCall({ @@ -1808,20 +1851,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls + ssh PKP (format 2)', async () => { await validateApiCall({ @@ -1843,20 +1891,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls + ssh basic (format 3)', async () => { await validateApiCall({ @@ -1876,20 +1929,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls + ssh PK (format 3)', async () => { await validateApiCall({ @@ -1909,20 +1967,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); it('Import standalone with CA + CLIENT tls + ssh PKP (format 3)', async () => { await validateApiCall({ @@ -1942,20 +2005,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'STANDALONE'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); }); }); @@ -2185,20 +2253,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'CLUSTER', 'CLUSTER'); + await validatePartialImportedDatabase(name, 'CLUSTER', 'CLUSTER'); }); it('Import cluster with CA tls (format 2)', async () => { await validateApiCall({ @@ -2220,20 +2289,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'CLUSTER', 'CLUSTER'); + await validatePartialImportedDatabase(name, 'CLUSTER', 'CLUSTER'); }); it('Import cluster with CA tls (format 3)', async () => { await validateApiCall({ @@ -2252,20 +2322,25 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'NOT CONNECTED', 'CLUSTER'); + await validatePartialImportedDatabase( + name, + 'NOT CONNECTED', + 'NOT CONNECTED', + ); }); }); }); @@ -2467,20 +2542,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat1.host, port: importDatabaseFormat1.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'SENTINEL', 'SENTINEL'); + await validatePartialImportedDatabase(name, 'SENTINEL', 'SENTINEL'); }); it('Import sentinel with CA + CLIENT tls (format 2)', async () => { await validateApiCall({ @@ -2501,20 +2577,21 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat2.host, port: parseInt(importDatabaseFormat2.port, 10), + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - await validateImportedDatabase(name, 'SENTINEL', 'SENTINEL'); + await validatePartialImportedDatabase(name, 'SENTINEL', 'SENTINEL'); }); it('Import sentinel with CA + CLIENT tls (format 3)', async () => { await validateApiCall({ @@ -2533,25 +2610,24 @@ describe('POST /databases/import', () => { ], responseBody: { total: 1, - success: [ + success: [], + partial: [ { index: 0, - status: 'success', + status: 'partial', host: importDatabaseFormat3.host, port: importDatabaseFormat3.port, + errors: [invalidCaCertBodyError, invalidClientCertBodyError], }, ], - partial: [], fail: [], }, }); - // should determine connection type as standalone since we don't have sentinel auto discovery - await validateImportedDatabase( + await validatePartialImportedDatabase( name, 'NOT CONNECTED', - 'STANDALONE', - false, + 'NOT CONNECTED', ); }); }); diff --git a/redisinsight/api/test/api/database/GET-databases.test.ts b/redisinsight/api/test/api/database/GET-databases.test.ts index 60bd7a250a..1b31d79846 100644 --- a/redisinsight/api/test/api/database/GET-databases.test.ts +++ b/redisinsight/api/test/api/database/GET-databases.test.ts @@ -60,6 +60,7 @@ const responseSchema = Joi.array() 'production', 'development', ), + connectionFamily: Joi.string().valid('auto', 'ipv4', 'ipv6').allow(null), }), ) .required() diff --git a/redisinsight/api/test/api/database/PATCH-databases-id.test.ts b/redisinsight/api/test/api/database/PATCH-databases-id.test.ts index c60ed029f2..0126897151 100644 --- a/redisinsight/api/test/api/database/PATCH-databases-id.test.ts +++ b/redisinsight/api/test/api/database/PATCH-databases-id.test.ts @@ -9,6 +9,7 @@ import { _, it, validateApiCall, + before, after, } from '../deps'; import { Joi } from '../../helpers/test'; @@ -55,6 +56,7 @@ const dataSchema = Joi.object({ environment: Joi.string() .valid('unspecified', 'production', 'development') .allow(null), + connectionFamily: Joi.string().valid('auto', 'ipv4', 'ipv6').allow(null), }) .messages({ 'any.required': '{#label} should not be empty', @@ -253,6 +255,95 @@ describe(`PATCH /databases/:id`, () => { }, ].map(mainCheckFn); }); + describe('Managed databases (cloud) endpoint guard', () => { + const managedHostPortMessage = + 'Host and port cannot be changed for a database managed by a cloud provider.'; + // Dedicated managed instance so we never mutate the shared TEST_INSTANCE_ID + // (its cloudDetails would otherwise leak into later tests). + const MANAGED_ID = 'cloud0000-0000-4000-8000-managed000001'; + const managedEndpoint = () => endpoint(MANAGED_ID); + const managedName = constants.getRandomString(); + + // Seed once directly via the repository: cloudDetails marks the database as + // managed, and the guard rejects endpoint changes before any connection, so + // no real connectivity is required. + before(async () => { + const rep = await localDb.getRepository(localDb.repositories.DATABASE); + await rep.save({ + id: MANAGED_ID, + name: 'cloud-managed-db', + host: constants.TEST_REDIS_HOST, + port: constants.TEST_REDIS_PORT, + connectionType: constants.STANDALONE, + tls: false, + verifyServerCert: false, + modules: '[]', + version: '7.0', + cloudDetails: { + cloudId: constants.TEST_CLOUD_ID, + subscriptionType: 'fixed', + }, + }); + }); + + after(async () => { + const rep = await localDb.getRepository(localDb.repositories.DATABASE); + await rep.delete(MANAGED_ID); + }); + + [ + { + name: 'Should reject host change for a cloud-managed database', + endpoint: managedEndpoint, + data: { + host: constants.getRandomString(), + }, + statusCode: 400, + responseBody: { + statusCode: 400, + error: 'Bad Request', + message: managedHostPortMessage, + }, + after: async () => { + // endpoint must remain unchanged + const db = await localDb.getInstanceById(MANAGED_ID); + expect(db?.host).to.eq(constants.TEST_REDIS_HOST); + expect(db?.port).to.eq(constants.TEST_REDIS_PORT); + }, + }, + { + name: 'Should reject port change for a cloud-managed database', + endpoint: managedEndpoint, + data: { + port: 1234, + }, + statusCode: 400, + responseBody: { + statusCode: 400, + error: 'Bad Request', + message: managedHostPortMessage, + }, + after: async () => { + const db = await localDb.getInstanceById(MANAGED_ID); + expect(db?.port).to.eq(constants.TEST_REDIS_PORT); + }, + }, + { + name: 'Should allow non-endpoint change (name) for a cloud-managed database', + endpoint: managedEndpoint, + data: { + name: managedName, + }, + responseBody: { + name: managedName, + }, + after: async () => { + const db = await localDb.getInstanceById(MANAGED_ID); + expect(db?.name).to.eq(managedName); + }, + }, + ].map(mainCheckFn); + }); describe('TAGS', () => { const newTagsDto1 = [ { diff --git a/redisinsight/api/test/api/database/POST-databases-export.test.ts b/redisinsight/api/test/api/database/POST-databases-export.test.ts index 8f528c30d5..ae2ea4e7ad 100644 --- a/redisinsight/api/test/api/database/POST-databases-export.test.ts +++ b/redisinsight/api/test/api/database/POST-databases-export.test.ts @@ -91,6 +91,7 @@ const responseSchema = Joi.array() environment: Joi.string() .valid('unspecified', 'production', 'development') .allow(null), + connectionFamily: Joi.string().valid('auto', 'ipv4', 'ipv6').allow(null), }), ) .required() diff --git a/redisinsight/api/test/api/database/POST-databases.test.ts b/redisinsight/api/test/api/database/POST-databases.test.ts index d02b4a9ac1..c537c70b56 100644 --- a/redisinsight/api/test/api/database/POST-databases.test.ts +++ b/redisinsight/api/test/api/database/POST-databases.test.ts @@ -53,6 +53,7 @@ const dataSchema = Joi.object({ environment: Joi.string() .valid('unspecified', 'production', 'development') .allow(null), + connectionFamily: Joi.string().valid('auto', 'ipv4', 'ipv6').allow(null), }) .messages({ 'any.required': '{#label} should not be empty', @@ -288,6 +289,80 @@ describe('POST /databases', () => { }, }); }); + it('Create standalone forcing IPv4 (connects over IPv4)', async () => { + const dbName = constants.getRandomString(); + + await validateApiCall({ + endpoint, + statusCode: 201, + data: { + name: dbName, + host: constants.TEST_REDIS_HOST, + port: constants.TEST_REDIS_PORT, + connectionFamily: 'ipv4', + }, + responseSchema, + responseBody: { + name: dbName, + connectionFamily: 'ipv4', + }, + }); + }); + it('Create standalone defaults connectionFamily to auto when omitted', async () => { + const dbName = constants.getRandomString(); + + await validateApiCall({ + endpoint, + statusCode: 201, + data: { + name: dbName, + host: constants.TEST_REDIS_HOST, + port: constants.TEST_REDIS_PORT, + }, + responseSchema, + responseBody: { + name: dbName, + connectionFamily: 'auto', + }, + }); + }); + it('Should throw an error with an invalid connectionFamily', async () => { + await validateApiCall({ + endpoint, + statusCode: 400, + data: { + name: constants.getRandomString(), + host: constants.TEST_REDIS_HOST, + port: constants.TEST_REDIS_PORT, + connectionFamily: 'ipv5', + }, + }); + }); + // Runs only when an IPv6-reachable Redis endpoint is provided via + // TEST_REDIS_IPV6_HOST; skipped otherwise so it never flakes on + // IPv4-only environments. + describe('IPv6', function () { + requirements(() => !!constants.TEST_REDIS_IPV6_HOST); + it('Create standalone forcing IPv6 (connects over IPv6)', async () => { + const dbName = constants.getRandomString(); + + await validateApiCall({ + endpoint, + statusCode: 201, + data: { + name: dbName, + host: constants.TEST_REDIS_IPV6_HOST, + port: constants.TEST_REDIS_PORT, + connectionFamily: 'ipv6', + }, + responseSchema, + responseBody: { + name: dbName, + connectionFamily: 'ipv6', + }, + }); + }); + }); describe('Enterprise', () => { requirements('rte.re'); it('Should throw an error if db index specified', async () => { diff --git a/redisinsight/api/test/api/database/constants.ts b/redisinsight/api/test/api/database/constants.ts index aacedd6529..67da36e601 100644 --- a/redisinsight/api/test/api/database/constants.ts +++ b/redisinsight/api/test/api/database/constants.ts @@ -72,6 +72,7 @@ export const databaseSchema = Joi.object().keys({ environment: Joi.string() .valid('unspecified', 'production', 'development') .allow(null), + connectionFamily: Joi.string().valid('auto', 'ipv4', 'ipv6').allow(null), sshOptions: Joi.object({ id: Joi.string().allow(null), host: Joi.string().required(), diff --git a/redisinsight/api/test/api/redisearch/POST-databases-id-redisearch-key-indexes.test.ts b/redisinsight/api/test/api/redisearch/POST-databases-id-redisearch-key-indexes.test.ts index 73fafe8b62..1134addbad 100644 --- a/redisinsight/api/test/api/redisearch/POST-databases-id-redisearch-key-indexes.test.ts +++ b/redisinsight/api/test/api/redisearch/POST-databases-id-redisearch-key-indexes.test.ts @@ -22,7 +22,7 @@ const dataSchema = Joi.object({ }).strict(); const validInputData = { - key: `${constants.TEST_SEARCH_HASH_KEY_PREFIX_1}1`, + key: `${constants.TEST_RUN_ID}_hash_key_0`, }; const INDEX_SUMMARY_SCHEMA = Joi.object({ @@ -59,7 +59,7 @@ describe('POST /databases/:id/redisearch/key-indexes', () => { describe('Common', () => { [ { - name: 'Should return matching indexes for a key that matches a prefix', + name: 'Should return the indexes covering an existing hash key', data: validInputData, responseSchema: RESPONSE_SCHEMA, checkFn: async ({ body }) => { @@ -68,16 +68,6 @@ describe('POST /databases/:id/redisearch/key-indexes', () => { expect(names).to.include(constants.TEST_SEARCH_HASH_INDEX_1); }, }, - { - name: 'Should still return indexes with no prefix for an unrelated key', - data: { - key: 'nonexistent_prefix_zzz:1', - }, - responseSchema: RESPONSE_SCHEMA, - checkFn: async ({ body }) => { - expect(body.indexes).to.be.an('array'); - }, - }, { name: 'Should return indexes array with correct structure', data: validInputData, diff --git a/redisinsight/api/test/api/vector-set/DELETE-databases-id-vector-set-elements.test.ts b/redisinsight/api/test/api/vector-set/DELETE-databases-id-vector-set-elements.test.ts new file mode 100644 index 0000000000..9a3a6952bc --- /dev/null +++ b/redisinsight/api/test/api/vector-set/DELETE-databases-id-vector-set-elements.test.ts @@ -0,0 +1,79 @@ +import { + expect, + describe, + it, + deps, + Joi, + requirements, + validateApiCall, + getMainCheckFn, +} from '../deps'; + +const { server, request, constants } = deps; +const rte = deps.rte as any; + +const endpoint = (instanceId = constants.TEST_INSTANCE_ID) => + request(server).delete( + `/${constants.API.DATABASES}/${instanceId}/vector-set/elements`, + ); + +const mainCheckFn = getMainCheckFn(endpoint); + +const responseSchema = Joi.object() + .keys({ affected: Joi.number().required() }) + .required(); + +const vcard = (key: string) => rte.client.call('VCARD', key); +const seed = (key: string) => + Promise.all([ + rte.client.call('VADD', key, 'VALUES', '3', '1', '2', '3', 'a'), + rte.client.call('VADD', key, 'VALUES', '3', '4', '5', '6', 'b'), + ]); + +describe('DELETE /databases/:id/vector-set/elements', () => { + requirements('rte.version>=8.0'); + beforeEach(async () => rte.data.truncate()); + + describe('Main', () => { + it('Should remove elements and report the affected count', async () => { + const keyName = constants.getRandomString(); + await seed(keyName); + + await validateApiCall({ + endpoint, + data: { keyName, elements: ['a', 'missing'] }, + responseSchema, + // Only 'a' exists, so a single member is removed. + responseBody: { affected: 1 }, + }); + + expect(await vcard(keyName)).to.eql(1); + }); + }); + + describe('Errors', () => { + [ + { + name: 'Should return NotFound if key does not exist', + data: { keyName: constants.getRandomString(), elements: ['a'] }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Key with this name does not exist.', + }, + }, + { + name: 'Should return NotFound if instance id does not exist', + endpoint: () => endpoint(constants.TEST_NOT_EXISTED_INSTANCE_ID), + data: { keyName: constants.getRandomString(), elements: ['a'] }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Invalid database instance id.', + }, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-get_elements.test.ts b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-get_elements.test.ts new file mode 100644 index 0000000000..fc11bf6ee5 --- /dev/null +++ b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-get_elements.test.ts @@ -0,0 +1,95 @@ +import { + expect, + describe, + it, + deps, + Joi, + requirements, + validateApiCall, + getMainCheckFn, + JoiRedisString, +} from '../deps'; + +const { server, request, constants } = deps; +const rte = deps.rte as any; + +const endpoint = (instanceId = constants.TEST_INSTANCE_ID) => + request(server).post( + `/${constants.API.DATABASES}/${instanceId}/vector-set/get-elements`, + ); + +const mainCheckFn = getMainCheckFn(endpoint); + +const responseSchema = Joi.object() + .keys({ + keyName: JoiRedisString.required(), + total: Joi.number().required(), + nextCursor: Joi.string(), + isPaginationSupported: Joi.boolean().required(), + elements: Joi.array() + .items( + Joi.object({ + name: JoiRedisString.required(), + attributes: Joi.string(), + }), + ) + .required(), + }) + .required(); + +const seed = (key: string) => + Promise.all([ + rte.client.call('VADD', key, 'VALUES', '3', '1', '2', '3', 'a'), + rte.client.call('VADD', key, 'VALUES', '3', '4', '5', '6', 'b'), + ]); + +describe('POST /databases/:id/vector-set/get-elements', () => { + requirements('rte.version>=8.0'); + beforeEach(async () => rte.data.truncate()); + + describe('Main', () => { + it('Should return the elements of a vector set', async () => { + const keyName = constants.getRandomString(); + await seed(keyName); + + await validateApiCall({ + endpoint, + data: { keyName, count: 10 }, + responseSchema, + checkFn: ({ body }: any) => { + expect(body.total).to.eql(2); + expect(body.elements.map((e: any) => e.name).sort()).to.eql([ + 'a', + 'b', + ]); + }, + }); + }); + }); + + describe('Errors', () => { + [ + { + name: 'Should return NotFound if key does not exist', + data: { keyName: constants.getRandomString(), count: 10 }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Key with this name does not exist.', + }, + }, + { + name: 'Should return NotFound if instance id does not exist', + endpoint: () => endpoint(constants.TEST_NOT_EXISTED_INSTANCE_ID), + data: { keyName: constants.getRandomString(), count: 10 }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Invalid database instance id.', + }, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-similarity_search.test.ts b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-similarity_search.test.ts new file mode 100644 index 0000000000..cff62dc941 --- /dev/null +++ b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set-similarity_search.test.ts @@ -0,0 +1,129 @@ +import { + expect, + describe, + it, + deps, + Joi, + requirements, + validateApiCall, + getMainCheckFn, + JoiRedisString, +} from '../deps'; + +const { server, request, constants } = deps; +const rte = deps.rte as any; + +const endpoint = (instanceId = constants.TEST_INSTANCE_ID) => + request(server).post( + `/${constants.API.DATABASES}/${instanceId}/vector-set/similarity-search`, + ); + +const mainCheckFn = getMainCheckFn(endpoint); + +// Default int8 quantization nudges a self-match score just under 1.0. +const SELF_MATCH_SCORE_TOLERANCE = 0.01; + +const responseSchema = Joi.object() + .keys({ + keyName: JoiRedisString.required(), + elements: Joi.array() + .items( + Joi.object({ + name: JoiRedisString.required(), + score: Joi.number().required(), + attributes: Joi.string(), + }), + ) + .required(), + }) + .required(); + +const seed = (key: string) => + Promise.all([ + rte.client.call('VADD', key, 'VALUES', '3', '1', '2', '3', 'a'), + rte.client.call('VADD', key, 'VALUES', '3', '1', '2', '3.1', 'b'), + rte.client.call('VADD', key, 'VALUES', '3', '-9', '-9', '-9', 'c'), + ]); + +describe('POST /databases/:id/vector-set/similarity-search', () => { + requirements('rte.version>=8.0'); + beforeEach(async () => rte.data.truncate()); + + describe('Main', () => { + it('Should return matches ordered by descending score for an element query', async () => { + const keyName = constants.getRandomString(); + await seed(keyName); + + await validateApiCall({ + endpoint, + data: { keyName, elementName: 'a', count: 2 }, + responseSchema, + checkFn: ({ body }: any) => { + expect(body.elements.length).to.eql(2); + + // Top match is a near-perfect self-match; 'a'/'b' quantize alike so + // avoid pinning the top name. + expect(body.elements[0].score).to.be.closeTo( + 1, + SELF_MATCH_SCORE_TOLERANCE, + ); + expect(body.elements[0].score).to.be.at.least(body.elements[1].score); + expect(body.elements.map((element: any) => element.name)).to.include( + 'a', + ); + }, + }); + }); + }); + + describe('Validation', () => { + // The "exactly one query" rule is enforced after the key-existence check, + // so these cases seed the key first to reach the 400 instead of a 404. + const validationKey = constants.getRandomString(); + + [ + { + name: 'Should reject a payload with no query (under-specified)', + data: { keyName: validationKey }, + statusCode: 400, + before: () => seed(validationKey), + }, + { + name: 'Should reject a payload with more than one query (over-specified)', + data: { + keyName: validationKey, + elementName: 'a', + vectorValues: [1, 2, 3], + }, + statusCode: 400, + before: () => seed(validationKey), + }, + ].map(mainCheckFn); + }); + + describe('Errors', () => { + [ + { + name: 'Should return NotFound if key does not exist', + data: { keyName: constants.getRandomString(), elementName: 'a' }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Key with this name does not exist.', + }, + }, + { + name: 'Should return NotFound if instance id does not exist', + endpoint: () => endpoint(constants.TEST_NOT_EXISTED_INSTANCE_ID), + data: { keyName: constants.getRandomString(), elementName: 'a' }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Invalid database instance id.', + }, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set.test.ts b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set.test.ts new file mode 100644 index 0000000000..8bc8440754 --- /dev/null +++ b/redisinsight/api/test/api/vector-set/POST-databases-id-vector-set.test.ts @@ -0,0 +1,125 @@ +import { + expect, + describe, + it, + deps, + requirements, + validateApiCall, + getMainCheckFn, +} from '../deps'; + +const { server, request, constants } = deps; +// The harness types `deps.rte` as null until initRTE runs; tests access it +// freely (the api test layer is untyped by design), so widen it here. +const rte = deps.rte as any; + +// endpoint to test +const endpoint = (instanceId = constants.TEST_INSTANCE_ID) => + request(server).post(`/${constants.API.DATABASES}/${instanceId}/vector-set`); + +const mainCheckFn = getMainCheckFn(endpoint); + +// VCARD has no typed method on rte.client; assert state via `call`. +const vcard = (key: string) => rte.client.call('VCARD', key); + +describe('POST /databases/:id/vector-set', () => { + // Vector sets are a Redis 8.0 data type; skip where the server lacks VADD. + requirements('rte.version>=8.0'); + beforeEach(async () => rte.data.truncate()); + + describe('Main', () => { + const newKey = constants.getRandomString(); + const ttlKey = constants.getRandomString(); + + [ + { + name: 'Should create a vector set from numeric values', + data: { + keyName: newKey, + elements: [ + { name: 'a', vectorValues: [1, 2, 3] }, + { name: 'b', vectorValues: [4, 5, 6] }, + ], + }, + statusCode: 201, + before: async () => { + expect(await rte.client.exists(newKey)).to.eql(0); + }, + after: async () => { + expect(await rte.client.exists(newKey)).to.eql(1); + expect(await vcard(newKey)).to.eql(2); + expect(await rte.client.ttl(newKey)).to.eql(-1); + }, + }, + { + name: 'Should create a vector set with a TTL', + data: { + keyName: ttlKey, + elements: [{ name: 'a', vectorValues: [1, 2, 3] }], + expire: 100, + }, + statusCode: 201, + after: async () => { + expect(await vcard(ttlKey)).to.eql(1); + expect(await rte.client.ttl(ttlKey)).to.gte(95); + }, + }, + ].map(mainCheckFn); + }); + + describe('Validation', () => { + [ + { + name: 'Should reject an empty elements array', + data: { keyName: constants.getRandomString(), elements: [] }, + statusCode: 400, + }, + { + name: 'Should reject an element with empty vectorValues', + data: { + keyName: constants.getRandomString(), + elements: [{ name: 'a', vectorValues: [] }], + }, + statusCode: 400, + }, + ].map(mainCheckFn); + }); + + describe('Errors', () => { + it('Should return conflict error if key already exists', async () => { + const keyName = constants.getRandomString(); + await rte.client.call('VADD', keyName, 'VALUES', '3', '1', '2', '3', 'a'); + + await validateApiCall({ + endpoint, + data: { + keyName, + elements: [{ name: 'b', vectorValues: [4, 5, 6] }], + }, + statusCode: 409, + responseBody: { + statusCode: 409, + error: 'Conflict', + message: 'This key name is already in use.', + }, + }); + }); + + [ + { + name: 'Should return NotFound error if instance id does not exist', + endpoint: () => endpoint(constants.TEST_NOT_EXISTED_INSTANCE_ID), + data: { + keyName: constants.getRandomString(), + elements: [{ name: 'a', vectorValues: [1, 2, 3] }], + }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Invalid database instance id.', + }, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/api/vector-set/PUT-databases-id-vector-set.test.ts b/redisinsight/api/test/api/vector-set/PUT-databases-id-vector-set.test.ts new file mode 100644 index 0000000000..6b52d43e52 --- /dev/null +++ b/redisinsight/api/test/api/vector-set/PUT-databases-id-vector-set.test.ts @@ -0,0 +1,79 @@ +import { + expect, + describe, + it, + deps, + requirements, + validateApiCall, + getMainCheckFn, +} from '../deps'; + +const { server, request, constants } = deps; +const rte = deps.rte as any; + +const endpoint = (instanceId = constants.TEST_INSTANCE_ID) => + request(server).put(`/${constants.API.DATABASES}/${instanceId}/vector-set`); + +const mainCheckFn = getMainCheckFn(endpoint); + +const vcard = (key: string) => rte.client.call('VCARD', key); +const seed = (key: string) => + rte.client.call('VADD', key, 'VALUES', '3', '1', '2', '3', 'a'); + +describe('PUT /databases/:id/vector-set', () => { + requirements('rte.version>=8.0'); + beforeEach(async () => rte.data.truncate()); + + describe('Main', () => { + it('Should add elements to an existing vector set', async () => { + const keyName = constants.getRandomString(); + await seed(keyName); + + await validateApiCall({ + endpoint, + data: { + keyName, + elements: [ + { name: 'b', vectorValues: [4, 5, 6] }, + { name: 'c', vectorValues: [7, 8, 9] }, + ], + }, + statusCode: 200, + }); + + expect(await vcard(keyName)).to.eql(3); + }); + }); + + describe('Errors', () => { + [ + { + name: 'Should return NotFound if key does not exist', + data: { + keyName: constants.getRandomString(), + elements: [{ name: 'a', vectorValues: [1, 2, 3] }], + }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Key with this name does not exist.', + }, + }, + { + name: 'Should return NotFound if instance id does not exist', + endpoint: () => endpoint(constants.TEST_NOT_EXISTED_INSTANCE_ID), + data: { + keyName: constants.getRandomString(), + elements: [{ name: 'a', vectorValues: [1, 2, 3] }], + }, + statusCode: 404, + responseBody: { + statusCode: 404, + error: 'Not Found', + message: 'Invalid database instance id.', + }, + }, + ].map(mainCheckFn); + }); +}); diff --git a/redisinsight/api/test/helpers/constants.ts b/redisinsight/api/test/helpers/constants.ts index fc2b56c43b..720e9870f6 100644 --- a/redisinsight/api/test/helpers/constants.ts +++ b/redisinsight/api/test/helpers/constants.ts @@ -128,6 +128,8 @@ export const constants = { // redis client TEST_REDIS_HOST: process.env.TEST_REDIS_HOST || 'localhost', TEST_REDIS_PORT: parseInt(process.env.TEST_REDIS_PORT) || 6379, + // Optional IPv6-reachable endpoint used to exercise connectionFamily=ipv6 connections. + TEST_REDIS_IPV6_HOST: process.env.TEST_REDIS_IPV6_HOST, TEST_REDIS_TIMEOUT: 30_000, TEST_REDIS_COMPRESSOR: Compressor.NONE, TEST_REDIS_DB_INDEX: 7, diff --git a/redisinsight/api/test/test-runs/oss-st-6-tls-auth-ssh/docker-compose.yml b/redisinsight/api/test/test-runs/oss-st-6-tls-auth-ssh/docker-compose.yml index d49a270d37..7888f8bf0a 100644 --- a/redisinsight/api/test/test-runs/oss-st-6-tls-auth-ssh/docker-compose.yml +++ b/redisinsight/api/test/test-runs/oss-st-6-tls-auth-ssh/docker-compose.yml @@ -27,7 +27,8 @@ services: '-t', '120', '--', - 'yarn', + 'npm', + 'run', 'test:api:ci:cov', ] links: diff --git a/redisinsight/api/test/test-runs/oss-st-8/docker-compose.yml b/redisinsight/api/test/test-runs/oss-st-8/docker-compose.yml index 0a76fda8a9..199cdfc3c3 100644 --- a/redisinsight/api/test/test-runs/oss-st-8/docker-compose.yml +++ b/redisinsight/api/test/test-runs/oss-st-8/docker-compose.yml @@ -4,11 +4,12 @@ services: redis: image: redis:8.8-alpine - # Scope the run to suites that declared `tag('array')` (the new Array data - # type read endpoints). redis:8.8-alpine has no modules and ships Redis 8.8 - # semantics (per-field hash TTL, RediSearch flag changes, etc.) that other - # untagged suites don't tolerate, so leaving them in would produce noise - # unrelated to the suite this RTE was added for. + # Scope the run to the suites tagged for this RTE: `array` (the Array data + # type read endpoints) and `vectorSet` (the VectorSet endpoints — a core + # Redis 8.0+ type, so no modules required). redis:8.8-alpine has no modules + # and ships Redis 8.8 semantics (per-field hash TTL, RediSearch flag changes, + # etc.) that other untagged suites don't tolerate, so leaving them in would + # produce noise unrelated to the suites this RTE was added for. test: environment: - TEST_TAGS: array + TEST_TAGS: array,vectorSet diff --git a/redisinsight/api/test/test-runs/re-clu/docker-compose.yml b/redisinsight/api/test/test-runs/re-clu/docker-compose.yml index d5dc4c6668..a364a41b68 100644 --- a/redisinsight/api/test/test-runs/re-clu/docker-compose.yml +++ b/redisinsight/api/test/test-runs/re-clu/docker-compose.yml @@ -12,7 +12,8 @@ services: '-t', '120', '--', - 'yarn', + 'npm', + 'run', 'test:api:ci:cov', ] redis: diff --git a/redisinsight/api/test/test-runs/re-crdt/docker-compose.yml b/redisinsight/api/test/test-runs/re-crdt/docker-compose.yml index 1307d539b9..e87af0106c 100644 --- a/redisinsight/api/test/test-runs/re-crdt/docker-compose.yml +++ b/redisinsight/api/test/test-runs/re-crdt/docker-compose.yml @@ -12,7 +12,8 @@ services: '-t', '120', '--', - 'yarn', + 'npm', + 'run', 'test:api:ci:cov', ] redis: diff --git a/redisinsight/api/test/test-runs/re-st/docker-compose.yml b/redisinsight/api/test/test-runs/re-st/docker-compose.yml index 75587b3ddd..553ef7193f 100644 --- a/redisinsight/api/test/test-runs/re-st/docker-compose.yml +++ b/redisinsight/api/test/test-runs/re-st/docker-compose.yml @@ -12,7 +12,8 @@ services: '-t', '120', '--', - 'yarn', + 'npm', + 'run', 'test:api:ci:cov', ] redis: diff --git a/redisinsight/api/test/test-runs/test.Dockerfile b/redisinsight/api/test/test-runs/test.Dockerfile index 68e8466d5e..9a1cfceff1 100644 --- a/redisinsight/api/test/test-runs/test.Dockerfile +++ b/redisinsight/api/test/test-runs/test.Dockerfile @@ -5,7 +5,7 @@ RUN dbus-uuidgen > /var/lib/dbus/machine-id WORKDIR /usr/src/app -COPY package.json yarn.lock ./ +COPY package.json package-lock.json .npmrc ./ # patch-package (postinstall) reads these, so they must exist before install — # otherwise patches silently don't apply (e.g. the ioredis bigint parser). COPY patches ./patches @@ -13,9 +13,9 @@ COPY stubs ./stubs COPY scripts ./scripts # Skip API client generation during install: integration tests don't need the # generated client, and the api source tree isn't COPYed in until after -# `yarn install` (the generator reads it to produce the OpenAPI spec). +# `npm ci` (the generator reads it to produce the OpenAPI spec). ENV SKIP_API_CLIENT_GEN=1 -RUN yarn install +RUN npm ci COPY . . COPY ./test/test-runs/test-docker-entry.sh ./test/test-runs/wait-for-it.sh ./ @@ -26,4 +26,4 @@ ARG GNOME_KEYRING_PASS="somepass" ENV GNOME_KEYRING_PASS=${GNOME_KEYRING_PASS} ENTRYPOINT ["./test-docker-entry.sh"] -CMD ["yarn", "test:api:ci:cov"] +CMD ["npm", "run", "test:api:ci:cov"] diff --git a/redisinsight/api/yarn.lock b/redisinsight/api/yarn.lock deleted file mode 100644 index 1f652f88fd..0000000000 --- a/redisinsight/api/yarn.lock +++ /dev/null @@ -1,9318 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@angular-devkit/core@19.2.15": - version "19.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.15.tgz#35af566f9c69d3eca9c183936ee8527d9725a006" - integrity sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA== - dependencies: - ajv "8.17.1" - ajv-formats "3.0.1" - jsonc-parser "3.3.1" - picomatch "4.0.2" - rxjs "7.8.1" - source-map "0.7.4" - -"@angular-devkit/core@19.2.17": - version "19.2.17" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.17.tgz#014107a94240dd3ecf38edfcf23113ad55b9752b" - integrity sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ== - dependencies: - ajv "8.17.1" - ajv-formats "3.0.1" - jsonc-parser "3.3.1" - picomatch "4.0.2" - rxjs "7.8.1" - source-map "0.7.4" - -"@angular-devkit/core@19.2.6": - version "19.2.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.6.tgz#b709c3d3e633691027e03fc01aefb620042efd1f" - integrity sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ== - dependencies: - ajv "8.17.1" - ajv-formats "3.0.1" - jsonc-parser "3.3.1" - picomatch "4.0.2" - rxjs "7.8.1" - source-map "0.7.4" - -"@angular-devkit/schematics-cli@19.2.15": - version "19.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics-cli/-/schematics-cli-19.2.15.tgz#e68a5a1c968ee975168812df8067129d90d11a32" - integrity sha512-1ESFmFGMpGQmalDB3t2EtmWDGv6gOFYBMxmHO2f1KI/UDl8UmZnCGL4mD3EWo8Hv0YIsZ9wOH9Q7ZHNYjeSpzg== - dependencies: - "@angular-devkit/core" "19.2.15" - "@angular-devkit/schematics" "19.2.15" - "@inquirer/prompts" "7.3.2" - ansi-colors "4.1.3" - symbol-observable "4.0.0" - yargs-parser "21.1.1" - -"@angular-devkit/schematics@19.2.15": - version "19.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.15.tgz#d20ceba32f97b5f0e07e25268d9b8fea7ee142dd" - integrity sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg== - dependencies: - "@angular-devkit/core" "19.2.15" - jsonc-parser "3.3.1" - magic-string "0.30.17" - ora "5.4.1" - rxjs "7.8.1" - -"@angular-devkit/schematics@19.2.17": - version "19.2.17" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.17.tgz#253c0c6f4d5400c3bf038d73ed114af5516b72ef" - integrity sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg== - dependencies: - "@angular-devkit/core" "19.2.17" - jsonc-parser "3.3.1" - magic-string "0.30.17" - ora "5.4.1" - rxjs "7.8.1" - -"@angular-devkit/schematics@19.2.6": - version "19.2.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.6.tgz#8e9c8e29b5d95d0b824ad0a1b095bba8812d194e" - integrity sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ== - dependencies: - "@angular-devkit/core" "19.2.6" - jsonc-parser "3.3.1" - magic-string "0.30.17" - ora "5.4.1" - rxjs "7.8.1" - -"@azure/msal-common@16.0.2": - version "16.0.2" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-16.0.2.tgz#e4b977ab5bea4cbaecab2cc9200364bea023bfea" - integrity sha512-ZJ/UR7lyqIntURrIJCyvScwJFanM9QhJYcJCheB21jZofGKpP9QxWgvADANo7UkresHKzV+6YwoeZYP7P7HvUg== - -"@azure/msal-node@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-5.0.2.tgz#bfd04b10448f67aeba864e67661a16a27e7e6210" - integrity sha512-3tHeJghckgpTX98TowJoXOjKGuds0L+FKfeHJtoZFl2xvwE6RF65shZJzMQ5EQZWXzh3sE1i9gE+m3aRMachjA== - dependencies: - "@azure/msal-common" "16.0.2" - jsonwebtoken "^9.0.0" - uuid "^8.3.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" - integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== - dependencies: - "@babel/highlight" "^7.25.7" - picocolors "^1.0.0" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.22.9": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" - integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== - -"@babel/compat-data@^7.25.7": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402" - integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA== - -"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" - integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== - -"@babel/core@^7.11.6", "@babel/core@^7.23.9": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6" - integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helpers" "^7.25.7" - "@babel/parser" "^7.25.8" - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.8" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" - integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.3" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.3" - "@babel/types" "^7.23.3" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.25.8": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== - 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" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" - integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== - dependencies: - "@babel/types" "^7.23.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.25.7", "@babel/generator@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" - integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== - dependencies: - "@babel/types" "^7.25.7" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/generator@^7.29.0": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== - dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-compilation-targets@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" - integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== - dependencies: - "@babel/compat-data" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" - integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1", "@babel/helper-create-regexp-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - regexpu-core "^6.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.8": - version "0.6.8" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" - integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - debug "^4.4.3" - lodash.debounce "^4.0.8" - resolve "^1.22.11" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== - dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-imports@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" - integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== - dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-module-transforms@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" - integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== - -"@babel/helper-plugin-utils@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" - integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== - -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-replace-supers@^7.27.1", "@babel/helper-replace-supers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" - integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.28.6" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-simple-access@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" - integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - -"@babel/helper-validator-option@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" - integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helper-wrap-function@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz#4e349ff9222dab69a93a019cc296cdd8442e279a" - integrity sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ== - dependencies: - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helpers@^7.23.2", "@babel/helpers@^7.25.7": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" - integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== - dependencies: - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/helpers@^7.28.6": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" - integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== - dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" - integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" - integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== - -"@babel/parser@^7.23.9", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" - integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== - dependencies: - "@babel/types" "^7.25.8" - -"@babel/parser@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" - integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== - dependencies: - "@babel/types" "^7.27.0" - -"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" - integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== - dependencies: - "@babel/types" "^7.29.0" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f" - integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-assertions@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" - integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-attributes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" - integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" - integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" - integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-async-generator-functions@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" - integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-async-to-generator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77" - integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-block-scoping@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" - integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72" - integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-static-block@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" - integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-classes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" - integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-computed-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" - integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/template" "^7.28.6" - -"@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-transform-dotall-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61" - integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" - integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-explicit-resource-management@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" - integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - -"@babel/plugin-transform-exponentiation-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091" - integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== - dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-transform-json-strings@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038" - integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-logical-assignment-operators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605" - integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-commonjs@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1" - integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-modules-systemjs@^7.29.0": - version "7.29.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz#f621105da99919c15cf4bde6fcc7346ef95e7b20" - integrity sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" - integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757" - integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-numeric-separator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f" - integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-object-rest-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7" - integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - -"@babel/plugin-transform-optional-catch-binding@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c" - integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd" - integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-methods@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411" - integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-private-property-in-object@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811" - integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regenerator@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" - integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-regexp-modifiers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b" - integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" - integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-property-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821" - integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-sets-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e" - integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/preset-env@^7.25.4": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.2.tgz#5a173f22c7d8df362af1c9fe31facd320de4a86c" - integrity sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw== - dependencies: - "@babel/compat-data" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.28.6" - "@babel/plugin-syntax-import-attributes" "^7.28.6" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.29.0" - "@babel/plugin-transform-async-to-generator" "^7.28.6" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.6" - "@babel/plugin-transform-class-properties" "^7.28.6" - "@babel/plugin-transform-class-static-block" "^7.28.6" - "@babel/plugin-transform-classes" "^7.28.6" - "@babel/plugin-transform-computed-properties" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-dotall-regex" "^7.28.6" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.6" - "@babel/plugin-transform-exponentiation-operator" "^7.28.6" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.28.6" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.28.6" - "@babel/plugin-transform-modules-systemjs" "^7.29.0" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" - "@babel/plugin-transform-numeric-separator" "^7.28.6" - "@babel/plugin-transform-object-rest-spread" "^7.28.6" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.28.6" - "@babel/plugin-transform-optional-chaining" "^7.28.6" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.28.6" - "@babel/plugin-transform-private-property-in-object" "^7.28.6" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.29.0" - "@babel/plugin-transform-regexp-modifiers" "^7.28.6" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.28.6" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.28.6" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.15" - babel-plugin-polyfill-corejs3 "^0.14.0" - babel-plugin-polyfill-regenerator "^0.6.6" - core-js-compat "^3.48.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/runtime@7.27.0", "@babel/runtime@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/template@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" - integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/template@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" - integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/template@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/traverse@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" - integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.3" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.3" - "@babel/types" "^7.23.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" - integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== - 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" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.3.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" - integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@babel/types@^7.25.7", "@babel/types@^7.25.8": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" - integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== - dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" - integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@esbuild/aix-ppc64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz#7a01a8d2ec2fbb2dac78adad09b0fa781e4082be" - integrity sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ== - -"@esbuild/android-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz#b540a27d14e4afd058496a4dbec4d3f414db110a" - integrity sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg== - -"@esbuild/android-arm@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz#704bd297de6d762de54eabbeafbf55f6756abe2f" - integrity sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ== - -"@esbuild/android-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz#d1cb166d34b0fbf0fe8ab460a5594f24a378701e" - integrity sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng== - -"@esbuild/darwin-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz#1034b26457fc886368fe61bbd09f653f6afa8e54" - integrity sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q== - -"@esbuild/darwin-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz#65556a432a1e4d72032d8218c1932fcca1a49772" - integrity sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ== - -"@esbuild/freebsd-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz#2e61e0592f9030d7e3dae18ee25ebc535918aef6" - integrity sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw== - -"@esbuild/freebsd-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz#c95ec289959ef8079c4dca817a1e2c4be66b9bd3" - integrity sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ== - -"@esbuild/linux-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz#40b22175dda06182f3ee8141186c5ff304c4a717" - integrity sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g== - -"@esbuild/linux-arm@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz#c09a0f67917592ac0de892a9be4d3814debd2a6c" - integrity sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ== - -"@esbuild/linux-ia32@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz#a580f9c676797833891e519fc7a1337c8afd8db3" - integrity sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w== - -"@esbuild/linux-loong64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz#46452cf321dc7f9e91c2fa780a56bb56e79cd68b" - integrity sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg== - -"@esbuild/linux-mips64el@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz#4211b3184dd6608f53dcb22e39f5d34ee08852c8" - integrity sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ== - -"@esbuild/linux-ppc64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz#697857c2a61cb9b0b6bb6652e40c1dc5e1ca8e5d" - integrity sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ== - -"@esbuild/linux-riscv64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz#d192943eb146a40ac4c6497d0cf7be35b986bf08" - integrity sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ== - -"@esbuild/linux-s390x@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz#acea0356da0e0ebc08f97cf7b9c2e401e1e648dc" - integrity sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag== - -"@esbuild/linux-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz#6f0c3ce0cb64c534b70c4c45ecb2c16d34e35dfd" - integrity sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA== - -"@esbuild/netbsd-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz#8bcd77077a0dce3378b574fedb26d2a253b73d36" - integrity sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw== - -"@esbuild/netbsd-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz#e7fb2a01e99c830c94e6623cd9fefb4c8fb58347" - integrity sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg== - -"@esbuild/openbsd-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz#c52909372db8b86e2c55e05a8940033b5660a3b2" - integrity sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q== - -"@esbuild/openbsd-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz#c427b9be5a64c262ff9a7eb70b5fbbaadf446c6c" - integrity sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw== - -"@esbuild/openharmony-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz#dc9b147baca2e6c4b3c85571741ef4860a489097" - integrity sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg== - -"@esbuild/sunos-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz#ce866d12df13c15e4c99f073a3d466f6e0649b3a" - integrity sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ== - -"@esbuild/win32-arm64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz#7468e3692d01d629d5941e5d83817bb80f9e39b4" - integrity sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA== - -"@esbuild/win32-ia32@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz#a5bc0063fb2bcab6d0ed63f2a1537958bc269ec6" - integrity sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg== - -"@esbuild/win32-x64@0.28.1": - version "0.28.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz#10064ee44f4347b90c9a02b446bbf80a91632b12" - integrity sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A== - -"@faker-js/faker@^8.4.1": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" - integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== - -"@glideapps/ts-necessities@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz#502beb495fad73cb6576ece1ffdb62023cacc9d5" - integrity sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@hey-api/codegen-core@0.8.2": - version "0.8.2" - resolved "https://registry.yarnpkg.com/@hey-api/codegen-core/-/codegen-core-0.8.2.tgz#b58ba632d164d828654607c1af0e9d12c1764665" - integrity sha512-R2NMf3wq97rh1mjz33WJQU8svz3F0RYUjvx/QzXucjpSqQ3O5huTdDjErG4fMxSr1X+X56NuDrqtGfHmo1TRUQ== - dependencies: - "@hey-api/types" "0.1.4" - ansi-colors "4.1.3" - c12 "3.3.4" - color-support "1.1.3" - -"@hey-api/json-schema-ref-parser@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.4.2.tgz#d63ce9a23f92588464143d9425101aad93b9a71a" - integrity sha512-ZhCFSKI2ipZHEbgmtUHdyddvRU3wJ4elgCfYUC7T7hZa4EivSrVflTQf2w+v3TuaYxR1Y2V2kq3otqTttrrK8Q== - dependencies: - "@jsdevtools/ono" "7.1.3" - "@types/json-schema" "7.0.15" - js-yaml "4.1.1" - -"@hey-api/openapi-ts@0.97.3": - version "0.97.3" - resolved "https://registry.yarnpkg.com/@hey-api/openapi-ts/-/openapi-ts-0.97.3.tgz#b5c4d0d35f9c90a6505b76d1ea89c8eaa5e4ac84" - integrity sha512-4sR6/E/POuy7aPZW9DDjhObzZCq7eSJWiW0+epXeKNczoTWEwdOyWFy9Ca/CnXYlZ3oJsrv0ZD0OO+YuczT7CA== - dependencies: - "@hey-api/codegen-core" "0.8.2" - "@hey-api/json-schema-ref-parser" "1.4.2" - "@hey-api/shared" "0.4.5" - "@hey-api/spec-types" "0.2.0" - "@hey-api/types" "0.1.4" - "@lukeed/ms" "2.0.2" - ansi-colors "4.1.3" - color-support "1.1.3" - commander "14.0.3" - get-tsconfig "4.14.0" - -"@hey-api/shared@0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@hey-api/shared/-/shared-0.4.5.tgz#e73b5031f68d56c673181b4aa583b637e6be3303" - integrity sha512-au4eHpBXAe1du0iMp6ESYuEaMS2jsoEyrbcT246btRhI9rMeQFEs7ZjtcMGXGsxhpaR38A8cPGNHx7QOrWAdMw== - dependencies: - "@hey-api/codegen-core" "0.8.2" - "@hey-api/json-schema-ref-parser" "1.4.2" - "@hey-api/spec-types" "0.2.0" - "@hey-api/types" "0.1.4" - ansi-colors "4.1.3" - cross-spawn "7.0.6" - open "11.0.0" - semver "7.7.4" - -"@hey-api/spec-types@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@hey-api/spec-types/-/spec-types-0.2.0.tgz#5b6dcdd1bdeb978033f0d250654ec4d440e90030" - integrity sha512-ibQ8Is7evMavzr8GNyJCcTg975d8DpaMUyLmOrQ85UBdy1l6t1KuRAwgChAbesJsIlNV6gjmlXruWyegDX18Fg== - dependencies: - "@hey-api/types" "0.1.4" - -"@hey-api/types@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@hey-api/types/-/types-0.1.4.tgz#d73731c8ffb5d5b898c01288ca7dfbc367b561ea" - integrity sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg== - -"@inquirer/ansi@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" - integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== - -"@inquirer/checkbox@^4.1.2", "@inquirer/checkbox@^4.2.0": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b" - integrity sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== - dependencies: - "@inquirer/ansi" "^1.0.2" - "@inquirer/core" "^10.3.2" - "@inquirer/figures" "^1.0.15" - "@inquirer/type" "^3.0.10" - yoctocolors-cjs "^2.1.3" - -"@inquirer/confirm@^5.1.14", "@inquirer/confirm@^5.1.6": - version "5.1.21" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" - integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - -"@inquirer/core@^10.3.2": - version "10.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" - integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== - dependencies: - "@inquirer/ansi" "^1.0.2" - "@inquirer/figures" "^1.0.15" - "@inquirer/type" "^3.0.10" - cli-width "^4.1.0" - mute-stream "^2.0.0" - signal-exit "^4.1.0" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.3" - -"@inquirer/editor@^4.2.15", "@inquirer/editor@^4.2.7": - version "4.2.23" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.23.tgz#fe046a3bfdae931262de98c1052437d794322e0b" - integrity sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/external-editor" "^1.0.3" - "@inquirer/type" "^3.0.10" - -"@inquirer/expand@^4.0.17", "@inquirer/expand@^4.0.9": - version "4.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.23.tgz#a38b5f32226d75717c370bdfed792313b92bdc05" - integrity sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - yoctocolors-cjs "^2.1.3" - -"@inquirer/external-editor@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" - integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== - dependencies: - chardet "^2.1.1" - iconv-lite "^0.7.0" - -"@inquirer/figures@^1.0.15": - version "1.0.15" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" - integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== - -"@inquirer/input@^4.1.6", "@inquirer/input@^4.2.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.3.1.tgz#778683b4c4c4d95d05d4b05c4a854964b73565b4" - integrity sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - -"@inquirer/number@^3.0.17", "@inquirer/number@^3.0.9": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.23.tgz#3fdec2540d642093fd7526818fd8d4bdc7335094" - integrity sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - -"@inquirer/password@^4.0.17", "@inquirer/password@^4.0.9": - version "4.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.23.tgz#b9f5187c8c92fd7aa9eceb9d8f2ead0d7e7b000d" - integrity sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== - dependencies: - "@inquirer/ansi" "^1.0.2" - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - -"@inquirer/prompts@7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.3.2.tgz#ad0879eb3bc783c19b78c420e5eeb18a09fc9b47" - integrity sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ== - dependencies: - "@inquirer/checkbox" "^4.1.2" - "@inquirer/confirm" "^5.1.6" - "@inquirer/editor" "^4.2.7" - "@inquirer/expand" "^4.0.9" - "@inquirer/input" "^4.1.6" - "@inquirer/number" "^3.0.9" - "@inquirer/password" "^4.0.9" - "@inquirer/rawlist" "^4.0.9" - "@inquirer/search" "^3.0.9" - "@inquirer/select" "^4.0.9" - -"@inquirer/prompts@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.8.0.tgz#0bac9315e3ecd09ae21d1598b1c0df39a8b4a720" - integrity sha512-JHwGbQ6wjf1dxxnalDYpZwZxUEosT+6CPGD9Zh4sm9WXdtUp9XODCQD3NjSTmu+0OAyxWXNOqf0spjIymJa2Tw== - dependencies: - "@inquirer/checkbox" "^4.2.0" - "@inquirer/confirm" "^5.1.14" - "@inquirer/editor" "^4.2.15" - "@inquirer/expand" "^4.0.17" - "@inquirer/input" "^4.2.1" - "@inquirer/number" "^3.0.17" - "@inquirer/password" "^4.0.17" - "@inquirer/rawlist" "^4.1.5" - "@inquirer/search" "^3.1.0" - "@inquirer/select" "^4.3.1" - -"@inquirer/rawlist@^4.0.9", "@inquirer/rawlist@^4.1.5": - version "4.1.11" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.11.tgz#313c8c3ffccb7d41e990c606465726b4a898a033" - integrity sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/type" "^3.0.10" - yoctocolors-cjs "^2.1.3" - -"@inquirer/search@^3.0.9", "@inquirer/search@^3.1.0": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.2.2.tgz#4cc6fd574dcd434e4399badc37c742c3fd534ac8" - integrity sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== - dependencies: - "@inquirer/core" "^10.3.2" - "@inquirer/figures" "^1.0.15" - "@inquirer/type" "^3.0.10" - yoctocolors-cjs "^2.1.3" - -"@inquirer/select@^4.0.9", "@inquirer/select@^4.3.1": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.4.2.tgz#2ac8fca960913f18f1d1b35323ed8fcd27d89323" - integrity sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== - dependencies: - "@inquirer/ansi" "^1.0.2" - "@inquirer/core" "^10.3.2" - "@inquirer/figures" "^1.0.15" - "@inquirer/type" "^3.0.10" - yoctocolors-cjs "^2.1.3" - -"@inquirer/type@^3.0.10": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" - integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== - -"@ioredis/as-callback@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ioredis/as-callback/-/as-callback-3.0.0.tgz#b96c9b05e6701e85ec6a5e62fa254071b0aec97f" - integrity sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg== - -"@ioredis/commands@^1.1.1", "@ioredis/commands@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" - integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff" - integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba" - integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jsdevtools/ono@7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" - integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== - -"@lukeed/csprng@^1.0.0", "@lukeed/csprng@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" - integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== - -"@lukeed/ms@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@lukeed/ms/-/ms-2.0.2.tgz#07f09e59a74c52f4d88c6db5c1054e819538e2a8" - integrity sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA== - -"@lukeed/uuid@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@lukeed/uuid/-/uuid-2.0.1.tgz#4f6c34259ee0982a455e1797d56ac27bb040fd74" - integrity sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w== - dependencies: - "@lukeed/csprng" "^1.1.0" - -"@microsoft/tsdoc@0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" - integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== - -"@mochajs/json-file-reporter@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@mochajs/json-file-reporter/-/json-file-reporter-1.3.0.tgz#63a53bcda93d75f5c5c74af60e45da063931370b" - integrity sha512-evIxpeP8EOixo/T2xh5xYEIzwbEHk8YNJfRUm1KeTs8F3bMjgNn2580Ogze9yisXNlTxu88JiJJYzXjjg5NdLA== - -"@nestjs/cli@^11.0.10": - version "11.0.10" - resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-11.0.10.tgz#c5c3cb4c47d08fd8faead7bf0ddd3f82bec7ccee" - integrity sha512-4waDT0yGWANg0pKz4E47+nUrqIJv/UqrZ5wLPkCqc7oMGRMWKAaw1NDZ9rKsaqhqvxb2LfI5+uXOWr4yi94DOQ== - dependencies: - "@angular-devkit/core" "19.2.15" - "@angular-devkit/schematics" "19.2.15" - "@angular-devkit/schematics-cli" "19.2.15" - "@inquirer/prompts" "7.8.0" - "@nestjs/schematics" "^11.0.1" - ansis "4.1.0" - chokidar "4.0.3" - cli-table3 "0.6.5" - commander "4.1.1" - fork-ts-checker-webpack-plugin "9.1.0" - glob "11.0.3" - node-emoji "1.11.0" - ora "5.4.1" - tree-kill "1.2.2" - tsconfig-paths "4.2.0" - tsconfig-paths-webpack-plugin "4.2.0" - typescript "5.8.3" - webpack "5.100.2" - webpack-node-externals "3.0.0" - -"@nestjs/common@^11.0.20": - version "11.0.20" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-11.0.20.tgz#e67e73f261ee79a0c4daa2c303712731667d0129" - integrity sha512-/GH8NDCczjn6+6RNEtSNAts/nq/wQE8L1qZ9TRjqjNqEsZNE1vpFuRIhmcO2isQZ0xY5rySnpaRdrOAul3gQ3A== - dependencies: - uid "2.0.2" - file-type "20.4.1" - iterare "1.2.1" - load-esm "1.0.2" - tslib "2.8.1" - -"@nestjs/core@^11.1.18": - version "11.1.18" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.18.tgz#cf3585bc34fd5fd62d3903b89a5512c456b66eef" - integrity sha512-wR3DtGyk/LUAiPtbXDuWJJwVkWElKBY0sqnTzf9d4uM3+X18FRZhK7WFc47czsIGOdWuRsMeLYV+1Z9dO4zDEQ== - dependencies: - uid "2.0.2" - "@nuxt/opencollective" "0.4.1" - fast-safe-stringify "2.1.1" - iterare "1.2.1" - path-to-regexp "8.4.2" - tslib "2.8.1" - -"@nestjs/event-emitter@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@nestjs/event-emitter/-/event-emitter-3.0.1.tgz#6c286f3b46a3d22093397a35015de427972bacfb" - integrity sha512-0Ln/x+7xkU6AJFOcQI9tIhUMXVF7D5itiaQGOyJbXtlAfAIt8gzDdJm+Im7cFzKoWkiW5nCXCPh6GSvdQd/3Dw== - dependencies: - eventemitter2 "6.4.9" - -"@nestjs/mapped-types@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz#b9b536b7c3571567aa1d0223db8baa1a51505a19" - integrity sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw== - -"@nestjs/platform-express@^11.1.3": - version "11.1.3" - resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.3.tgz#bf470f2e270ca9daa930974476dd0d7d62879556" - integrity sha512-hEDNMlaPiBO72fxxX/CuRQL3MEhKRc/sIYGVoXjrnw6hTxZdezvvM6A95UaLsYknfmcZZa/CdG1SMBZOu9agHQ== - dependencies: - cors "2.8.5" - express "5.1.0" - multer "2.0.1" - path-to-regexp "8.2.0" - tslib "2.8.1" - -"@nestjs/platform-socket.io@^11.0.20": - version "11.0.20" - resolved "https://registry.yarnpkg.com/@nestjs/platform-socket.io/-/platform-socket.io-11.0.20.tgz#a6e16e93f2799039b6c5f6e255ab3f787c75700a" - integrity sha512-fUyDjLt0wJ4WK+rXrd5/oSWw5xWpfDOknpP7YNgaFfvYW726KuS5gWysV7JPD2mgH85S6i+qiO3qZvHIs5DvxQ== - dependencies: - socket.io "4.8.1" - tslib "2.8.1" - -"@nestjs/schematics@^11.0.1": - version "11.0.9" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-11.0.9.tgz#18a0d128c609be76410f5c7ea02680c8cd297113" - integrity sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g== - dependencies: - "@angular-devkit/core" "19.2.17" - "@angular-devkit/schematics" "19.2.17" - comment-json "4.4.1" - jsonc-parser "3.3.1" - pluralize "8.0.0" - -"@nestjs/schematics@^11.0.5": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-11.0.5.tgz#cee2fb26f3273fb3874398aad3006517e6b802f9" - integrity sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A== - dependencies: - "@angular-devkit/core" "19.2.6" - "@angular-devkit/schematics" "19.2.6" - comment-json "4.2.5" - jsonc-parser "3.3.1" - pluralize "8.0.0" - -"@nestjs/serve-static@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@nestjs/serve-static/-/serve-static-5.0.3.tgz#63d8021ce93ab91515fd7dfffaa71d734bddb3f8" - integrity sha512-0jFjTlSVSLrI+mot8lfm+h2laXtKzCvgsVStv9T1ZBZTDwS26gM5czIhIESmWAod0PfrbCDFiu9C1MglObL8VA== - dependencies: - path-to-regexp "8.2.0" - -"@nestjs/swagger@^11.1.3": - version "11.1.3" - resolved "https://registry.yarnpkg.com/@nestjs/swagger/-/swagger-11.1.3.tgz#525a88049e5f420a703b77d22e16ecdbe23b982d" - integrity sha512-vhbW/Xu05Diti/EwYQp3Ea7Hj2M++wiakCcxqUUDA2n7NvCZC8LKsrcGynw6/x/lugdXyklYS+s2FhdAfeAikg== - dependencies: - "@microsoft/tsdoc" "0.15.1" - "@nestjs/mapped-types" "2.1.0" - js-yaml "4.1.0" - lodash "4.17.21" - path-to-regexp "8.2.0" - swagger-ui-dist "5.21.0" - -"@nestjs/testing@^11.0.20": - version "11.0.20" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-11.0.20.tgz#32ba2f992ab64cf191b403efb4e7ebac8448c7a7" - integrity sha512-3o+HWsVfA46tt81ctKuNj5ufL9srfmp3dQBCAIx9fzvjooEKwWl5L69AcvDh6JhdB79jhhM1lkSSU+1fBGbxgw== - dependencies: - tslib "2.8.1" - -"@nestjs/typeorm@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-11.0.0.tgz#b0f45d6902396db89e0ac1f4e738c2ff3407b794" - integrity sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA== - -"@nestjs/websockets@^11.0.20": - version "11.0.20" - resolved "https://registry.yarnpkg.com/@nestjs/websockets/-/websockets-11.0.20.tgz#251527e0aeb66dae74b94718a5f508e3e5f212c2" - integrity sha512-qcybahXdrPJFMILhAwJML9D/bExBEBFsfwFiePCeI4f//tiP0rXiLspLVOHClSeUPBaCNrx+Ae/HVe9UP+wtOg== - dependencies: - iterare "1.2.1" - object-hash "3.0.0" - tslib "2.8.1" - -"@nuxt/opencollective@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@nuxt/opencollective/-/opencollective-0.4.1.tgz#57bc41d2b03b2fba20b935c15950ac0f4bd2cea2" - integrity sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ== - dependencies: - consola "^3.2.3" - -"@okta/okta-auth-js@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@okta/okta-auth-js/-/okta-auth-js-7.12.1.tgz#876b57d08c43b7cf6cae0d749e8edb9817daea57" - integrity sha512-5xFMgB5Z880adGi2DmnCnfeEkXzrptIfHzaeV1gYt1ifVYFmRoi0tcOVjXUho4KT8z4EbW/KbLEiQtENNoWlzA== - dependencies: - "@babel/runtime" "^7.27.0" - "@peculiar/webcrypto" "^1.4.0" - Base64 "1.1.0" - atob "^2.1.2" - broadcast-channel "^7.1.0" - btoa "^1.2.1" - core-js "^3.39.0" - cross-fetch "^3.1.5" - fast-text-encoding "^1.0.6" - js-cookie "^3.0.1" - node-cache "^5.1.2" - p-cancelable "^2.0.0" - tiny-emitter "1.1.0" - webcrypto-shim "^0.1.5" - xhr2 "0.1.3" - -"@peculiar/asn1-schema@^2.3.6": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" - integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== - dependencies: - asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -"@peculiar/json-schema@^1.1.12": - version "1.1.12" - resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" - integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== - dependencies: - tslib "^2.0.0" - -"@peculiar/webcrypto@^1.4.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" - integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - pvtsutils "^1.3.2" - tslib "^2.5.0" - webcrypto-core "^1.7.7" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@redis-iris/agent-memory@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@redis-iris/agent-memory/-/agent-memory-0.1.1.tgz#0ec9cebb2cb27893a504149fbe0e281df87ffdc1" - integrity sha512-IlAc5r7dBmZKJiZm6jU4IMe+m3DW+8VW1nPyk0RXvXC8RAbSDJ644+x0cZbvD8KWrOK1XCcJOaXoNkHzQ0QHgw== - dependencies: - zod "^3.25.0 || ^4.0.0" - -"@redis/bloom@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" - integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== - -"@redis/client@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.11.tgz#5ee8620fea56c67cb427228c35d8403518efe622" - integrity sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA== - dependencies: - cluster-key-slot "1.1.2" - generic-pool "3.9.0" - yallist "4.0.0" - -"@redis/graph@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.0.tgz#cc2b82e5141a29ada2cce7d267a6b74baa6dd519" - integrity sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg== - -"@redis/json@1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.6.tgz#b7a7725bbb907765d84c99d55eac3fcf772e180e" - integrity sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw== - -"@redis/search@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.5.tgz#682b68114049ff28fdf2d82c580044dfb74199fe" - integrity sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg== - -"@redis/time-series@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.5.tgz#a6d70ef7a0e71e083ea09b967df0a0ed742bc6ad" - integrity sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg== - -"@scarf/scarf@=1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" - integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== - -"@segment/analytics-core@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@segment/analytics-core/-/analytics-core-1.8.0.tgz#7189b79c21b8c41ec7d3dd10b158a756b034f206" - integrity sha512-6CrccsYRY33I3mONN2ZW8SdBpbLtu1Ict3xR+n0FemYF5RB/jG7pW6jOvDXULR8kuYMzMmGOP4HvlyUmf3qLpg== - dependencies: - "@lukeed/uuid" "^2.0.0" - "@segment/analytics-generic-utils" "1.2.0" - dset "^3.1.4" - tslib "^2.4.1" - -"@segment/analytics-generic-utils@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@segment/analytics-generic-utils/-/analytics-generic-utils-1.2.0.tgz#9232162d6dbcd18501813fdff18035ce48fd24bf" - integrity sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw== - dependencies: - tslib "^2.4.1" - -"@segment/analytics-node@^2.1.3": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@segment/analytics-node/-/analytics-node-2.2.0.tgz#e8fd59fb15757261156c1a36a60130b440fd8be5" - integrity sha512-mPFTSBr9CrkFBdgr7KU/YD8V/25P8vPb/hVvVHYKwEdHRovlizZ34ENgQlvqeRuamQiXD3RLM8pcWX+WxPz3lQ== - dependencies: - "@lukeed/uuid" "^2.0.0" - "@segment/analytics-core" "1.8.0" - "@segment/analytics-generic-utils" "1.2.0" - buffer "^6.0.3" - jose "^5.1.0" - node-fetch "^2.6.7" - tslib "^2.4.1" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@socket.io/component-emitter@~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" - integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== - -"@sqltools/formatter@^1.2.5": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" - integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== - -"@supercharge/promise-pool@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-3.2.0.tgz#a6ab4afdf798e453a6bb51c4ae340852e1266af8" - integrity sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg== - -"@tokenizer/inflate@^0.2.6": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.2.7.tgz#32dd9dfc9abe457c89b3d9b760fc0690c85a103b" - integrity sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg== - dependencies: - debug "^4.4.0" - fflate "^0.8.2" - token-types "^6.0.0" - -"@tokenizer/token@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" - integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/adm-zip@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== - dependencies: - "@types/node" "*" - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.7" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" - integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== - dependencies: - "@babel/types" "^7.20.7" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cookiejar@*": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" - integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== - -"@types/cors@^2.8.12": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/ioredis-mock@^8": - version "8.2.5" - resolved "https://registry.yarnpkg.com/@types/ioredis-mock/-/ioredis-mock-8.2.5.tgz#ffbb398967d325b1ddfccc0695d14792ca188d76" - integrity sha512-cZyuwC9LGtg7s5G9/w6rpy3IOZ6F/hFR0pQlWYZESMo1xQUYbDpa6haqB4grTePjsGzcB/YLBFCjqRunK5wieg== - dependencies: - "@types/node" "*" - ioredis ">=5" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.14": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-bigint@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz#250d29e593375499d8ba6efaab22d094c3199ef3" - integrity sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag== - -"@types/json-schema@*", "@types/json-schema@7.0.15", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash@^4.14.167": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "24.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.1.tgz#91e92182c93db8bd6224fca031e2370cef9a8f01" - integrity sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ== - dependencies: - undici-types "~7.16.0" - -"@types/node@>=10.0.0": - version "22.7.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" - integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== - dependencies: - undici-types "~6.19.2" - -"@types/node@^18.11.18": - version "18.19.76" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.76.tgz#7991658e0ba41ad30cc8be01c9bbe580d58f2112" - integrity sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw== - dependencies: - undici-types "~5.26.4" - -"@types/node@^24": - version "24.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.13.0.tgz#8d357bbaeafccd6369d9de428467d69befdccb19" - integrity sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg== - dependencies: - undici-types "~7.18.0" - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/ssh2@^1.11.6": - version "1.11.11" - resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-1.11.11.tgz#02fb707d821890a655fd27c2d842b0c7114078fb" - integrity sha512-LdnE7UBpvHCgUznvn2fwLt2hkaENcKPFqOyXGkvyTLfxCXBN6roc1RmECNYuzzbHePzD3PaAov5rri9hehzx9Q== - dependencies: - "@types/node" "^18.11.18" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/superagent@*": - version "4.1.17" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.17.tgz#c8f0162b5d8a9c52d38b81398ef0650ef974b452" - integrity sha512-FFK/rRjNy24U6J1BvQkaNWu2ohOIF/kxRQXRsbT141YQODcOcZjzlcc4DGdI2SkTa0rhmF+X14zu6ICjCGIg+w== - dependencies: - "@types/cookiejar" "*" - "@types/node" "*" - -"@types/supertest@^2.0.8": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" - integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== - dependencies: - "@types/superagent" "*" - -"@types/triple-beam@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" - integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== - -"@types/urijs@^1.19.25": - version "1.19.25" - resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.25.tgz#ac92b53e674c3b108decdbe88dc5f444a2f42f6a" - integrity sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg== - -"@types/validator@^13.11.8": - version "13.12.2" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.2.tgz#760329e756e18a4aab82fc502b51ebdfebbe49f5" - integrity sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -Base64@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/Base64/-/Base64-1.1.0.tgz#810ef21afa8357df92ad7b5389188c446b9cb956" - integrity sha512-qeacf8dvGpf+XAT27ESHMh7z84uRzj/ua2pQdJg483m3bEXv/kVFtDnMgvf70BQGqzbZhR9t6BmASzKvqfJf3Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" - integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== - dependencies: - mime-types "^3.0.0" - negotiator "^1.0.0" - -accepts@~1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.13.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" - integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== - -acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adm-zip@^0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" - integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== - -agent-memory-client@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/agent-memory-client/-/agent-memory-client-0.3.1.tgz#62c526c1a626a988ede28a48af167bd0f25596dc" - integrity sha512-Oyd02/1vlIXZCsVGbcEkGo271QxwSV32LnpbHBzgkIQTFU7H2twJGQE1Sp/XwjibvJIDHqcdyic2suL30lFPvw== - dependencies: - ulid "^3.0.2" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" - integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== - dependencies: - ajv "^8.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@8.17.1, ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - -ansis@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansis/-/ansis-4.1.0.tgz#cd43ecd3f814f37223e518291c0e0b04f2915a0d" - integrity sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w== - -ansis@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansis/-/ansis-4.3.1.tgz#2815c1ef490adaf0d612ae3a699e90cbcf70a917" - integrity sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -app-root-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" - integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== - -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-timsort@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" - integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== - -asn1@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -asn1js@^3.0.1, asn1js@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" - integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== - dependencies: - pvtsutils "^1.3.2" - pvutils "^1.1.3" - tslib "^2.4.0" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.0.tgz#f8e5dd931cef2a5f8c32216d5784eda2f8750eb7" - integrity sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w== - dependencies: - follow-redirects "^1.16.0" - form-data "^4.0.5" - proxy-from-env "^2.1.0" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.4.15: - version "0.4.17" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" - integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-define-polyfill-provider" "^0.6.8" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.14.0: - version "0.14.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" - integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.8" - core-js-compat "^3.48.0" - -babel-plugin-polyfill-regenerator@^0.6.6: - version "0.6.8" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" - integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.8" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -baseline-browser-mapping@^2.10.12: - version "2.10.21" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz#136f9f181ee0d7ca6e3edbf42d9559763d2c1141" - integrity sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA== - -baseline-browser-mapping@^2.8.25: - version "2.8.29" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz#d8800b71399c783cb1bf2068c2bcc3b6cfd7892c" - integrity sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA== - -bcrypt-pbkdf@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -better-sqlite3@^12.10.1: - version "12.10.1" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-12.10.1.tgz#1fedf77460210c83d5140fb700c81700964a1a24" - integrity sha512-HfFtzCqnSfwB3+HroF6PSKzyh+7RfNMGPCzHFUZXRlvrPCb4P3cvxKZNN43Sr7IrkofqQZM+gIvffGpA8VvqgA== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bignumber.js@^9.0.0: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3, bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@^1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^2.2.0, body-parser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.1.tgz#6df606b0eb0a6e3f783dde91dde182c24c82438c" - integrity sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw== - dependencies: - bytes "^3.1.2" - content-type "^1.0.5" - debug "^4.4.3" - http-errors "^2.0.0" - iconv-lite "^0.7.0" - on-finished "^2.4.1" - qs "^6.14.0" - raw-body "^3.0.1" - type-is "^2.0.1" - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -broadcast-channel@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-7.1.0.tgz#fe64bea202f45d0fa91ad19498154527fd78cfbe" - integrity sha512-InJljddsYWbEL8LBnopnCg+qMQp9KcowvYWOt4YWrjD5HmxzDYKdVbDS1w/ji5rFZdRD58V5UxJPtBdpEbEJYw== - dependencies: - "@babel/runtime" "7.27.0" - oblivious-set "1.4.0" - p-queue "6.6.2" - unload "2.4.1" - -browser-or-node@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" - integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.21.9: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== - dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -browserslist@^4.24.0: - version "4.28.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.0.tgz#9cefece0a386a17a3cd3d22ebf67b9deca1b5929" - integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== - dependencies: - baseline-browser-mapping "^2.8.25" - caniuse-lite "^1.0.30001754" - electron-to-chromium "^1.5.249" - node-releases "^2.0.27" - update-browserslist-db "^1.1.4" - -browserslist@^4.28.1: - version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" - integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== - dependencies: - baseline-browser-mapping "^2.10.12" - caniuse-lite "^1.0.30001782" - electron-to-chromium "^1.5.328" - node-releases "^2.0.36" - update-browserslist-db "^1.2.3" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-equal-constant-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.1.2, bytes@^3.1.2, bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -c12@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/c12/-/c12-3.3.4.tgz#1253a5faf8b61244884d42459b4a6412571fe9f3" - integrity sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA== - dependencies: - chokidar "^5.0.0" - confbox "^0.2.4" - defu "^6.1.6" - dotenv "^17.3.1" - exsolve "^1.0.8" - giget "^3.2.0" - jiti "^2.6.1" - ohash "^2.0.11" - pathe "^2.0.3" - perfect-debounce "^2.1.0" - pkg-types "^2.3.0" - rc9 "^3.0.1" - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" - integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== - dependencies: - call-bind-apply-helpers "^1.0.1" - get-intrinsic "^1.2.6" - -call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001541: - version "1.0.30001561" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" - integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== - -caniuse-lite@^1.0.30001754: - version "1.0.30001755" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz#c01cfb1c30f5acf1229391666ec03492f4c332ff" - integrity sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA== - -caniuse-lite@^1.0.30001782: - version "1.0.30001790" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz#04660c7de15f445d86dd10ac88a8936ac0698e45" - integrity sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw== - -chai-deep-equal-ignore-undefined@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chai-deep-equal-ignore-undefined/-/chai-deep-equal-ignore-undefined-1.1.1.tgz#c9e3736fed06c83572f03c592c025cf2703fd1a1" - integrity sha512-BE4nUR2Jbqmmv8A0EuAydFRB/lXgXWAfa9TvO3YzHeGHAU7ZRwPZyu074oDl/CZtNXM7jXINpQxKBOe7N0P4bg== - -chai@^4.3.4: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - -chalk@^2.3.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" - integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@4.0.3, chokidar@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -chokidar@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" - integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== - dependencies: - readdirp "^5.0.0" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -class-transformer@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" - integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== - -class-validator@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.1.tgz#ff2411ed8134e9d76acfeb14872884448be98110" - integrity sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ== - dependencies: - "@types/validator" "^13.11.8" - libphonenumber-js "^1.10.53" - validator "^13.9.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-table3@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@2.x: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -cluster-key-slot@1.1.2, cluster-key-slot@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" - integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -collection-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collection-utils/-/collection-utils-1.0.1.tgz#31d14336488674f27aefc0a7c5eccacf6df78044" - integrity sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color-support@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.3.tgz#425d79b48f9af82fcd9e4fc1ea8af6c5ec07bbc2" - integrity sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== - -commander@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -comment-json@4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.5.tgz#482e085f759c2704b60bc6f97f55b8c01bc41e70" - integrity sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw== - dependencies: - array-timsort "^1.0.3" - core-util-is "^1.0.3" - esprima "^4.0.1" - has-own-prop "^2.0.0" - repeat-string "^1.6.1" - -comment-json@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.4.1.tgz#0757e3ba31a9e56f3f6e00bdaae114384ac8bcf3" - integrity sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg== - dependencies: - array-timsort "^1.0.3" - core-util-is "^1.0.3" - esprima "^4.0.1" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -component-emitter@^1.2.0, component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.0.2" - typedarray "^0.0.6" - -concurrently@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" - integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== - dependencies: - chalk "^2.4.2" - date-fns "^2.0.1" - lodash "^4.17.15" - read-pkg "^4.0.1" - rxjs "^6.5.2" - spawn-command "^0.0.2-1" - supports-color "^6.1.0" - tree-kill "^1.2.2" - yargs "^13.3.0" - -confbox@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" - integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== - -connect-timeout@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.9.1.tgz#2d371c5c0e33ac5fb2bb2fc83636ac9245fbdd62" - integrity sha512-kDcadOXwOu+EEVs31iOu0TOg1yyRTqSNfyJaHYm5Z4K/hEIi9HJXSOWP9d+WQr/wff7wQJRh/HX63vK1+wBErw== - dependencies: - http-errors "~1.6.1" - ms "2.0.0" - on-finished "~2.3.0" - on-headers "~1.1.0" - -consola@^3.2.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.0.tgz#4cfc9348fd85ed16a17940b3032765e31061ab88" - integrity sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA== - -content-disposition@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" - integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.5, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie@^0.7.1, cookie@~0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cookiejar@^2.1.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -core-js-compat@^3.48.0: - version "3.49.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" - integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== - dependencies: - browserslist "^4.28.1" - -core-js@^3.39.0: - version "3.41.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776" - integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== - -core-util-is@^1.0.3, core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@2.8.5, cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^8.2.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -"cpu-features@file:./stubs/cpu-features", cpu-features@~0.0.9: - version "1.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-fetch@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.7.tgz#5f5a1e97021f427166fed50f86d48fc70bcd916e" - integrity sha512-Ff9FKeIMm0Rx1o8TEV87bTK5M232akt7uSAYrSTU/QA/W6Jj9P+fWn1mxGgl+dwDzpFoAY35OIS2SJXA8WEWKA== - dependencies: - node-fetch "2.6.12" - -cross-fetch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@7.0.6, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -date-fns@^2.0.1, date-fns@^2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== - -dayjs@^1.11.20: - version "1.11.21" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.21.tgz#57f87562e62de76f3c704bd2b8d522fc33068eb2" - integrity sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3, debug@~4.4.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -dedent@^1.0.0, dedent@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" - integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== - -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-browser-id@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" - integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== - -default-browser@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" - integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -defu@^6.1.6: - version "6.1.7" - resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.7.tgz#72543567c8e9f97ff13ce402b6dbe09ac5ae4d23" - integrity sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -denque@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destr@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" - integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-port@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - -dotenv@^16.0.0, dotenv@^16.6.1: - version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dotenv@^17.3.1: - version "17.4.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.2.tgz#c07e54a746e11eba021dd9e1047ced5afdc1c034" - integrity sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw== - -dset@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248" - integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.4.535: - version "1.4.581" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz#23b684c67bf56d4284e95598c05a5d266653b6d8" - integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw== - -electron-to-chromium@^1.5.249: - version "1.5.255" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz#fe9294ce172241eb50733bc00f2bd00d9c1e4ec7" - integrity sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ== - -electron-to-chromium@^1.5.328: - version "1.5.344" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz#6437cc08a7d9b914a98120e182f37793c9eaffd4" - integrity sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encodeurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-client@~6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.1.tgz#28a9cc4e90d448e1d0ba9369ad08a7af82f9956a" - integrity sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - xmlhttprequest-ssl "~2.1.1" - -engine.io-parser@~5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" - integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== - -engine.io@~6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.2.tgz#32bd845b4db708f8c774a4edef4e5c8a98b3da72" - integrity sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.7.2" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - -enhanced-resolve@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enhanced-resolve@^5.17.2, enhanced-resolve@^5.7.0: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" - integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -esbuild@^0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.28.1.tgz#ef45b4634c9c9d97a296aea4114a5f9840f95578" - integrity sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.28.1" - "@esbuild/android-arm" "0.28.1" - "@esbuild/android-arm64" "0.28.1" - "@esbuild/android-x64" "0.28.1" - "@esbuild/darwin-arm64" "0.28.1" - "@esbuild/darwin-x64" "0.28.1" - "@esbuild/freebsd-arm64" "0.28.1" - "@esbuild/freebsd-x64" "0.28.1" - "@esbuild/linux-arm" "0.28.1" - "@esbuild/linux-arm64" "0.28.1" - "@esbuild/linux-ia32" "0.28.1" - "@esbuild/linux-loong64" "0.28.1" - "@esbuild/linux-mips64el" "0.28.1" - "@esbuild/linux-ppc64" "0.28.1" - "@esbuild/linux-riscv64" "0.28.1" - "@esbuild/linux-s390x" "0.28.1" - "@esbuild/linux-x64" "0.28.1" - "@esbuild/netbsd-arm64" "0.28.1" - "@esbuild/netbsd-x64" "0.28.1" - "@esbuild/openbsd-arm64" "0.28.1" - "@esbuild/openbsd-x64" "0.28.1" - "@esbuild/openharmony-arm64" "0.28.1" - "@esbuild/sunos-x64" "0.28.1" - "@esbuild/win32-arm64" "0.28.1" - "@esbuild/win32-ia32" "0.28.1" - "@esbuild/win32-x64" "0.28.1" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter2@6.4.9: - version "6.4.9" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" - integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -express@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" - integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.0" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - finalhandler "^2.1.0" - fresh "^2.0.0" - http-errors "^2.0.0" - merge-descriptors "^2.0.0" - mime-types "^3.0.0" - on-finished "^2.4.1" - once "^1.4.0" - parseurl "^1.3.3" - proxy-addr "^2.0.7" - qs "^6.14.0" - range-parser "^1.2.1" - router "^2.2.0" - send "^1.1.0" - serve-static "^2.2.0" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - -express@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.2.0.tgz#d4101c16807a1a061c6e9adc7ce617473b4afeb9" - integrity sha512-XdpJDLxfztVY59X0zPI6sibRiGcxhTPXRD3IhJmjKf2jwMvkRGV1j7loB8U+heeamoU3XvihAaGRTR4aXXUN3A== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.1" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.0" - depd "^2.0.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - finalhandler "^2.1.0" - fresh "^2.0.0" - http-errors "^2.0.0" - merge-descriptors "^2.0.0" - mime-types "^3.0.0" - on-finished "^2.4.1" - once "^1.4.0" - parseurl "^1.3.3" - proxy-addr "^2.0.7" - qs "^6.14.0" - range-parser "^1.2.1" - router "^2.2.0" - send "^1.1.0" - serve-static "^2.2.0" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - -exsolve@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" - integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-safe-stringify@2.1.1, fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-text-encoding@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" - integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== - -fast-uri@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" - integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -fengari-interop@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/fengari-interop/-/fengari-interop-0.1.3.tgz#3ad37a90e7430b69b365441e9fc0ba168942a146" - integrity sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw== - -fengari@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/fengari/-/fengari-0.1.4.tgz#72416693cd9e43bd7d809d7829ddc0578b78b0bb" - integrity sha512-6ujqUuiIYmcgkGz8MGAdERU57EIluGGPSUgGPTsco657EHa+srq0S3/YUl/r9kx1+D+d4rGfYObd+m8K22gB1g== - dependencies: - readline-sync "^1.4.9" - sprintf-js "^1.1.1" - tmp "^0.0.33" - -fflate@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -file-stream-rotator@^0.6.1, file-stream-rotator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-1.0.0.tgz#de58379321a1ea6d2938ed5f5a2eff3b7f8b2780" - integrity sha512-qg5mQO7o+vhS7NPqkrkfJS8qqhz0d17Tnewmb5sUTUKwYe27LKaDtbTuRAtQWkBn6jROuFPVIDF5DtckzokFTQ== - -file-type@20.4.1: - version "20.4.1" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-20.4.1.tgz#8a58cf0922c6098af0ca5d84d5cf859c0c0f56a5" - integrity sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ== - dependencies: - "@tokenizer/inflate" "^0.2.6" - strtok3 "^10.2.0" - token-types "^6.0.0" - uint8array-extras "^1.4.0" - -file-type@^16.5.4: - version "16.5.4" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd" - integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw== - dependencies: - readable-web-to-node-stream "^3.0.0" - strtok3 "^6.2.4" - token-types "^4.1.1" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" - integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== - dependencies: - debug "^4.4.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - on-finished "^2.4.1" - parseurl "^1.3.3" - statuses "^2.0.1" - -find-cache-dir@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -fishery@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/fishery/-/fishery-2.4.0.tgz#181dc640968de88ed497dacc50a14eb39805c24a" - integrity sha512-QgeTlvgNhVGuMztrfAhlSIBs3rD3l9RMjl9I15yb/lnrx3njrOhvegr2L3LWdqvXwYfQjdQGpglyAfHH2J8DRA== - dependencies: - lodash.mergewith "^4.6.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" - integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== - -for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -foreground-child@^3.1.0, foreground-child@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -fork-ts-checker-webpack-plugin@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz#433481c1c228c56af111172fcad7df79318c915a" - integrity sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q== - dependencies: - "@babel/code-frame" "^7.16.7" - chalk "^4.1.2" - chokidar "^4.0.1" - cosmiconfig "^8.2.0" - deepmerge "^4.2.2" - fs-extra "^10.0.0" - memfs "^3.4.1" - minimatch "^3.0.4" - node-abort-controller "^3.0.1" - schema-utils "^3.1.1" - semver "^7.3.5" - tapable "^2.2.1" - -form-data@^2.3.1, form-data@^4.0.4, form-data@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" - integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -formidable@^1.2.0: - version "1.2.6" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" - integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" - integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz#632aa15a20e71828ed56b24303363fb1414e5997" - integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -generic-pool@3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" - integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-tsconfig@4.14.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" - integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== - dependencies: - resolve-pkg-maps "^1.0.0" - -giget@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/giget/-/giget-3.2.0.tgz#bacfdd1264f81485a915928b0ae219be0e81a7c9" - integrity sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A== - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@11.0.3, glob@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" - integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.1.1" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^10.4.5, glob@^10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" - integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-own-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" - integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@^2.0.0, http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - -http-errors@~1.6.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.7.0, iconv-lite@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" - integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -import-fresh@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ioredis-mock@^8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ioredis-mock/-/ioredis-mock-8.9.0.tgz#5d694c4b81d3835e4291e0b527f947e260981779" - integrity sha512-yIglcCkI1lvhwJVoMsR51fotZVsPsSk07ecTCgRTRlicG0Vq3lke6aAaHklyjmRNRsdYAgswqC2A0bPtQK4LSw== - dependencies: - "@ioredis/as-callback" "^3.0.0" - "@ioredis/commands" "^1.2.0" - fengari "^0.1.4" - fengari-interop "^0.1.3" - semver "^7.5.4" - -ioredis@>=5: - version "5.5.0" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.5.0.tgz#ff2332e125ca2ac8e15472ddd14ecdffa6484a2a" - integrity sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw== - dependencies: - "@ioredis/commands" "^1.1.1" - cluster-key-slot "^1.1.0" - debug "^4.3.4" - denque "^2.1.0" - lodash.defaults "^4.2.0" - lodash.isarguments "^3.1.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - standard-as-callback "^2.1.0" - -ioredis@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" - integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== - dependencies: - "@ioredis/commands" "^1.1.1" - cluster-key-slot "^1.1.0" - debug "^4.3.4" - denque "^2.1.0" - lodash.defaults "^4.2.0" - lodash.isarguments "^3.1.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - standard-as-callback "^2.1.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-in-ssh@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-in-ssh/-/is-in-ssh-1.0.0.tgz#8eb73c1cabba77748d389588eeea132a63057622" - integrity sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typed-array@^1.1.14: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" - integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== - dependencies: - is-inside-container "^1.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterare@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" - integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jackspeak@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" - integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-html-reporters@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/jest-html-reporters/-/jest-html-reporters-3.1.7.tgz#d8cb6f5d15fd518e601841f90165f37765e7ff34" - integrity sha512-GTmjqK6muQ0S0Mnksf9QkL9X9z2FGIpNSxC52E0PHDzjPQ1XDu2+XTI3B3FS43ZiUzD1f354/5FfwbNIBzT7ew== - dependencies: - fs-extra "^10.0.0" - open "^8.0.3" - -jest-junit@^16.0.0: - version "16.0.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785" - integrity sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ== - dependencies: - mkdirp "^1.0.4" - strip-ansi "^6.0.1" - uuid "^8.3.2" - xml "^1.0.1" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-when@^3.2.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/jest-when/-/jest-when-3.5.2.tgz#651d8a73751ab55c29698d388dffd3460cd52bdc" - integrity sha512-4rDvnhaWh08RcPsoEVXgxRnUIE9wVIbZtGqZ5x2Wm9Ziz9aQs89PipQFmOK0ycbEhVAgiV3MUeTXp3Ar4s2FcQ== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jiti@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64" - integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== - -joi@^17.4.0: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -jose@^5.1.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.4.0.tgz#4f6c2357e7b3cd4bc10ec65bb29e677d7adfbc84" - integrity sha512-6rpxTHPAQyWMb9A35BroFl1Sp0ST3DpPcm5EVIxZxdH+e0Hv9fwhyB3XLKFUcHNpdSDnETmBfuPPTTlYz5+USw== - -js-base64@^3.7.5: - version "3.7.7" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" - integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== - -js-cookie@^3.0.1: - version "3.0.7" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.7.tgz#0a53abfc459c8e89c85d7a38eb6cb68714965b8c" - integrity sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0, js-yaml@4.1.1, js-yaml@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" - integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - -jsesc@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1, json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonc-parser@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" - integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@^9.0.0: - version "9.0.3" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" - integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== - dependencies: - jws "^4.0.1" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -jsonwebtoken@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" - integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -jwa@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" - integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" - integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1" - integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g== - dependencies: - jwa "^1.4.2" - safe-buffer "^5.0.1" - -jws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" - integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== - dependencies: - jwa "^2.0.1" - safe-buffer "^5.0.1" - -keytar@^7.9.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb" - integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ== - dependencies: - node-addon-api "^4.3.0" - prebuild-install "^7.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -libphonenumber-js@^1.10.53: - version "1.11.11" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.11.tgz#f4d521d7e2d1958916820e3725e609a2ea7575a8" - integrity sha512-mF3KaORjJQR6JBNcOkluDcJKhtoQT4VTLRMrX1v/wlBayL4M8ybwEDeryyPcrSEJmD0rVwHUbBarpZwN5NfPFQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-esm@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/load-esm/-/load-esm-1.0.2.tgz#35dbac8a1a3abdb802cf236008048fcc8a9289a6" - integrity sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw== - -loader-runner@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" - integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== - -loader-utils@^1.0.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isarguments@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash@4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lodash@^4.17.15, lodash@^4.17.21, lodash@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -logform@^2.3.2, logform@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" - integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== - dependencies: - "@colors/colors" "1.5.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^11.0.0: - version "11.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.2.tgz#40fd37edffcfae4b2940379c0722dc6eeaa75f24" - integrity sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@0.30.17: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1, make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -memfs@^3.4.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" - integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@^1.1.1, methods@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@^3.0.0, mime-types@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" - integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== - dependencies: - mime-db "^1.54.0" - -mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" - integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^9.0.5: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - -mocha-junit-reporter@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz#739f5595d0f051d07af9d74e32c416e13a41cde5" - integrity sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw== - dependencies: - debug "^4.3.4" - md5 "^2.3.0" - mkdirp "^3.0.0" - strip-ansi "^6.0.1" - xml "^1.0.1" - -mocha-multi-reporters@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz#c73486bed5519e1d59c9ce39ac7a9792600e5676" - integrity sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg== - dependencies: - debug "^4.1.1" - lodash "^4.17.15" - -mocha@^11.7.5: - version "11.7.5" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.5.tgz#58f5bbfa5e0211ce7e5ee6128107cefc2515a627" - integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== - dependencies: - browser-stdout "^1.3.1" - chokidar "^4.0.1" - debug "^4.3.5" - diff "^7.0.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^9.0.5" - ms "^2.1.3" - picocolors "^1.1.1" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^9.2.0" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multer@2.0.1, multer@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/multer/-/multer-2.0.2.tgz#08a8aa8255865388c387aaf041426b0c87bf58dd" - integrity sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw== - dependencies: - append-field "^1.0.0" - busboy "^1.6.0" - concat-stream "^2.0.0" - mkdirp "^0.5.6" - object-assign "^4.1.1" - type-is "^1.6.18" - xtend "^4.0.2" - -mute-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" - integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== - -nan@^2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" - integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -negotiator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" - integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nest-winston@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/nest-winston/-/nest-winston-1.10.2.tgz#3a3de151677cbf393d2e2c2efd1f9222a5776708" - integrity sha512-Z9IzL/nekBOF/TEwBHUJDiDPMaXUcFquUQOFavIRet6xF0EbuWnOzslyN/ksgzG+fITNgXhMdrL/POp9SdaFxA== - dependencies: - fast-safe-stringify "^2.1.1" - -nestjs-form-data@~1.9.93: - version "1.9.93" - resolved "https://registry.yarnpkg.com/nestjs-form-data/-/nestjs-form-data-1.9.93.tgz#4d105cd59560ef2e8b16ddb5e187cabe8685cbbc" - integrity sha512-j1af2Ck+ix1A7M91wWemUU3hcF8UmHP19/eatEjfjD2Q/3289rckUvqK+rCSbsl3+w/W8PbHRllnGZxjOF8bOw== - dependencies: - uid "^2.0.0" - busboy "^1.6.0" - concat-stream "^2.0.0" - file-type "^16.5.4" - mkdirp "^1.0.4" - type-is "^1.6.18" - -nock@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.3.0.tgz#b13069c1a03f1ad63120f994b04bfd2556925768" - integrity sha512-HHqYQ6mBeiMc+N038w8LkMpDCRquCHWeNmN3v6645P3NhN2+qXOBqvPqo7Rt1VyCMzKhJ733wZqw5B7cQVFNPg== - dependencies: - debug "^4.1.0" - json-stringify-safe "^5.0.1" - lodash "^4.17.21" - propagate "^2.0.0" - -node-abi@^3.3.0: - version "3.92.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.92.0.tgz#18e2214677499b8dda81ffcd095afc763d5a9802" - integrity sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ== - dependencies: - semver "^7.3.5" - -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - -node-addon-api@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== - -node-cache@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" - integrity sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg== - dependencies: - clone "2.x" - -node-emoji@1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== - -node-releases@^2.0.36: - version "2.0.38" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.38.tgz#791569b9e4424a044e12c3abfad418ed83ce9947" - integrity sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw== - -node-version-compare@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/node-version-compare/-/node-version-compare-1.0.3.tgz#ca6d2005e67822fb4dfa259e08f1f6cfaabe2e81" - integrity sha512-unO5GpBAh5YqeGULMLpmDT94oanSDMwtZB8KHTKCH/qrGv8bHN0mlDj9xQDAicCYXv2OLnzdi67lidCrcVotVw== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-diff@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/object-diff/-/object-diff-0.0.4.tgz#d883b0444fe8fd6e04e595d7bb665682c916047f" - integrity sha512-V+OhEnGkRTtncF194MB6+Cd4Khogq0SvZzypUXHVzbay5xv5jtqgMkGQYB9bByq0FR9ygokwSOsvG05ybmqvPA== - -object-hash@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-hash@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -oblivious-set@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.4.0.tgz#1ee7c90f0605bb2a182fbcc8fffbe324d9994b43" - integrity sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg== - -ohash@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" - integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== - -on-finished@2.4.1, on-finished@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/open/-/open-11.0.0.tgz#897e6132f994d3554cbcf72e0df98f176a7e5f62" - integrity sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw== - dependencies: - default-browser "^5.4.0" - define-lazy-prop "^3.0.0" - is-in-ssh "^1.0.0" - is-inside-container "^1.0.0" - powershell-utils "^0.1.0" - wsl-utils "^0.3.0" - -open@^8.0.3: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -ora@5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-queue@6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -pako@^0.2.5: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - -pako@^1.0.6: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parseurl@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-scurry@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" - integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-to-regexp@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" - integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== - -path-to-regexp@8.4.2, path-to-regexp@^8.0.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" - integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -peek-readable@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" - integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== - -peek-readable@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-7.0.0.tgz#c6e4e78ec76f7005e5f6b51ffc93fdb91ede6512" - integrity sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ== - -perfect-debounce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz#e7078e38f231cb191855c3136a4423aef725d261" - integrity sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-types@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.1.tgz#fa27ed0940efcf40bba453b0e5cab41217b0d442" - integrity sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg== - dependencies: - confbox "^0.2.4" - exsolve "^1.0.8" - pathe "^2.0.3" - -pluralize@8.0.0, pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -powershell-utils@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/powershell-utils/-/powershell-utils-0.1.0.tgz#5a42c9a824fb4f2f251ccb41aaae73314f5d6ac2" - integrity sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A== - -prebuild-install@^7.0.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prebuild-install@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -propagate@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" - integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== - -proxy-addr@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" - integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -pvtsutils@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" - integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== - dependencies: - tslib "^2.4.0" - -pvutils@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" - integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -qs@^6.14.0, qs@^6.5.1: - version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" - integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== - dependencies: - side-channel "^1.1.0" - -quicktype-core@^23.0.116: - version "23.0.116" - resolved "https://registry.yarnpkg.com/quicktype-core/-/quicktype-core-23.0.116.tgz#9e057d80c848b0feec290d3e362bc63a388ca191" - integrity sha512-gMqXYRhKJaqUCnhbdb0jnBDkwgQ7NKNco5eucZcwVv2xOtry8a4zrek06Qgwyrgqj8faLcLVvjvpmRP+huPpsQ== - dependencies: - "@glideapps/ts-necessities" "2.1.3" - "@types/urijs" "^1.19.25" - browser-or-node "^2.1.1" - collection-utils "^1.0.1" - cross-fetch "^4.0.0" - is-url "^1.2.4" - js-base64 "^3.7.5" - lodash "^4.17.21" - pako "^1.0.6" - pluralize "^8.0.0" - readable-stream "4.5.2" - unicode-properties "^1.4.1" - urijs "^1.19.1" - wordwrap "^1.0.0" - yaml "^2.3.1" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" - integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.7.0" - unpipe "~1.0.0" - -rc9@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/rc9/-/rc9-3.0.1.tgz#3895e5834a2b5c2d8fb76d93e802fbcbc2579bc7" - integrity sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ== - dependencies: - defu "^6.1.6" - destr "^2.0.5" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha512-+UBirHHDm5J+3WDmLBZYSklRYg82nMlz+enn+GMZ22nSR2f4bzxmhso6rzQW/3mT2PVzpzDTiYIZahk8UmZ44w== - dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -readable-stream@4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" - integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - -readable-stream@^2.0.1, readable-stream@^2.3.5: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-web-to-node-stream@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" - integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== - dependencies: - readable-stream "^3.6.0" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -readdirp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" - integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== - -readline-sync@^1.4.9: - version "1.4.10" - resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" - integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== - -redis-errors@^1.0.0, redis-errors@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" - integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== - -redis-parser@3.0.0, redis-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" - integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== - dependencies: - redis-errors "^1.0.0" - -redis@^4.6.10: - version "4.6.10" - resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.10.tgz#07f6ea2b2c5455b098e76d1e8c9b3376114e9458" - integrity sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg== - dependencies: - "@redis/bloom" "1.2.0" - "@redis/client" "1.5.11" - "@redis/graph" "1.1.0" - "@redis/json" "1.0.6" - "@redis/search" "1.1.5" - "@redis/time-series" "1.0.5" - -reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -reflect-metadata@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" - integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== - -regenerate-unicode-properties@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" - integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexpu-core@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" - integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.2" - regjsgen "^0.8.0" - regjsparser "^0.13.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.2.1" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.13.0: - version "0.13.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.1.tgz#0593cbacb27527927692030928ae4d3b878d6f8d" - integrity sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw== - dependencies: - jsesc "~3.1.0" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.10.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.20.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.11: - version "1.22.12" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" - integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== - dependencies: - es-errors "^1.3.0" - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -router@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" - integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== - dependencies: - debug "^4.4.0" - depd "^2.0.0" - is-promise "^4.0.0" - parseurl "^1.3.3" - path-to-regexp "^8.0.0" - -run-applescript@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" - integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== - -rxjs@7.8.1, rxjs@^7.5.6: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -rxjs@^6.5.2: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" - integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -"semver@2 || 3 || 4 || 5", semver@7.7.4, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@^1.1.0, send@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" - integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== - dependencies: - debug "^4.3.5" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - fresh "^2.0.0" - http-errors "^2.0.0" - mime-types "^3.0.1" - ms "^2.1.3" - on-finished "^2.4.1" - range-parser "^1.2.1" - statuses "^2.0.1" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-static@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" - integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== - dependencies: - encodeurl "^2.0.0" - escape-html "^1.0.3" - parseurl "^1.3.3" - send "^1.2.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-function-length@^1.2.1, set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0, setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.12: - version "2.4.12" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" - integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - to-buffer "^1.2.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -socket.io-adapter@~2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" - integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== - dependencies: - debug "~4.3.4" - ws "~8.17.1" - -socket.io-client@^4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" - integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.6.1" - socket.io-parser "~4.2.4" - -socket.io-mock@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/socket.io-mock/-/socket.io-mock-1.3.2.tgz#3f6f56f9bc2a2852783bd8aae85159def5cd1942" - integrity sha512-p4MQBue3NAR8bXIHynRJxK/C+J3I3NpnnpgjptgLFSWv4u9Bdkubf2t0GCmyLmUTi03up0Cx/hQwzQfOpD187g== - dependencies: - component-emitter "^1.3.0" - -socket.io-parser@~4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.6.tgz#19156bf179af3931abd05260cfb1491822578a6f" - integrity sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.4.1" - -socket.io@4.8.1, socket.io@^4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" - integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.6.0" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.19, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sql-highlight@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sql-highlight/-/sql-highlight-6.1.0.tgz#e34024b4c6eac2744648771edfe3c1f894153743" - integrity sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA== - -ssh2@^1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.15.0.tgz#2f998455036a7f89e0df5847efb5421748d9871b" - integrity sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw== - dependencies: - asn1 "^0.2.6" - bcrypt-pbkdf "^1.0.2" - optionalDependencies: - cpu-features "~0.0.9" - nan "^2.18.0" - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -standard-as-callback@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" - integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -statuses@^2.0.1, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strtok3@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-10.2.2.tgz#a4c6d78d15db02c5eb20d92af3eedf81edaf09d2" - integrity sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg== - dependencies: - "@tokenizer/token" "^0.3.0" - peek-readable "^7.0.0" - -strtok3@^6.2.4: - version "6.3.0" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" - integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== - dependencies: - "@tokenizer/token" "^0.3.0" - peek-readable "^4.1.0" - -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - -supertest@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" - integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== - dependencies: - methods "^1.1.2" - superagent "^3.8.3" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swagger-ui-dist@5.21.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz#aed230fe6e294c9470217e67697d601e3bb8eb9d" - integrity sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg== - dependencies: - "@scarf/scarf" "=1.4.0" - -swagger-ui-dist@>=4.11.0: - version "4.18.3" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.18.3.tgz#5529b7ca19d442c1adf0aea0802fff45c1ea29b5" - integrity sha512-QW280Uvt234+TLo9NMPRa2Sj17RoorbQlR2eEY4R6Cs0LbdXhiO14YWX9OPBkBdiN64GQYz4zU8wlHLVi81lBg== - -swagger-ui-express@^4.1.4: - version "4.6.2" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.6.2.tgz#61b2cb9fd7932cdccff99e0efdf700a5459e493c" - integrity sha512-MHIOaq9JrTTB3ygUJD+08PbjM5Tt/q7x80yz9VTFIatw8j5uIWKcr90S0h5NLMzFEDC6+eVprtoeA5MDZXCUKQ== - dependencies: - swagger-ui-dist ">=4.11.0" - -symbol-observable@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" - integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== - -tar-fs@^2.0.0: - version "2.1.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" - integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1: - version "5.44.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.1.tgz#e391e92175c299b8c284ad6ded609e37303b0a9c" - integrity sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.15.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -tiny-emitter@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-1.1.0.tgz#ab405a21ffed814a76c19739648093d70654fecb" - integrity sha512-HFhr+OKGIHRO6krgzEt9MqbMO98wPDzDPr1BOpM/nZCChkK40UYn8b70nSjcan4jTzDSQecy1KRVVQRohIRWrw== - -tiny-inflate@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" - integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-buffer@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" - integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== - dependencies: - isarray "^2.0.5" - safe-buffer "^5.2.1" - typed-array-buffer "^1.0.3" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1, toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -token-types@^4.1.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz#0f897f03665846982806e138977dbe72d44df753" - integrity sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ== - dependencies: - "@tokenizer/token" "^0.3.0" - ieee754 "^1.2.1" - -token-types@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.0.0.tgz#1ab26be1ef9c434853500c071acfe5c8dd6544a3" - integrity sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA== - dependencies: - "@tokenizer/token" "^0.3.0" - ieee754 "^1.2.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@1.2.2, tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - -ts-jest@^29.2.5: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== - dependencies: - bs-logger "^0.2.6" - ejs "^3.1.10" - fast-json-stable-stringify "^2.1.0" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.6.3" - yargs-parser "^21.1.1" - -ts-loader@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58" - integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ== - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^4.0.0" - semver "^6.0.0" - -ts-mocha@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-11.1.0.tgz#d8336ec0146bd6f36cca2555f4cfc7df85bd1586" - integrity sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ== - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths-webpack-plugin@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz#f7459a8ed1dd4cf66ad787aefc3d37fff3cf07fc" - integrity sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.7.0" - tapable "^2.2.1" - tsconfig-paths "^4.1.2" - -tsconfig-paths-webpack-plugin@^3.3.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a" - integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.7.0" - tsconfig-paths "^3.9.0" - -tsconfig-paths@4.2.0, tsconfig-paths@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^3.9.0: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@2.8.1, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tunnel-ssh@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/tunnel-ssh/-/tunnel-ssh-5.1.2.tgz#da4b4e262633af26b0536a50963a827b9b9afef3" - integrity sha512-PNfxgg5aEV9ZWpx4oHvkyPoC7TvYGdbob9L35BrYGY/LM3mt5KUQ5uOO9PbT/gNQowGanOfli3JGwRZ+DTd2ZQ== - dependencies: - ssh2 "^1.15.0" - -tweetnacl@^0.14.3: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@^1.6.18, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type-is@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typeorm@^0.3.29: - version "0.3.29" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.29.tgz#811e27ee2e74bc269866d57ddab28740bfa85c8f" - integrity sha512-wwPEX/df4l72gCmOsrs0otJZYLGA9lLQkUZCkukbsymEycV4zXv2KM7wU7v2r8L01TaCgY9ApSSqHQWBOUhEoQ== - dependencies: - "@sqltools/formatter" "^1.2.5" - ansis "^4.2.0" - app-root-path "^3.1.0" - buffer "^6.0.3" - dayjs "^1.11.20" - debug "^4.4.3" - dedent "^1.7.2" - dotenv "^16.6.1" - glob "^10.5.0" - reflect-metadata "^0.2.2" - sha.js "^2.4.12" - sql-highlight "^6.1.0" - tslib "^2.8.1" - uuid "^11.1.1" - yargs "^17.7.2" - -typescript@5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" - integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== - -typescript@^4.8.2: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -uid@2.0.2, uid@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.2.tgz#4b5782abf0f2feeefc00fa88006b2b3b7af3e3b9" - integrity sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g== - dependencies: - "@lukeed/csprng" "^1.0.0" - -uint8array-extras@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.4.0.tgz#e42a678a6dd335ec2d21661333ed42f44ae7cc74" - integrity sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ== - -ulid@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ulid/-/ulid-3.0.2.tgz#b6a1f2a3de7852e39aa86bf497a8e33b1867c984" - integrity sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - -undici-types@~7.18.0: - version "7.18.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" - integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" - integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== - -unicode-properties@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" - integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== - dependencies: - base64-js "^1.3.0" - unicode-trie "^2.0.0" - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" - integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== - -unicode-trie@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" - integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== - dependencies: - pako "^0.2.5" - tiny-inflate "^1.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unload@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.4.1.tgz#b0c5b7fb44e17fcbf50dcb8fb53929c59dd226a5" - integrity sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-browserslist-db@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" - integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -update-browserslist-db@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urijs@^1.19.1: - version "1.19.11" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" - integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" - integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== - -uuid@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-14.0.0.tgz#0af883220163d264ffe0c084f6b8a89b9666966d" - integrity sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg== - -uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validator@^13.9.0: - version "13.15.23" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.23.tgz#59a874f84e4594588e3409ab1edbe64e96d0c62d" - integrity sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw== - -vary@^1, vary@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@^2.4.1: - version "2.4.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webcrypto-core@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" - integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - asn1js "^3.0.1" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -webcrypto-shim@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/webcrypto-shim/-/webcrypto-shim-0.1.7.tgz#da8be23061a0451cf23b424d4a9b61c10f091c12" - integrity sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-node-externals@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" - integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== - -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== - -webpack@5.100.2: - version "5.100.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.100.2.tgz#e2341facf9f7de1d702147c91bcb65b693adf9e8" - integrity sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.2" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.16: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -winston-daily-rotate-file@^4.5.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz#f60a643af87f8867f23170d8cd87dbe3603a625f" - integrity sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA== - dependencies: - file-stream-rotator "^0.6.1" - object-hash "^2.0.1" - triple-beam "^1.3.0" - winston-transport "^4.4.0" - -winston-transport@^4.4.0, winston-transport@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" - integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@^3.3.3: - version "3.8.2" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.8.2.tgz#56e16b34022eb4cff2638196d9646d7430fdad50" - integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== - dependencies: - "@colors/colors" "1.5.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.5.0" - -word-wrap@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -workerpool@^9.2.0: - version "9.3.4" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" - integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -wsl-utils@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.3.1.tgz#9479836ddf03be267aad3abfc3cb1f6e0c9f1ed1" - integrity sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg== - dependencies: - is-wsl "^3.1.0" - powershell-utils "^0.1.0" - -xhr2@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz#cbfc4759a69b4a888e78cf4f20b051038757bd11" - integrity sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw== - -xml@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== - -xmlhttprequest-ssl@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz#0d045c3b2babad8e7db1af5af093f5d0d60df99a" - integrity sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g== - -xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@4.0.0, yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@^2.3.1: - version "2.8.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" - integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1, yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yoctocolors-cjs@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" - integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== - -"zod@^3.25.0 || ^4.0.0": - version "4.4.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.4.3.tgz#b680f172885d18bbebf21a834ea25e55a1bbf356" - integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== diff --git a/redisinsight/desktop/package.json b/redisinsight/desktop/package.json index 18190f8e7c..5242fbde57 100644 --- a/redisinsight/desktop/package.json +++ b/redisinsight/desktop/package.json @@ -3,11 +3,11 @@ "version": "1.0.0", "main": "dist/index.js", "scripts": { - "dev": "cross-env ELECTRON_DEV=true ELECTRON_ENABLE_LOGGING=true ELECTRON_DEBUG_LOGGING=true ELECTRON_ENABLE_STACK_DUMPING=true NODE_ENV=development yarn build && yarn build:preload && yarn build:renderer && electron . --enable-logging --inspect=5858", + "dev": "cross-env ELECTRON_DEV=true ELECTRON_ENABLE_LOGGING=true ELECTRON_DEBUG_LOGGING=true ELECTRON_ENABLE_STACK_DUMPING=true NODE_ENV=development npm run build && npm run build:preload && npm run build:renderer && electron . --enable-logging --inspect=5858", "build": "cross-env ELECTRON_DEV=true ELECTRON_ENABLE_LOGGING=true ELECTRON_DEBUG_LOGGING=true ELECTRON_ENABLE_STACK_DUMPING=true NODE_ENV=development vite build --config vite.main.config.ts", "build:preload": "cross-env ELECTRON_DEV=true ELECTRON_ENABLE_LOGGING=true ELECTRON_DEBUG_LOGGING=true ELECTRON_ENABLE_STACK_DUMPING=true NODE_ENV=development vite build --config vite.preload.config.ts", "build:renderer": "cross-env ELECTRON_DEV=true ELECTRON_ENABLE_LOGGING=true ELECTRON_DEBUG_LOGGING=true ELECTRON_ENABLE_STACK_DUMPING=true NODE_ENV=development vite build --config vite.renderer.config.ts", - "type-check": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'yarn --cwd redisinsight/desktop tscheck'", + "type-check": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'npm run tscheck --prefix redisinsight/desktop'", "tscheck": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts overwrite .tscheck.rec.json", "tscheck:force": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts force_overwrite .tscheck.rec.json" } diff --git a/redisinsight/desktop/preload.ts b/redisinsight/desktop/preload.ts index fdbfd463e9..26dca9204d 100644 --- a/redisinsight/desktop/preload.ts +++ b/redisinsight/desktop/preload.ts @@ -4,7 +4,11 @@ import '@sentry/electron/preload' import { contextBridge, ipcRenderer } from 'electron' import { configRenderer as config } from 'desktopSrc/config/configRenderer' -import { IpcInvokeEvent, IpcOnEvent } from 'uiSrc/electron/constants' +import { + AppUpdateState, + IpcInvokeEvent, + IpcOnEvent, +} from 'uiSrc/electron/constants' import { WindowApp } from 'uiSrc/types' const ipcHandler = { @@ -35,6 +39,9 @@ contextBridge.exposeInMainWorld('app', { updateAvailable: (updateInfo: any) => { ipcRenderer.on(IpcOnEvent.appUpdateAvailable, updateInfo) }, + updateState: (callback: (event: unknown, state: AppUpdateState) => void) => { + ipcRenderer.on(IpcOnEvent.appUpdateState, callback) + }, ipc: ipcHandler, config: { apiPort: config.apiPort, diff --git a/redisinsight/desktop/src/lib/aboutPanel/aboutPanel.ts b/redisinsight/desktop/src/lib/aboutPanel/aboutPanel.ts index adc7e27c4a..1e5718d97d 100644 --- a/redisinsight/desktop/src/lib/aboutPanel/aboutPanel.ts +++ b/redisinsight/desktop/src/lib/aboutPanel/aboutPanel.ts @@ -7,7 +7,7 @@ const ICON_PATH = app.isPackaged : path.join(__dirname, '../resources', 'icon.png') const appVersionPrefix = config.isEnterprise ? 'Enterprise - ' : '' -const appVersion = app.getVersion() || '3.6.0' +const appVersion = app.getVersion() || '3.8.0' const appVersionSuffix = !config.isProduction ? `-dev-${process.getCreationTime()}` : '' diff --git a/redisinsight/desktop/src/lib/app/ipc.handlers.ts b/redisinsight/desktop/src/lib/app/ipc.handlers.ts index 65b00b1f2d..97aa76fe21 100644 --- a/redisinsight/desktop/src/lib/app/ipc.handlers.ts +++ b/redisinsight/desktop/src/lib/app/ipc.handlers.ts @@ -1,6 +1,18 @@ import { app, ipcMain, nativeTheme } from 'electron' -import { electronStore, setConsent } from 'desktopSrc/lib' -import { ElectronStorageItem, IpcInvokeEvent } from 'uiSrc/electron/constants' +import log from 'electron-log' +import { + electronStore, + setConsent, + getUpdateStrategy, + startUpdateDownload, + checkForUpdate, +} from 'desktopSrc/lib' +import { wrapErrorMessageSensitiveData } from 'desktopSrc/utils' +import { + AppUpdateStrategy, + ElectronStorageItem, + IpcInvokeEvent, +} from 'uiSrc/electron/constants' export const initIPCHandlers = () => { ipcMain.handle(IpcInvokeEvent.getAppVersion, () => app?.getVersion()) @@ -23,4 +35,41 @@ export const initIPCHandlers = () => { ipcMain.handle(IpcInvokeEvent.setSentryConsent, (_event, granted: boolean) => setConsent(!!granted), ) + + ipcMain.handle(IpcInvokeEvent.getUpdateStrategy, () => + process.env.RI_DISABLE_AUTO_UPGRADE === 'true' || process.mas + ? null + : getUpdateStrategy(), + ) + + ipcMain.handle( + IpcInvokeEvent.setUpdateStrategy, + (_event, strategy: AppUpdateStrategy) => { + if ( + process.env.RI_DISABLE_AUTO_UPGRADE === 'true' || + process.mas || + !Object.values(AppUpdateStrategy).includes(strategy) + ) { + return + } + + electronStore?.set(ElectronStorageItem.updateStrategy, strategy) + + checkForUpdate( + process.env.RI_MANUAL_UPGRADES_LINK || process.env.RI_UPGRADES_LINK, + ).catch((e) => log.error(wrapErrorMessageSensitiveData(e))) + }, + ) + + ipcMain.handle( + IpcInvokeEvent.skipUpdateVersion, + (_event, version: string) => { + electronStore?.set(ElectronStorageItem.updateSkippedVersion, version) + electronStore?.set(ElectronStorageItem.isUpdateAvailable, false) + }, + ) + + ipcMain.handle(IpcInvokeEvent.appUpdateDownload, (_event, version: string) => + startUpdateDownload(version), + ) } diff --git a/redisinsight/desktop/src/lib/sentry/sentry.ts b/redisinsight/desktop/src/lib/sentry/sentry.ts index 339f56ddeb..4c6b4c7bf8 100644 --- a/redisinsight/desktop/src/lib/sentry/sentry.ts +++ b/redisinsight/desktop/src/lib/sentry/sentry.ts @@ -4,7 +4,7 @@ import { crashReporter } from 'electron' import log from 'electron-log' import { electronStore } from 'desktopSrc/lib/store/store' import { ElectronStorageItem } from 'uiSrc/electron/constants' -import { minimizeEvent, scrubEvent } from 'uiSrc/services/sentry' +import { finalizeSentryEvent } from 'uiSrc/services/sentry' import pkg from '../../../../package.json' import configInit from '../../../config.json' @@ -112,8 +112,7 @@ export const initSentry = (): void => { // Breadcrumbs can carry sensitive data; keep only with consent. beforeBreadcrumb: (breadcrumb) => (consentGranted ? breadcrumb : null), beforeSend(event) { - const scrubbed = scrubEvent(event) - return consentGranted ? scrubbed : minimizeEvent(scrubbed) + return finalizeSentryEvent(event, consentGranted) }, }) diff --git a/redisinsight/desktop/src/lib/updater/updater.handlers.ts b/redisinsight/desktop/src/lib/updater/updater.handlers.ts index 9498f5c476..52309bcd07 100644 --- a/redisinsight/desktop/src/lib/updater/updater.handlers.ts +++ b/redisinsight/desktop/src/lib/updater/updater.handlers.ts @@ -2,24 +2,93 @@ import { app } from 'electron' import { autoUpdater, UpdateDownloadedEvent } from 'electron-updater' import log from 'electron-log' -import { electronStore, updateDownloaded } from 'desktopSrc/lib' +import { + electronStore, + updateDownloaded, + updateDownloadState, + sendUpdateState, + getUpdateStrategy, + drainQueuedRecheck, + UNPROMPTED_NOTIFICATION_DELAY, +} from 'desktopSrc/lib' import { wrapErrorMessageSensitiveData } from 'desktopSrc/utils' -import { ElectronStorageItem } from 'uiSrc/electron/constants' +import { AppUpdateStatus, ElectronStorageItem } from 'uiSrc/electron/constants' export const initAutoUpdaterHandlers = () => { + let pendingAvailableTimeout: ReturnType | null = null + let pendingAvailableVersion: string | null = null + + const clearPendingAvailable = () => { + if (pendingAvailableTimeout) { + clearTimeout(pendingAvailableTimeout) + pendingAvailableTimeout = null + pendingAvailableVersion = null + } + } + autoUpdater.on('checking-for-update', () => { log.info('Checking for update...') }) - autoUpdater.on('update-available', () => { + autoUpdater.on('update-available', (info) => { log.info('Update available.') electronStore?.set(ElectronStorageItem.isUpdateAvailable, true) + + if (autoUpdater.autoDownload) { + clearPendingAvailable() + return + } + + if (pendingAvailableTimeout && pendingAvailableVersion === info.version) { + return + } + + clearPendingAvailable() + pendingAvailableVersion = info.version + pendingAvailableTimeout = setTimeout(() => { + pendingAvailableTimeout = null + pendingAvailableVersion = null + + const skippedVersion = electronStore?.get( + ElectronStorageItem.updateSkippedVersion, + ) + + if (skippedVersion === info.version) { + electronStore?.set(ElectronStorageItem.isUpdateAvailable, false) + return + } + + if ( + updateDownloadState.downloadedInfo && + updateDownloadState.downloadedInfo.version === info.version + ) { + updateDownloaded(updateDownloadState.downloadedInfo) + return + } + + if (updateDownloadState.isDownloading) { + return + } + + sendUpdateState({ + status: AppUpdateStatus.Available, + version: info.version, + }) + }, UNPROMPTED_NOTIFICATION_DELAY) }) autoUpdater.on('update-not-available', () => { log.info('Update not available.') electronStore?.set(ElectronStorageItem.isUpdateAvailable, false) + clearPendingAvailable() }) autoUpdater.on('error', (err: Error) => { log.info(`Error in auto-updater. ${wrapErrorMessageSensitiveData(err)}`) + const wasManual = updateDownloadState.manuallyTriggered + updateDownloadState.isDownloading = false + updateDownloadState.manuallyTriggered = false + if (wasManual) { + sendUpdateState({ status: AppUpdateStatus.Error }) + } + drainQueuedRecheck() }) autoUpdater.on('download-progress', (progressObj: any) => { let logMessage = `Download speed: ${progressObj.bytesPerSecond}` @@ -35,6 +104,12 @@ export const initAutoUpdaterHandlers = () => { log.info('version', info.version) log.info('files', info.files) + clearPendingAvailable() + + updateDownloadState.isDownloading = false + updateDownloadState.downloadedInfo = info + electronStore?.delete(ElectronStorageItem.updateSkippedVersion) + // set updateDownloaded to electron storage for Telemetry send event APPLICATION_UPDATED electronStore?.set(ElectronStorageItem.updateDownloaded, true) electronStore?.set(ElectronStorageItem.updateDownloadedForTelemetry, true) @@ -46,7 +121,13 @@ export const initAutoUpdaterHandlers = () => { ElectronStorageItem.updatePreviousVersion, app.getVersion(), ) + electronStore?.set( + ElectronStorageItem.updateDownloadedStrategy, + updateDownloadState.initiatingStrategy ?? getUpdateStrategy(), + ) updateDownloaded(info) + updateDownloadState.manuallyTriggered = false + drainQueuedRecheck() }) } diff --git a/redisinsight/desktop/src/lib/updater/updater.ts b/redisinsight/desktop/src/lib/updater/updater.ts index 890ec02360..de2a3f1c60 100644 --- a/redisinsight/desktop/src/lib/updater/updater.ts +++ b/redisinsight/desktop/src/lib/updater/updater.ts @@ -1,43 +1,146 @@ +import { app } from 'electron' import log from 'electron-log' import { UpdateDownloadedEvent, autoUpdater } from 'electron-updater' import { wrapErrorMessageSensitiveData } from 'desktopSrc/utils' import { getWindows } from 'desktopSrc/lib/window' -import { IpcOnEvent } from 'uiSrc/electron/constants' +import { electronStore } from 'desktopSrc/lib/store/store' +import { + AppUpdateState, + AppUpdateStatus, + ElectronStorageItem, + IpcOnEvent, + AppUpdateStrategy, +} from 'uiSrc/electron/constants' -export const updateDownloaded = (updateInfo: UpdateDownloadedEvent) => { +export const updateDownloadState = { + isDownloading: false, + manuallyTriggered: false, + downloadedInfo: null as UpdateDownloadedEvent | null, + initiatingStrategy: null as AppUpdateStrategy | null, +} + +export const getUpdateStrategy = (): AppUpdateStrategy => { + const stored = electronStore?.get(ElectronStorageItem.updateStrategy) + return Object.values(AppUpdateStrategy).includes(stored as AppUpdateStrategy) + ? (stored as AppUpdateStrategy) + : AppUpdateStrategy.auto +} + +export const sendToRenderer = ( + channel: IpcOnEvent, + payload: any, + delay = 0, +) => { setTimeout(() => { const [currentWindow] = getWindows().values() - currentWindow?.webContents.send(IpcOnEvent.appUpdateAvailable, updateInfo) - }, 60 * 1_000) // 1 min + currentWindow?.webContents.send(channel, payload) + }, delay) } +export const UNPROMPTED_NOTIFICATION_DELAY = 60 * 1_000 + +export const updateDownloaded = (updateInfo: UpdateDownloadedEvent) => { + const delay = + updateDownloadState.manuallyTriggered && + updateDownloadState.initiatingStrategy === AppUpdateStrategy.notify + ? 0 + : UNPROMPTED_NOTIFICATION_DELAY + sendToRenderer(IpcOnEvent.appUpdateAvailable, updateInfo, delay) +} + +export const sendUpdateState = (state: AppUpdateState) => { + sendToRenderer(IpcOnEvent.appUpdateState, state) +} + +let queuedRecheckUrl: string | null = null + export const checkForUpdate = async (url: string = '') => { if (!url || process.mas) { return } - log.info('AppUpdater initialization') - log.transports.file.level = 'info' + if (updateDownloadState.isDownloading) { + queuedRecheckUrl = url + return + } + updateDownloadState.isDownloading = true try { - autoUpdater.setFeedURL({ - provider: 'generic', - url, - }) - } catch (_err) { - const error = _err as Error - log.error(wrapErrorMessageSensitiveData(error)) + log.info('AppUpdater initialization') + log.transports.file.level = 'info' + + try { + autoUpdater.setFeedURL({ + provider: 'generic', + url, + }) + } catch (_err) { + const error = _err as Error + log.error(wrapErrorMessageSensitiveData(error)) + } + + updateDownloadState.initiatingStrategy = getUpdateStrategy() + autoUpdater.forceDevUpdateConfig = !app.isPackaged + autoUpdater.autoDownload = + updateDownloadState.initiatingStrategy !== AppUpdateStrategy.notify + autoUpdater.autoInstallOnAppQuit = true + + const res = await autoUpdater.checkForUpdates() + + if (res?.downloadPromise) { + await res.downloadPromise + } + } finally { + updateDownloadState.isDownloading = false + // eslint-disable-next-line @typescript-eslint/no-use-before-define -- mutual recursion with drainQueuedRecheck, both hoisted function declarations + drainQueuedRecheck() + } +} + +export function drainQueuedRecheck() { + if (queuedRecheckUrl) { + const nextUrl = queuedRecheckUrl + queuedRecheckUrl = null + checkForUpdate(nextUrl).catch((e) => + log.error(wrapErrorMessageSensitiveData(e)), + ) } +} - autoUpdater.autoDownload = true - autoUpdater.autoInstallOnAppQuit = true +export const startUpdateDownload = (version?: string) => { + if (process.env.RI_DISABLE_AUTO_UPGRADE === 'true' || process.mas) { + return + } - const res = await autoUpdater.checkForUpdates() + if (updateDownloadState.isDownloading) { + sendUpdateState({ status: AppUpdateStatus.Error }) + return + } - if (res?.downloadPromise) { - await res.downloadPromise + if ( + updateDownloadState.downloadedInfo && + updateDownloadState.downloadedInfo.version === version + ) { + updateDownloadState.manuallyTriggered = true + updateDownloadState.initiatingStrategy = getUpdateStrategy() + updateDownloaded(updateDownloadState.downloadedInfo) + updateDownloadState.manuallyTriggered = false + return } + + updateDownloadState.isDownloading = true + updateDownloadState.manuallyTriggered = true + autoUpdater.downloadUpdate().catch((e) => { + log.error(wrapErrorMessageSensitiveData(e)) + if (!updateDownloadState.manuallyTriggered) { + return + } + updateDownloadState.isDownloading = false + updateDownloadState.manuallyTriggered = false + sendUpdateState({ status: AppUpdateStatus.Error }) + drainQueuedRecheck() + }) } export const initAutoUpdateChecks = (url = '', interval = 84 * 3600 * 1000) => { diff --git a/redisinsight/package-lock.json b/redisinsight/package-lock.json new file mode 100644 index 0000000000..73b9ebb3a4 --- /dev/null +++ b/redisinsight/package-lock.json @@ -0,0 +1,570 @@ +{ + "name": "redisinsight", + "version": "3.8.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redisinsight", + "version": "3.8.0", + "hasInstallScript": true, + "dependencies": { + "better-sqlite3": "^13.0.3", + "keytar": "^7.9.0", + "tunnel-ssh": "^5.1.2" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-sqlite3": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz", + "integrity": "sha512-RbOBxmLBG8uvFUc15X9+9SFemKcQ0WBuISBVkpuiaUB2qblC8UWlHEjdWVoZ8AdhSwmoEgsiXKfopX0CQxaACQ==", + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/better-sqlite3/node_modules/node-addon-api": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/cpu-features": { + "resolved": "node_modules/ssh2/api/stubs/cpu-features", + "link": true + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.20.0" + } + }, + "node_modules/ssh2/api/stubs/cpu-features": { + "optional": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tunnel-ssh": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tunnel-ssh/-/tunnel-ssh-5.1.2.tgz", + "integrity": "sha512-PNfxgg5aEV9ZWpx4oHvkyPoC7TvYGdbob9L35BrYGY/LM3mt5KUQ5uOO9PbT/gNQowGanOfli3JGwRZ+DTd2ZQ==", + "license": "MIT", + "dependencies": { + "ssh2": "^1.15.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/redisinsight/package.json b/redisinsight/package.json index 3dc0a4461e..4216511ead 100644 --- a/redisinsight/package.json +++ b/redisinsight/package.json @@ -3,7 +3,7 @@ "appName": "Redis Insight", "productName": "RedisInsight", "private": true, - "version": "3.6.0", + "version": "3.8.0", "description": "Redis Insight", "main": "./dist/main/main.js", "author": { @@ -14,12 +14,12 @@ "scripts": { "postinstall": "npx patch-package" }, - "resolutions": { - "**/semver": "^7.5.2", - "**/cpu-features": "file:./api/stubs/cpu-features" + "overrides": { + "semver": "^7.5.2", + "cpu-features": "file:./api/stubs/cpu-features" }, "dependencies": { - "better-sqlite3": "^12.10.1", + "better-sqlite3": "^13.0.3", "keytar": "^7.9.0", "tunnel-ssh": "^5.1.2" } diff --git a/redisinsight/ui/.tscheck.rec.json b/redisinsight/ui/.tscheck.rec.json index 7f280c4009..5c75252765 100644 --- a/redisinsight/ui/.tscheck.rec.json +++ b/redisinsight/ui/.tscheck.rec.json @@ -93,9 +93,6 @@ "src/components/main-router/constants/defaultRoutes.ts": { "TS2322": 4 }, - "src/components/markdown/CloudLink/CloudLink.spec.tsx": { - "TS2741": 2 - }, "src/components/markdown/CloudLink/CloudLink.tsx": { "TS2345": 1 }, @@ -205,7 +202,7 @@ "src/components/virtual-grid/VirtualGrid.tsx": { "TS18048": 1, "TS2339": 8, - "TS2345": 3, + "TS2345": 1, "TS2769": 1, "TS7031": 1 }, @@ -217,9 +214,6 @@ "TS2698": 1, "TS2769": 4 }, - "src/components/virtual-list/VirtualList.tsx": { - "TS18048": 1 - }, "src/components/virtual-table/VirtualTable.tsx": { "TS2322": 2, "TS2339": 1 @@ -378,10 +372,6 @@ "src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx": { "TS2322": 2 }, - "src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx": { - "TS18048": 1, - "TS2769": 1 - }, "src/pages/browser/components/key-list/KeyList.spec.tsx": { "TS2322": 9, "TS2339": 3, @@ -703,9 +693,6 @@ "src/pages/vector-search/components/index-info/IndexInfo.stories.tsx": { "TS2322": 9 }, - "src/pages/vector-search/components/index-info/IndexInfo.utils.spec.ts": { - "TS2322": 1 - }, "src/pages/vector-search/hooks/useCreateIndexFlow/useCreateIndexFlow.spec.ts": { "TS2345": 1 }, @@ -755,19 +742,9 @@ "TS2339": 5, "TS2345": 4 }, - "src/services/formatter/FormatSelector.spec.ts": { - "TS18046": 1 - }, - "src/services/formatter/MarkdownToJsxString.ts": { - "TS2345": 4, - "TS2769": 3 - }, "src/services/query-library/QueryLibraryService.spec.ts": { "TS2322": 1 }, - "src/services/tests/formatter/MarkdownToJsxString.spec.ts": { - "TS2352": 1 - }, "src/setup-env.ts": { "TS2307": 1 }, @@ -1013,9 +990,6 @@ "src/utils/tests/events/handleDownloadButton.spec.ts": { "TS2345": 1 }, - "src/utils/tests/formatters/markdown/remarkRedisUpload.spec.ts": { - "TS2339": 3 - }, "src/utils/tests/formatters/valueFormatters.spec.ts": { "TS2769": 2 }, diff --git a/redisinsight/ui/package.json b/redisinsight/ui/package.json index 3a455842e9..6fb69b49dc 100644 --- a/redisinsight/ui/package.json +++ b/redisinsight/ui/package.json @@ -13,11 +13,11 @@ "dev": "vite dev", "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build", "stats": "NODE_OPTIONS=--max_old_space_size=8192 npx vite-bundle-visualizer --open -o ./dist-stats.html --sourcemap", - "type-check": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'yarn --cwd redisinsight/ui tscheck'", + "type-check": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts compare .tscheck.rec.json 'npm run tscheck --prefix redisinsight/ui'", "tscheck": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts overwrite .tscheck.rec.json", "tscheck:force": "tsc --project tsconfig.json --noEmit --pretty false | tsc-output-parser | tsx ../../scripts/ts-error-check.ts force_overwrite .tscheck.rec.json" }, - "resolutions": { - "**/form-data": "^4.0.4" + "overrides": { + "form-data": "^4.0.4" } } diff --git a/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.tsx b/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.tsx index 05235cdccb..606f75794b 100644 --- a/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.tsx +++ b/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.tsx @@ -20,8 +20,10 @@ import { useConnectionType } from 'uiSrc/components/hooks/useConnectionType' import { ONBOARDING_FEATURES } from 'uiSrc/components/onboarding-features' import Tabs, { TabInfo } from 'uiSrc/components/base/layout/tabs' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' const AnalyticsTabs = () => { + const { t } = useTranslation() const { viewTab } = useAppSelector(analyticsSettingsSelector) const connectionType = useConnectionType() const { currentStep } = useAppSelector(appFeatureOnboardingSelector) @@ -46,7 +48,7 @@ const AnalyticsTabs = () => { value: AnalyticsViewTab.DatabaseAnalysis, content: null, label: renderOnboardingTourWithChild( - Database Analysis, + {t('analytics.nav.databaseAnalysis')}, { options: ONBOARDING_FEATURES?.ANALYTICS_DATABASE_ANALYSIS, anchorPosition: 'downLeft', @@ -59,7 +61,7 @@ const AnalyticsTabs = () => { value: AnalyticsViewTab.SlowLog, content: null, label: renderOnboardingTourWithChild( - Slow Log, + {t('analytics.nav.slowLog')}, { options: ONBOARDING_FEATURES?.ANALYTICS_SLOW_LOG, anchorPosition: 'downLeft', @@ -75,7 +77,7 @@ const AnalyticsTabs = () => { value: AnalyticsViewTab.ClusterDetails, content: null, label: renderOnboardingTourWithChild( - Overview, + {t('analytics.nav.overview')}, { options: ONBOARDING_FEATURES?.ANALYTICS_OVERVIEW, anchorPosition: 'downLeft', @@ -87,7 +89,7 @@ const AnalyticsTabs = () => { } return visibleTabs - }, [viewTab, connectionType]) + }, [t, viewTab, connectionType]) const handleTabChange = (id: string) => { if (viewTab === id) return diff --git a/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx index 245cc7ae81..fb13cb447b 100644 --- a/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx +++ b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx @@ -22,6 +22,10 @@ describe('AutoRefresh', () => { jest.clearAllMocks() jest.spyOn(localStorageService, 'get').mockImplementation(() => null) }) + + afterEach(() => { + jest.useRealTimers() + }) it('should render', () => { expect(render()).toBeTruthy() }) @@ -157,12 +161,14 @@ describe('AutoRefresh', () => { }) it('should call onRefresh after enable auto-refresh and set 1 sec', async () => { + jest.useFakeTimers() + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }) const onRefresh = jest.fn() render() - await userEvent.click(screen.getByTestId('auto-refresh-config-btn')) + await user.click(screen.getByTestId('auto-refresh-config-btn')) await waitForRiPopoverVisible() - await userEvent.click(screen.getByTestId('auto-refresh-switch')) + await user.click(screen.getByTestId('auto-refresh-switch')) fireEvent.click(screen.getByTestId('refresh-rate')) fireEvent.change(screen.getByTestId(INLINE_ITEM_EDITOR), { @@ -170,21 +176,20 @@ describe('AutoRefresh', () => { }) expect(screen.getByTestId(INLINE_ITEM_EDITOR)).toHaveValue('1') - await userEvent.click(screen.getByTestId(/apply-btn/)) - // screen.getByTestId(/apply-btn/).click() + await user.click(screen.getByTestId(/apply-btn/)) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(1) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(2) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(3) }) @@ -263,14 +268,16 @@ describe('AutoRefresh', () => { }) it('should NOT call onRefresh with disabled state', async () => { + jest.useFakeTimers() + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }) const onRefresh = jest.fn() const { rerender } = render( , ) - await userEvent.click(screen.getByTestId('auto-refresh-config-btn')) + await user.click(screen.getByTestId('auto-refresh-config-btn')) await waitForRiPopoverVisible() - await userEvent.click(screen.getByTestId('auto-refresh-switch')) + await user.click(screen.getByTestId('auto-refresh-switch')) fireEvent.click(screen.getByTestId('refresh-rate')) fireEvent.change(screen.getByTestId(INLINE_ITEM_EDITOR), { target: { value: '1' }, @@ -278,9 +285,11 @@ describe('AutoRefresh', () => { expect(screen.getByTestId(INLINE_ITEM_EDITOR)).toHaveValue('1') - screen.getByTestId(/apply-btn/).click() + act(() => { + screen.getByTestId(/apply-btn/).click() + }) - await act(async () => { + act(() => { rerender( { ) }) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(0) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(0) - await act(async () => { + act(() => { rerender( { ) }) - await act(async () => { - await new Promise((r) => setTimeout(r, 1300)) + act(() => { + jest.advanceTimersByTime(1_000) }) expect(onRefresh).toHaveBeenCalledTimes(1) }) diff --git a/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.spec.tsx b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.spec.tsx new file mode 100644 index 0000000000..41cdd02025 --- /dev/null +++ b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.spec.tsx @@ -0,0 +1,86 @@ +import React from 'react' +import { render, screen, fireEvent } from 'uiSrc/utils/test-utils' + +import { AzureSignInDialog } from './AzureSignInDialog' +import { AzureSignInDialogProps } from './AzureSignInDialog.types' + +const TEST_ID = 'azure-sign-in-dialog' + +describe('AzureSignInDialog', () => { + const defaultProps: AzureSignInDialogProps = { + isOpen: true, + loading: false, + onClose: jest.fn(), + onSignIn: jest.fn(), + } + + const renderComponent = (propsOverride?: Partial) => + render() + + beforeEach(() => { + jest.clearAllMocks() + }) + + it('should not render when isOpen is false', () => { + renderComponent({ isOpen: false }) + + expect(screen.queryByTestId(`${TEST_ID}-body`)).not.toBeInTheDocument() + }) + + it('should render sign-in and cancel buttons by default', () => { + renderComponent() + + expect(screen.getByTestId(`${TEST_ID}-sign-in`)).toBeInTheDocument() + expect(screen.getByTestId(`${TEST_ID}-cancel`)).toBeInTheDocument() + }) + + it('should show the tenant field by default', () => { + renderComponent() + + expect(screen.getByTestId(`${TEST_ID}-tenant-input`)).toBeInTheDocument() + }) + + it('should sign in with no tenant when the field is left empty', () => { + const onSignIn = jest.fn() + renderComponent({ onSignIn }) + + fireEvent.click(screen.getByTestId(`${TEST_ID}-sign-in`)) + + expect(onSignIn).toHaveBeenCalledWith(undefined) + }) + + it('should sign in with the entered tenant', () => { + const onSignIn = jest.fn() + renderComponent({ onSignIn }) + + fireEvent.change(screen.getByTestId(`${TEST_ID}-tenant-input`), { + target: { value: 'your-tenant.onmicrosoft.com' }, + }) + fireEvent.click(screen.getByTestId(`${TEST_ID}-sign-in`)) + + expect(onSignIn).toHaveBeenCalledWith('your-tenant.onmicrosoft.com') + }) + + it('should disable sign-in and not submit an invalid tenant', () => { + const onSignIn = jest.fn() + renderComponent({ onSignIn }) + + fireEvent.change(screen.getByTestId(`${TEST_ID}-tenant-input`), { + target: { value: 'not a tenant' }, + }) + + expect(screen.getByTestId(`${TEST_ID}-sign-in`)).toBeDisabled() + + fireEvent.click(screen.getByTestId(`${TEST_ID}-sign-in`)) + expect(onSignIn).not.toHaveBeenCalled() + }) + + it('should call onClose when cancel is clicked', () => { + const onClose = jest.fn() + renderComponent({ onClose }) + + fireEvent.click(screen.getByTestId(`${TEST_ID}-cancel`)) + + expect(onClose).toHaveBeenCalled() + }) +}) diff --git a/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.styles.ts b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.styles.ts new file mode 100644 index 0000000000..b72aa0a890 --- /dev/null +++ b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.styles.ts @@ -0,0 +1,6 @@ +import styled from 'styled-components' +import { Modal } from 'uiSrc/components/base/display/modal' + +export const ModalContent = styled(Modal.Content.Compose)` + width: 540px; +` diff --git a/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.tsx b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.tsx new file mode 100644 index 0000000000..441497bb27 --- /dev/null +++ b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.tsx @@ -0,0 +1,123 @@ +import React, { useCallback, useEffect, useState } from 'react' + +import { Modal } from 'uiSrc/components/base/display' +import { CancelIcon } from 'uiSrc/components/base/icons' +import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { Spacer } from 'uiSrc/components/base/layout' +import { Text } from 'uiSrc/components/base/text' +import TextInput from 'uiSrc/components/base/inputs/TextInput' +import { FormField } from 'uiSrc/components/base/forms/FormField' +import { + PrimaryButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' +import { useTranslation } from 'uiSrc/i18n' + +import { AzureSignInDialogProps } from './AzureSignInDialog.types' +import * as S from './AzureSignInDialog.styles' + +const TEST_ID = 'azure-sign-in-dialog' + +// A tenant is either a GUID or a domain (e.g. your-tenant.onmicrosoft.com). +// Mirrors AZURE_TENANT_ID_REGEX on the backend. +const AZURE_TENANT_ID_REGEX = + /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,})$/i + +export const AzureSignInDialog = ({ + isOpen, + loading, + onClose, + onSignIn, +}: AzureSignInDialogProps) => { + const { t } = useTranslation() + const [tenantId, setTenantId] = useState('') + + useEffect(() => { + if (isOpen) { + setTenantId('') + } + }, [isOpen]) + + const trimmedTenant = tenantId.trim() + const isTenantInvalid = + trimmedTenant.length > 0 && !AZURE_TENANT_ID_REGEX.test(trimmedTenant) + + const handleSignIn = useCallback(() => { + if (isTenantInvalid) return + onSignIn(trimmedTenant || undefined) + }, [isTenantInvalid, trimmedTenant, onSignIn]) + + if (!isOpen) return null + + return ( + + + + + + + {t('autodiscover.azure.signIn.title')} + + + + + + + + {t('autodiscover.azure.signIn.description')} + + + + + + + + + {isTenantInvalid + ? t('autodiscover.azure.signIn.tenantError') + : t('autodiscover.azure.signIn.tenantHint')} + + + + + + + + + {t('autodiscover.azure.button.cancel')} + + + {t('autodiscover.azure.signIn.signInButton')} + + + + + ) +} + +export default AzureSignInDialog diff --git a/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.types.ts b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.types.ts new file mode 100644 index 0000000000..8dc234e88a --- /dev/null +++ b/redisinsight/ui/src/components/azure-sign-in-dialog/AzureSignInDialog.types.ts @@ -0,0 +1,11 @@ +export interface AzureSignInDialogProps { + isOpen: boolean + loading?: boolean + onClose: () => void + /** + * Called when the user confirms sign-in. `tenantId` is the optional tenant + * (GUID or domain) from the Tenant ID field, or undefined for the default + * home-tenant sign-in. + */ + onSignIn: (tenantId?: string) => void +} diff --git a/redisinsight/ui/src/components/azure-sign-in-dialog/index.ts b/redisinsight/ui/src/components/azure-sign-in-dialog/index.ts new file mode 100644 index 0000000000..30d3da7077 --- /dev/null +++ b/redisinsight/ui/src/components/azure-sign-in-dialog/index.ts @@ -0,0 +1,2 @@ +export { AzureSignInDialog, default } from './AzureSignInDialog' +export type { AzureSignInDialogProps } from './AzureSignInDialog.types' diff --git a/redisinsight/ui/src/components/base/code-editor/CodeEditor.styles.ts b/redisinsight/ui/src/components/base/code-editor/CodeEditor.styles.ts index da16a1fb13..e8477ecea0 100644 --- a/redisinsight/ui/src/components/base/code-editor/CodeEditor.styles.ts +++ b/redisinsight/ui/src/components/base/code-editor/CodeEditor.styles.ts @@ -45,7 +45,7 @@ const monacoStyle = (theme: Theme) => { --monaco-color-submit: ${colors.icon.success500}; --monaco-color-bg: ${bgColor}; --monaco-color-params: ${colors.text.discovery200}; - + /* Font sizes */ --monaco-font-size-s: ${fontSize.s13}; --monaco-font-size-m: ${fontSize.s16}; diff --git a/redisinsight/ui/src/components/base/icons/RiHighlightedIcon.tsx b/redisinsight/ui/src/components/base/icons/RiHighlightedIcon.tsx new file mode 100644 index 0000000000..960252bb27 --- /dev/null +++ b/redisinsight/ui/src/components/base/icons/RiHighlightedIcon.tsx @@ -0,0 +1 @@ +export { HighlightedIcon as RiHighlightedIcon } from '@redis-ui/components' diff --git a/redisinsight/ui/src/components/base/icons/index.ts b/redisinsight/ui/src/components/base/icons/index.ts index 97a7174465..123de3d5ff 100644 --- a/redisinsight/ui/src/components/base/icons/index.ts +++ b/redisinsight/ui/src/components/base/icons/index.ts @@ -2,5 +2,7 @@ export * from './Icon' // New centralized icon system export * from './RiIcon' +// Highlighted (chip-style) icon wrapper +export * from './RiHighlightedIcon' // Export all individual icons from the registry export * from './iconRegistry' diff --git a/redisinsight/ui/src/components/browser/columns-menu/ColumnsMenu.tsx b/redisinsight/ui/src/components/browser/columns-menu/ColumnsMenu.tsx index c45316aa68..943a020f1b 100644 --- a/redisinsight/ui/src/components/browser/columns-menu/ColumnsMenu.tsx +++ b/redisinsight/ui/src/components/browser/columns-menu/ColumnsMenu.tsx @@ -6,6 +6,7 @@ import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { Checkbox } from 'uiSrc/components/base/forms/checkbox/Checkbox' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import * as S from './ColumnsMenu.styles' @@ -15,6 +16,7 @@ export interface ColumnsMenuProps { } const ColumnsMenu = ({ shownColumns, onToggleColumn }: ColumnsMenuProps) => { + const { t } = useTranslation() const [isOpen, setIsOpen] = useState(false) const toggleVisibility = () => setIsOpen(!isOpen) @@ -29,11 +31,11 @@ const ColumnsMenu = ({ shownColumns, onToggleColumn }: ColumnsMenuProps) => { - Columns + {t('browser.keysHeader.columns')} } > @@ -44,7 +46,7 @@ const ColumnsMenu = ({ shownColumns, onToggleColumn }: ColumnsMenuProps) => { onToggleColumn(e.target.checked, BrowserColumns.Size) @@ -54,7 +56,7 @@ const ColumnsMenu = ({ shownColumns, onToggleColumn }: ColumnsMenuProps) => { @@ -72,7 +74,7 @@ const ColumnsMenu = ({ shownColumns, onToggleColumn }: ColumnsMenuProps) => { onToggleColumn(e.target.checked, BrowserColumns.TTL) diff --git a/redisinsight/ui/src/components/browser/view-switch/ViewSwitch.tsx b/redisinsight/ui/src/components/browser/view-switch/ViewSwitch.tsx index 5e08b1e8ed..16ed2497aa 100644 --- a/redisinsight/ui/src/components/browser/view-switch/ViewSwitch.tsx +++ b/redisinsight/ui/src/components/browser/view-switch/ViewSwitch.tsx @@ -6,6 +6,7 @@ import { OnboardingTour } from 'uiSrc/components' import { ONBOARDING_FEATURES } from 'uiSrc/components/onboarding-features' import { ButtonGroup } from 'uiSrc/components/base/forms/button-group/ButtonGroup' import { KeyViewType } from 'uiSrc/slices/interfaces/keys' +import { useTranslation } from 'uiSrc/i18n' import { ISwitchType, ViewSwitchProps } from './ViewSwitch.types' import * as S from './ViewSwitch.styles' @@ -15,20 +16,21 @@ const ViewSwitch = ({ isTreeViewDisabled = false, onChange, }: ViewSwitchProps) => { + const { t } = useTranslation() const viewTypes: ISwitchType[] = [ { type: KeyViewType.Browser, - tooltipText: 'List View', - ariaLabel: 'List view button', + tooltipText: t('browser.keysHeader.view.listTooltip'), + ariaLabel: t('browser.keysHeader.view.listAria'), dataTestId: 'view-type-browser-btn', getIconType: () => EqualIcon, }, { type: KeyViewType.Tree, tooltipText: isTreeViewDisabled - ? 'Tree View is unavailable when the HEX key name format is selected.' - : 'Tree View', - ariaLabel: 'Tree view button', + ? t('browser.keysHeader.view.treeDisabledTooltip') + : t('browser.keysHeader.view.treeTooltip'), + ariaLabel: t('browser.keysHeader.view.treeAria'), dataTestId: 'view-type-list-btn', disabled: isTreeViewDisabled, getIconType: () => FoldersIcon, diff --git a/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.spec.tsx b/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.spec.tsx index 7acb79adb5..67b40709f9 100644 --- a/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.spec.tsx +++ b/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.spec.tsx @@ -1,32 +1,13 @@ -import { cloneDeep, set } from 'lodash' import React from 'react' import { Environment } from 'apiClient' -import { FeatureFlags } from 'uiSrc/constants' -import { - initialStateDefault, - mockStore, - render, - screen, -} from 'uiSrc/utils/test-utils' +import { render, screen } from 'uiSrc/utils/test-utils' import { EnvironmentBadge } from './EnvironmentBadge' -const withProdModeFlag = (flag: boolean) => { - const state = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.prodMode}`, - { flag }, - ) - return { store: mockStore(state) } -} - describe('EnvironmentBadge', () => { it('renders the PROD badge for production environment', () => { - render( - , - withProdModeFlag(true), - ) + render() expect( screen.getByTestId(`environment-badge-${Environment.Production}`), @@ -35,10 +16,7 @@ describe('EnvironmentBadge', () => { }) it('renders the DEV label for development environment', () => { - render( - , - withProdModeFlag(true), - ) + render() expect( screen.getByTestId(`environment-badge-${Environment.Development}`), @@ -49,26 +27,13 @@ describe('EnvironmentBadge', () => { it('renders nothing for unspecified environment', () => { const { container } = render( , - withProdModeFlag(true), ) expect(container).toBeEmptyDOMElement() }) it('renders nothing when environment is undefined', () => { - const { container } = render( - , - withProdModeFlag(true), - ) - - expect(container).toBeEmptyDOMElement() - }) - - it('renders nothing when the prodMode feature flag is off', () => { - const { container } = render( - , - withProdModeFlag(false), - ) + const { container } = render() expect(container).toBeEmptyDOMElement() }) @@ -79,7 +44,6 @@ describe('EnvironmentBadge', () => { environment={Environment.Production} dataTestId="custom-badge" />, - withProdModeFlag(true), ) expect(screen.getByTestId('custom-badge')).toBeInTheDocument() diff --git a/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.tsx b/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.tsx index d310c74bcb..3b26e2efc4 100644 --- a/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.tsx +++ b/redisinsight/ui/src/components/environment-badge/EnvironmentBadge.tsx @@ -1,7 +1,5 @@ import React from 'react' -import { useAppSelector } from 'uiSrc/slices/hooks' -import { appFeatureFlagProdModeSelector } from 'uiSrc/slices/app/features' import { RiBadge } from 'uiSrc/components/base/display/badge/RiBadge' import { RiTooltip } from 'uiSrc/components/base/tooltip/RITooltip' @@ -12,9 +10,7 @@ export const EnvironmentBadge = ({ environment, dataTestId, }: EnvironmentBadgeProps) => { - const flagEnabled = useAppSelector(appFeatureFlagProdModeSelector) - - if (!flagEnabled || !environment) return null + if (!environment) return null const config = BADGE_CONFIG[environment] if (!config) return null diff --git a/redisinsight/ui/src/components/full-screen/FullScreen.tsx b/redisinsight/ui/src/components/full-screen/FullScreen.tsx index 1b2f23934a..01c7d16f6a 100644 --- a/redisinsight/ui/src/components/full-screen/FullScreen.tsx +++ b/redisinsight/ui/src/components/full-screen/FullScreen.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { ExtendIcon, ShrinkIcon } from 'uiSrc/components/base/icons' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { RiTooltip } from 'uiSrc/components' @@ -15,20 +16,27 @@ const FullScreen = ({ onToggleFullScreen, anchorClassName = '', btnTestId = 'toggle-full-screen', -}: Props) => ( - - - -) +}: Props) => { + const { t } = useTranslation() + return ( + + + + ) +} export { FullScreen } diff --git a/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.spec.tsx b/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.spec.tsx index 62bafe11d6..063d6471af 100644 --- a/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.spec.tsx +++ b/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.spec.tsx @@ -76,6 +76,7 @@ describe('GlobalAzureAuth', () => { id: faker.string.uuid(), username: faker.internet.email(), name: faker.person.fullName(), + tenantId: faker.string.uuid(), } const storedValue = JSON.stringify({ diff --git a/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.tsx b/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.tsx index 0294192b9e..5523ffd463 100644 --- a/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.tsx +++ b/redisinsight/ui/src/components/global-azure-auth/GlobalAzureAuth.tsx @@ -28,6 +28,7 @@ interface AzureOAuthCallbackPayload { id: string username: string name?: string + tenantId?: string } error?: string } @@ -56,6 +57,7 @@ const GlobalAzureAuth = () => { id: account.id, username: account.username, name: account.name, + tenantId: account.tenantId, } const currentSource = sourceRef.current dispatch(handleAzureOAuthSuccess(azureAccount)) diff --git a/redisinsight/ui/src/components/global-dialogs/GlobalDialogs.tsx b/redisinsight/ui/src/components/global-dialogs/GlobalDialogs.tsx index 9145d8dea8..3a329b48a7 100644 --- a/redisinsight/ui/src/components/global-dialogs/GlobalDialogs.tsx +++ b/redisinsight/ui/src/components/global-dialogs/GlobalDialogs.tsx @@ -15,9 +15,7 @@ const GlobalDialogs = () => ( - - - + ) diff --git a/redisinsight/ui/src/components/hooks/useAzureAuth.ts b/redisinsight/ui/src/components/hooks/useAzureAuth.ts index 96c4bccae3..427a0643a1 100644 --- a/redisinsight/ui/src/components/hooks/useAzureAuth.ts +++ b/redisinsight/ui/src/components/hooks/useAzureAuth.ts @@ -48,7 +48,10 @@ export const useAzureAuth = () => { }, []) const initiateLogin = useCallback( - (source: AzureLoginSource = AzureLoginSource.Autodiscovery) => { + ( + source: AzureLoginSource = AzureLoginSource.Autodiscovery, + tenantId?: string, + ) => { // In web mode, Azure OAuth only works when accessed via localhost // due to Azure's redirect URI restrictions for public client apps if (!isElectron && window.location.hostname !== 'localhost') { @@ -74,6 +77,7 @@ export const useAzureAuth = () => { onSuccess: openAuthUrl, prompt: AzureOAuthPrompt.SelectAccount, redirectType, + tenantId, }), ) }, diff --git a/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.spec.ts b/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.spec.ts index d3f836b24d..6131a24948 100644 --- a/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.spec.ts +++ b/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.spec.ts @@ -1,5 +1,4 @@ import { renderHook } from 'uiSrc/utils/test-utils' -import { appFeatureFlagProdModeSelector } from 'uiSrc/slices/app/features' import { connectedInstanceDangerousCommandsSelector, connectedInstanceSelector, @@ -8,11 +7,6 @@ import { Environment } from 'apiClient' import { useDatabaseEnvironment } from './useDatabaseEnvironment' -jest.mock('uiSrc/slices/app/features', () => ({ - ...jest.requireActual('uiSrc/slices/app/features'), - appFeatureFlagProdModeSelector: jest.fn().mockReturnValue(false), -})) - jest.mock('uiSrc/slices/instances/instances', () => ({ ...jest.requireActual('uiSrc/slices/instances/instances'), connectedInstanceSelector: jest @@ -21,17 +15,14 @@ jest.mock('uiSrc/slices/instances/instances', () => ({ connectedInstanceDangerousCommandsSelector: jest.fn().mockReturnValue([]), })) -const mockedFlag = appFeatureFlagProdModeSelector as jest.Mock const mockedInstance = connectedInstanceSelector as jest.Mock const mockedDangerousCommands = connectedInstanceDangerousCommandsSelector as jest.Mock const setMocks = (input: { - flag: boolean environment: Environment dangerousCommands?: string[] }) => { - mockedFlag.mockReturnValue(input.flag) mockedDangerousCommands.mockReturnValue(input.dangerousCommands ?? []) mockedInstance.mockReturnValue({ id: 'db-1', @@ -41,26 +32,20 @@ const setMocks = (input: { describe('useDatabaseEnvironment', () => { describe('truth table', () => { - it('falls back to unmarked when flag is off', () => { - setMocks({ flag: false, environment: Environment.Production }) - const { result } = renderHook(useDatabaseEnvironment) - expect(result.current.environment).toBe(Environment.Unspecified) - }) - - it('returns production when flag on and connection is marked production', () => { - setMocks({ flag: true, environment: Environment.Production }) + it('returns production when connection is marked production', () => { + setMocks({ environment: Environment.Production }) const { result } = renderHook(useDatabaseEnvironment) expect(result.current.environment).toBe(Environment.Production) }) - it('returns fast when flag on and connection is marked fast', () => { - setMocks({ flag: true, environment: Environment.Development }) + it('returns fast when connection is marked fast', () => { + setMocks({ environment: Environment.Development }) const { result } = renderHook(useDatabaseEnvironment) expect(result.current.environment).toBe(Environment.Development) }) - it('returns unmarked when flag on and connection is unmarked', () => { - setMocks({ flag: true, environment: Environment.Unspecified }) + it('returns unmarked when connection is unmarked', () => { + setMocks({ environment: Environment.Unspecified }) const { result } = renderHook(useDatabaseEnvironment) expect(result.current.environment).toBe(Environment.Unspecified) }) @@ -69,7 +54,6 @@ describe('useDatabaseEnvironment', () => { describe('isDangerousCommand', () => { it('returns false outside production', () => { setMocks({ - flag: true, environment: Environment.Unspecified, dangerousCommands: ['FLUSHDB', 'KEYS'], }) @@ -79,7 +63,6 @@ describe('useDatabaseEnvironment', () => { it('returns false in fast mode even for known dangerous commands', () => { setMocks({ - flag: true, environment: Environment.Development, dangerousCommands: ['FLUSHDB'], }) @@ -89,7 +72,6 @@ describe('useDatabaseEnvironment', () => { it('matches case-insensitively inside production', () => { setMocks({ - flag: true, environment: Environment.Production, dangerousCommands: ['FLUSHDB', 'KEYS'], }) @@ -101,7 +83,6 @@ describe('useDatabaseEnvironment', () => { it('returns false for unknown commands inside production', () => { setMocks({ - flag: true, environment: Environment.Production, dangerousCommands: ['FLUSHDB'], }) @@ -111,7 +92,6 @@ describe('useDatabaseEnvironment', () => { it('handles empty / falsy command string', () => { setMocks({ - flag: true, environment: Environment.Production, dangerousCommands: ['FLUSHDB'], }) @@ -121,7 +101,6 @@ describe('useDatabaseEnvironment', () => { it('handles a lowercase dangerousCommands list defensively', () => { setMocks({ - flag: true, environment: Environment.Production, dangerousCommands: ['flushdb'], }) diff --git a/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.ts b/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.ts index 38bd822ea8..5ec7ca6948 100644 --- a/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.ts +++ b/redisinsight/ui/src/components/hooks/useDatabaseEnvironment.ts @@ -1,7 +1,6 @@ import { useMemo } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' import { Environment } from 'apiClient' -import { appFeatureFlagProdModeSelector } from 'uiSrc/slices/app/features' import { connectedInstanceDangerousCommandsSelector, connectedInstanceSelector, @@ -13,15 +12,12 @@ export interface UseDatabaseEnvironmentResult { } export const useDatabaseEnvironment = (): UseDatabaseEnvironmentResult => { - const flagEnabled = useAppSelector(appFeatureFlagProdModeSelector) const dangerousCommands = useAppSelector( connectedInstanceDangerousCommandsSelector, ) const connectedInstance = useAppSelector(connectedInstanceSelector) - const environment: Environment = flagEnabled - ? connectedInstance.environment - : Environment.Unspecified + const environment: Environment = connectedInstance.environment const isDangerousCommand = useMemo(() => { const upper = new Set(dangerousCommands.map((c) => c.toUpperCase())) diff --git a/redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx b/redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx index 76e8cbe31a..c9f2e32c8c 100644 --- a/redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx +++ b/redisinsight/ui/src/components/instance-header/InstanceHeader.spec.tsx @@ -271,15 +271,7 @@ describe('InstanceHeader', () => { environment: env, }) - const state = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.prodMode}`, - { flag: true }, - ) - - return render(, { - store: mockStore(state), - }) + return render() } it('renders the PROD badge and marks the header as production', () => { @@ -320,34 +312,6 @@ describe('InstanceHeader', () => { screen.queryByTestId(`environment-badge-${Environment.Development}`), ).not.toBeInTheDocument() }) - - it('does not render the badge when the prodMode flag is off', () => { - mockedConnectedInstanceSelector.mockReturnValue({ - username: 'username', - id: 'instanceId', - loading: false, - environment: Environment.Production, - }) - - const state = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.prodMode}`, - { flag: false }, - ) - - render(, { - store: mockStore(state), - }) - - expect( - screen.queryByTestId(`environment-badge-${Environment.Production}`), - ).not.toBeInTheDocument() - // hook returns Unspecified when the flag is off, even if the stored env is Production - expect(screen.getByTestId('instance-header')).toHaveAttribute( - 'data-environment', - Environment.Unspecified, - ) - }) }) it('should not show sso user profile if cloud ads feature is off', async () => { diff --git a/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/PromoteProductionPrompt.spec.tsx b/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/PromoteProductionPrompt.spec.tsx index bb855c8d30..e9254ea588 100644 --- a/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/PromoteProductionPrompt.spec.tsx +++ b/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/PromoteProductionPrompt.spec.tsx @@ -24,7 +24,6 @@ import { connectedInstanceSelector, instancesSelector, } from 'uiSrc/slices/instances/instances' -import { appFeatureFlagProdModeSelector } from 'uiSrc/slices/app/features' import { PromoteProductionPrompt } from './PromoteProductionPrompt' const mockHistoryPush = jest.fn() @@ -47,11 +46,6 @@ jest.mock('uiSrc/services', () => ({ }, })) -jest.mock('uiSrc/slices/app/features', () => ({ - ...jest.requireActual('uiSrc/slices/app/features'), - appFeatureFlagProdModeSelector: jest.fn(), -})) - jest.mock('uiSrc/slices/instances/instances', () => ({ ...jest.requireActual('uiSrc/slices/instances/instances'), connectedInstanceSelector: jest.fn(), @@ -62,7 +56,6 @@ jest.mock('uiSrc/slices/instances/instances', () => ({ const mockSendEventTelemetry = jest.mocked(sendEventTelemetry) const mockLocalStorageGet = jest.mocked(localStorageService.get) const mockLocalStorageSet = jest.mocked(localStorageService.set) -const mockProdModeSelector = jest.mocked(appFeatureFlagProdModeSelector) const mockConnectedInstanceSelector = jest.mocked(connectedInstanceSelector) const mockOverviewSelector = jest.mocked(connectedInstanceOverviewSelector) const mockInstancesSelector = jest.mocked(instancesSelector) @@ -82,7 +75,6 @@ const buildProductionLikeInstance = () => let store: typeof mockedStore interface MockOptions { - prodMode?: boolean connectedInstance?: Instance instances?: Instance[] totalKeys?: number @@ -90,13 +82,11 @@ interface MockOptions { } const setMocks = ({ - prodMode = true, connectedInstance = buildProductionLikeInstance(), instances, totalKeys = 50_000, actioned = false, }: MockOptions = {}) => { - mockProdModeSelector.mockReturnValue(prodMode) mockConnectedInstanceSelector.mockReturnValue(connectedInstance) mockOverviewSelector.mockReturnValue({ version: '', totalKeys }) mockInstancesSelector.mockReturnValue({ @@ -139,15 +129,6 @@ describe('PromoteProductionPrompt', () => { ) }) - it('does not render when the prodMode flag is disabled', () => { - setMocks({ prodMode: false }) - renderComponent() - - expect( - screen.queryByTestId('promote-production-prompt'), - ).not.toBeInTheDocument() - }) - it('does not render when the prompt was already actioned', () => { setMocks({ actioned: true }) renderComponent() diff --git a/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/hooks/usePromoteProductionPrompt.ts b/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/hooks/usePromoteProductionPrompt.ts index b1b1132551..4ca7a96425 100644 --- a/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/hooks/usePromoteProductionPrompt.ts +++ b/redisinsight/ui/src/components/instance-header/components/promote-production-prompt/hooks/usePromoteProductionPrompt.ts @@ -3,7 +3,6 @@ import { useHistory } from 'react-router-dom' import { Environment } from 'apiClient' import { useAppSelector } from 'uiSrc/slices/hooks' -import { appFeatureFlagProdModeSelector } from 'uiSrc/slices/app/features' import { connectedInstanceOverviewSelector, connectedInstanceSelector, @@ -23,7 +22,6 @@ import { UsePromoteProductionPromptResult } from '../PromoteProductionPrompt.typ */ export const usePromoteProductionPrompt = (): UsePromoteProductionPromptResult => { - const prodModeEnabled = useAppSelector(appFeatureFlagProdModeSelector) const { id, environment, host, tls, connectionType, username, password } = useAppSelector(connectedInstanceSelector) const { totalKeys } = useAppSelector(connectedInstanceOverviewSelector) @@ -54,7 +52,6 @@ export const usePromoteProductionPrompt = }) const shouldPromote = - prodModeEnabled && instancesLoaded && !featureDiscovered && !alreadyActioned && diff --git a/redisinsight/ui/src/components/keys-summary/KeysSummary.tsx b/redisinsight/ui/src/components/keys-summary/KeysSummary.tsx index 0ecb57cf68..36356a7fc0 100644 --- a/redisinsight/ui/src/components/keys-summary/KeysSummary.tsx +++ b/redisinsight/ui/src/components/keys-summary/KeysSummary.tsx @@ -9,6 +9,7 @@ import { numberWithSpaces, nullableNumberWithSpaces } from 'uiSrc/utils/numbers' import { KeyViewType } from 'uiSrc/slices/interfaces/keys' import { keysSelector } from 'uiSrc/slices/browser/keys' import { KeyTreeSettings } from 'uiSrc/pages/browser/components/key-tree' +import { useTranslation } from 'uiSrc/i18n' import ScanMore from '../scan-more' import styles from './styles.module.scss' @@ -38,6 +39,7 @@ const KeysSummary = (props: Props) => { loadMoreItems, nextCursor, } = props + const { t } = useTranslation() const resultsLength = items.length const scannedDisplay = resultsLength > scanned ? resultsLength : scanned @@ -59,14 +61,14 @@ const KeysSummary = (props: Props) => { - {'Results: '} + {t('browser.keysBrowser.results')} {numberWithSpaces(resultsLength)} {'. '} - {'Scanned '} + {t('browser.keysBrowser.scannedPrefix')} {notAccurateScanned} {numberWithSpaces(scannedDisplay)} @@ -88,7 +90,7 @@ const KeysSummary = (props: Props) => { {!scanned && ( - {'Total: '} + {t('browser.keysBrowser.total')} {nullableNumberWithSpaces(totalItemsCount)} @@ -118,7 +120,7 @@ const KeysSummary = (props: Props) => { - Scanning... + {t('browser.keysBrowser.scanning')} diff --git a/redisinsight/ui/src/components/main-router/constants/defaultRoutes.ts b/redisinsight/ui/src/components/main-router/constants/defaultRoutes.ts index 8c1d94884a..eececeafa3 100644 --- a/redisinsight/ui/src/components/main-router/constants/defaultRoutes.ts +++ b/redisinsight/ui/src/components/main-router/constants/defaultRoutes.ts @@ -80,13 +80,11 @@ const INSTANCE_ROUTES: IRoute[] = [ path: Pages.browser(':instanceId'), component: LAZY_LOAD ? LazyBrowserPage : BrowserPage, }, - // Vector search route - behind feature flag { pageName: PageNames.vectorSearch, path: Pages.vectorSearch(':instanceId'), component: LAZY_LOAD ? LazyVectorSearchPageRouter : VectorSearchPageRouter, routes: VECTOR_SEARCH_ROUTES, - featureFlag: FeatureFlags.vectorSearchV2, }, { pageName: PageNames.workbench, diff --git a/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.spec.tsx b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.spec.tsx new file mode 100644 index 0000000000..4cf185b52c --- /dev/null +++ b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.spec.tsx @@ -0,0 +1,227 @@ +import React from 'react' +import { faker } from '@faker-js/faker' + +import { render, screen } from 'uiSrc/utils/test-utils' + +import { MarkdownViewer } from './MarkdownViewer' +import { MarkdownViewerProps } from './MarkdownViewer.types' + +const testWindow = window as unknown as { __pwned?: boolean } + +describe('MarkdownViewer', () => { + const defaultProps: MarkdownViewerProps = { + value: faker.lorem.sentence(), + } + + const renderComponent = (propsOverride?: Partial) => { + const props = { ...defaultProps, ...propsOverride } + + return render() + } + + beforeEach(() => { + delete testWindow.__pwned + }) + + it('should render container with the default data-testid', () => { + renderComponent() + + expect(screen.getByTestId('markdown-viewer')).toBeInTheDocument() + }) + + it('should render container with a custom data-testid', () => { + renderComponent({ 'data-testid': 'custom-markdown' }) + + expect(screen.getByTestId('custom-markdown')).toBeInTheDocument() + }) + + it('should render representative GFM markdown output', () => { + const value = + '# Title\n\n' + + '**bold**\n\n' + + '- first item\n\n' + + '| name |\n| --- |\n| redis |\n\n' + + '```\nconst x = 1\n```\n\n' + + '[Redis](https://redis.io)' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('h1')).toHaveTextContent('Title') + expect(container.querySelector('strong')).toHaveTextContent('bold') + expect(container.querySelector('ul li')).toHaveTextContent('first item') + expect(container.querySelector('table th')).toHaveTextContent('name') + expect(container.querySelector('table td')).toHaveTextContent('redis') + expect(container.querySelector('pre code')).toHaveTextContent('const x = 1') + expect(container.querySelector('a')).toHaveAttribute( + 'href', + 'https://redis.io', + ) + }) + + it('should render plain text as a paragraph, unchanged', () => { + const value = 'just some plain text' + renderComponent({ value }) + + const text = screen.getByText(value) + expect(text.tagName).toBe('P') + }) + + it('should render {, } and > characters literally', () => { + // Rendered as HTML, not parsed as JSX: braces are literal text and a + // mid-line `>` is not treated as a blockquote marker. + renderComponent({ value: 'values {a: 1} > threshold' }) + + expect(screen.getByTestId('markdown-viewer')).toHaveTextContent( + 'values {a: 1} > threshold', + ) + }) + + it('should not evaluate JSX expressions embedded in raw HTML', () => { + // DOMPurify keeps `{...}` as inert text; a JSX parser would execute it. + const value = + '
{"".constructor.constructor("window.__pwned = true")()}
' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container).toHaveTextContent( + '{"".constructor.constructor("window.__pwned = true")()}', + ) + expect(testWindow.__pwned).toBeUndefined() + }) + + it('should preserve target="_blank" on external links and add rel', () => { + const value = 'site' + renderComponent({ value }) + + const link = screen.getByText('site') + expect(link).toHaveAttribute('target', '_blank') + expect(link).toHaveAttribute('rel', 'noopener noreferrer') + }) + + it('should add target="_blank" and rel to absolute links that lack them', () => { + // DOMPurify's afterSanitizeAttributes hook (registered by remarkSanitize) + // marks absolute links to open in a new tab and hardens them against + // reverse tabnabbing. + renderComponent({ value: '[site](https://redis.io)' }) + + const link = screen.getByText('site') + expect(link).toHaveAttribute('href', 'https://redis.io') + expect(link).toHaveAttribute('target', '_blank') + expect(link).toHaveAttribute('rel', 'noopener noreferrer') + }) + + it('should strip javascript: hrefs from links', () => { + renderComponent({ value: '[click](javascript:window.__pwned=true)' }) + + const link = screen.getByText('click') + expect(link.hasAttribute('href')).toBe(false) + expect(testWindow.__pwned).toBeUndefined() + }) + + it('should strip relative hrefs from links', () => { + renderComponent({ value: '[local](/relative/path)' }) + + const link = screen.getByText('local') + expect(link.hasAttribute('href')).toBe(false) + }) + + describe('hardening', () => { + it('should not render script elements or execute them', () => { + const value = 'before\n\n\n\nafter' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('script')).toBeNull() + expect(container.querySelector('p')).toHaveTextContent('before') + expect(testWindow.__pwned).toBeUndefined() + }) + + it('should strip on* attributes', () => { + const value = '

text

' + renderComponent({ value }) + + const paragraph = screen.getByText('text') + expect(paragraph.hasAttribute('onclick')).toBe(false) + expect(testWindow.__pwned).toBeUndefined() + }) + + it('should not render images that could load remote resources', () => { + const value = + 'before\n\ntracker\n\nafter' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('img')).toBeNull() + expect(container).toHaveTextContent('before') + expect(container).toHaveTextContent('after') + }) + + it('should not render media or embedding elements', () => { + const value = + '\n\n' + + '\n\n' + + '\n\n' + + 'safe' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('video')).toBeNull() + expect(container.querySelector('audio')).toBeNull() + expect(container.querySelector('svg')).toBeNull() + expect(container).toHaveTextContent('safe') + }) + + it('should strip style attributes', () => { + const value = + '

styled

' + renderComponent({ value }) + + const paragraph = screen.getByText('styled') + expect(paragraph.hasAttribute('style')).toBe(false) + }) + + it('should not render iframe and link elements', () => { + const value = + '\n\n' + + '\n\n' + + 'safe' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('iframe')).toBeNull() + expect(container.querySelector('link')).toBeNull() + expect(container).toHaveTextContent('safe') + }) + + it('should keep rendering surrounding content when a script is embedded', () => { + // DOMPurify strips the script and keeps the surrounding nodes. + const value = '# Title\n\n\n\nafter' + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container.querySelector('script')).toBeNull() + expect(container.querySelector('h1')).toHaveTextContent('Title') + expect(container).toHaveTextContent('after') + expect(testWindow.__pwned).toBeUndefined() + }) + }) + + it('should render an empty value without crashing', () => { + renderComponent({ value: '' }) + + expect(screen.getByTestId('markdown-viewer')).toBeInTheDocument() + }) + + it('should fall back to the raw value as plain text when the pipeline throws', () => { + // remark-parse throws on a non-string input; the component then renders + // the raw value as text instead of crashing. + const value = { + toString: () => 'raw *value*', + } as unknown as string + renderComponent({ value }) + + const container = screen.getByTestId('markdown-viewer') + expect(container).toHaveTextContent('raw *value*') + expect(container.querySelector('em')).toBeNull() + }) +}) diff --git a/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.styles.ts b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.styles.ts new file mode 100644 index 0000000000..01a134afbb --- /dev/null +++ b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.styles.ts @@ -0,0 +1,133 @@ +import { HTMLAttributes } from 'react' +import styled from 'styled-components' + +import { CommonProps } from 'uiSrc/components/base/theme/types' + +export const Container = styled.div< + CommonProps & HTMLAttributes +>` + font-size: ${({ theme }) => theme.core.font.fontSize.s14}; + color: ${({ theme }) => theme.semantic.color.text.neutral800}; + line-height: 1.5; + overflow-wrap: break-word; + + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: ${({ theme }) => theme.core.space.space200} 0 + ${({ theme }) => theme.core.space.space100}; + font-weight: ${({ theme }) => theme.core.font.fontWeight.semiBold}; + } + + h1 { + font-size: ${({ theme }) => theme.core.font.fontSize.s20}; + } + + h2 { + font-size: ${({ theme }) => theme.core.font.fontSize.s18}; + } + + h3 { + font-size: ${({ theme }) => theme.core.font.fontSize.s16}; + } + + h4, + h5, + h6 { + font-size: ${({ theme }) => theme.core.font.fontSize.s14}; + } + + p { + margin: ${({ theme }) => theme.core.space.space100} 0; + } + + ul, + ol { + margin: ${({ theme }) => theme.core.space.space100} 0; + padding-left: ${({ theme }) => theme.core.space.space300}; + } + + ul { + list-style-type: disc; + } + + ol { + list-style-type: decimal; + } + + code { + padding: 0 ${({ theme }) => theme.core.space.space050}; + font-family: ${({ theme }) => + theme.core.font.fontFamily.sourceCodeProRegular}; + font-size: ${({ theme }) => theme.core.font.fontSize.s13}; + background-color: ${({ theme }) => + theme.semantic.color.background.neutral300}; + border-radius: ${({ theme }) => theme.core.space.space050}; + } + + pre { + margin: ${({ theme }) => theme.core.space.space100} 0; + padding: ${({ theme }) => theme.core.space.space150}; + background-color: ${({ theme }) => + theme.semantic.color.background.neutral300}; + border-radius: ${({ theme }) => theme.core.space.space050}; + overflow-x: auto; + + code { + padding: 0; + background-color: transparent; + } + } + + blockquote { + margin: ${({ theme }) => theme.core.space.space100} 0; + padding-left: ${({ theme }) => theme.core.space.space150}; + border-left: 2px solid + ${({ theme }) => theme.semantic.color.border.neutral500}; + color: ${({ theme }) => theme.semantic.color.text.neutral600}; + } + + table { + margin: ${({ theme }) => theme.core.space.space100} 0; + border-collapse: collapse; + } + + th, + td { + padding: ${({ theme }) => theme.core.space.space050} + ${({ theme }) => theme.core.space.space150}; + border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral500}; + } + + th { + font-weight: ${({ theme }) => theme.core.font.fontWeight.semiBold}; + background-color: ${({ theme }) => + theme.semantic.color.background.neutral300}; + } + + a { + color: ${({ theme }) => theme.semantic.color.text.informative400}; + + &:hover { + text-decoration: underline; + } + } + + hr { + margin: ${({ theme }) => theme.core.space.space150} 0; + border: none; + border-top: 1px solid + ${({ theme }) => theme.semantic.color.border.neutral500}; + } +` diff --git a/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.tsx b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.tsx new file mode 100644 index 0000000000..34a0514de3 --- /dev/null +++ b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.tsx @@ -0,0 +1,84 @@ +import React, { useMemo } from 'react' +import { unified } from 'unified' +import type { Plugin } from 'unified' +import remarkParse from 'remark-parse' +import remarkGfm from 'remark-gfm' +import remarkRehype from 'remark-rehype' +import rehypeStringify from 'rehype-stringify' +import DOMPurify from 'dompurify' + +import { remarkSanitize } from 'uiSrc/utils/formatters/markdown' +import { Nullable } from 'uiSrc/utils' + +import { MarkdownViewerProps } from './MarkdownViewer.types' +import * as S from './MarkdownViewer.styles' + +// Untrusted values get no elements that load remote resources (img/media leak +// the viewer's IP and enable tracking), embed/script content, or take input. +// DOMPurify drops on* handlers by default; style is the attribute it keeps. +const FORBIDDEN_TAGS = [ + 'img', + 'video', + 'audio', + 'source', + 'svg', + 'math', + 'iframe', + 'object', + 'embed', + 'link', + 'style', + 'meta', + 'base', + 'form', + 'input', + 'textarea', + 'select', + 'button', +] +const SANITIZE_CONFIG = { FORBID_TAGS: FORBIDDEN_TAGS, FORBID_ATTR: ['style'] } + +// The custom plugin types its tree as DOM nodes, so it is cast to unist Plugin. +const markdownToSafeHtml = (value: string): string => { + const html = String( + unified() + .use(remarkParse) + .use(remarkSanitize as unknown as Plugin) + .use(remarkGfm) + .use(remarkRehype, { allowDangerousHtml: true }) + .use(rehypeStringify, { allowDangerousHtml: true }) + .processSync(value), + ) + + // Absolute-only links, target=_blank and rel=noopener come from the global + // DOMPurify hooks remarkSanitize registers at import; it must stay imported. + return DOMPurify.sanitize(html, SANITIZE_CONFIG) +} + +export const MarkdownViewer = ({ + value, + 'data-testid': dataTestId = 'markdown-viewer', +}: MarkdownViewerProps) => { + const html: Nullable = useMemo(() => { + try { + return markdownToSafeHtml(value) + } catch { + return null + } + }, [value]) + + if (html === null) { + return {value} + } + + // The value is untrusted, so it is rendered as DOMPurify-sanitized HTML rather + // than parsed as JSX: a JSX parser would evaluate `{...}` expressions embedded + // in raw HTML, which sanitization does not neutralize. + return ( + + ) +} diff --git a/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.types.ts b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.types.ts new file mode 100644 index 0000000000..9d553b1fc3 --- /dev/null +++ b/redisinsight/ui/src/components/markdown-viewer/MarkdownViewer.types.ts @@ -0,0 +1,4 @@ +export interface MarkdownViewerProps { + value: string + 'data-testid'?: string +} diff --git a/redisinsight/ui/src/components/markdown-viewer/index.ts b/redisinsight/ui/src/components/markdown-viewer/index.ts new file mode 100644 index 0000000000..a28f1cfddc --- /dev/null +++ b/redisinsight/ui/src/components/markdown-viewer/index.ts @@ -0,0 +1,2 @@ +export { MarkdownViewer } from './MarkdownViewer' +export type { MarkdownViewerProps } from './MarkdownViewer.types' diff --git a/redisinsight/ui/src/components/markdown/CloudLink/CloudLink.tsx b/redisinsight/ui/src/components/markdown/CloudLink/CloudLink.tsx index b4c9487eef..dcacc447e8 100644 --- a/redisinsight/ui/src/components/markdown/CloudLink/CloudLink.tsx +++ b/redisinsight/ui/src/components/markdown/CloudLink/CloudLink.tsx @@ -6,7 +6,7 @@ import { Link } from 'uiSrc/components/base/link/Link' export interface Props { url: string text: string - source: OAuthSocialSource + source?: OAuthSocialSource } const CloudLink = (props: Props) => { diff --git a/redisinsight/ui/src/components/markdown/CodeButtonBlock/CodeButtonBlock.tsx b/redisinsight/ui/src/components/markdown/CodeButtonBlock/CodeButtonBlock.tsx index f465f5d79e..7bb8317272 100644 --- a/redisinsight/ui/src/components/markdown/CodeButtonBlock/CodeButtonBlock.tsx +++ b/redisinsight/ui/src/components/markdown/CodeButtonBlock/CodeButtonBlock.tsx @@ -25,7 +25,7 @@ import { DatabaseNotOpened, } from 'uiSrc/components/messages' import { OAuthSocialSource } from 'uiSrc/slices/interfaces' -import { ButtonLang } from 'uiSrc/utils/formatters/markdown/remarkCode' +import { ButtonLang } from 'uiSrc/utils/formatters/markdown/buttonLang' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' diff --git a/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.spec.tsx b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.spec.tsx new file mode 100644 index 0000000000..c3860b9dd3 --- /dev/null +++ b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.spec.tsx @@ -0,0 +1,137 @@ +import React from 'react' +import { render, screen } from 'uiSrc/utils/test-utils' +import { MarkdownRenderer } from './MarkdownRenderer' + +const leaves = { + RedisCode: ({ children, label }: any) => ( +
+ {children} +
+ ), + ExternalLink: ({ href, children }: any) => ( + + {children} + + ), + Image: ({ src }: any) => , + RedisInsightLink: ({ url, text }: any) => ( + + {text} + + ), + CloudLink: ({ url, text }: any) => ( + + {text} + + ), +} + +describe('MarkdownRenderer', () => { + it('renders a redis code fence via the RedisCode leaf', () => { + render( + + {'```redis Run me\nGET k\n```'} + , + ) + const el = screen.getByTestId('rediscode') + expect(el).toHaveAttribute('data-label', 'Run me') + expect(el).toHaveTextContent('GET k') + }) + + it('does not execute JSX expressions in raw HTML (renders as text)', () => { + render( + + {'

{alert(1)}

'} +
, + ) + expect( + screen.getByText('

{alert(1)}

', { exact: false }), + ).toBeInTheDocument() + expect(document.querySelector('script')).toBeNull() + }) + + it('drops javascript: links and renders an inert (non-navigable) anchor', () => { + render( + + {'[x](javascript:alert(1))'} + , + ) + // safeUrl neutralizes the dangerous scheme to an empty href; the anchor + // must stay inert rather than falling through to getFileUrlFromMd, which + // would resolve the empty href into a navigable page.md URL. + const link = screen.getByText('x') + expect(link.tagName).toBe('A') + expect(link).not.toHaveAttribute('href') + expect(screen.queryByTestId('ext')).not.toBeInTheDocument() + }) + + it('resolves relative image src against path', () => { + render( + + {'![](img.png)'} + , + ) + expect(screen.getByTestId('img').getAttribute('src')).toContain('img.png') + }) + + it('renders no image for a neutralized (dangerous) src', () => { + render( + + {'![x](javascript:alert(1))'} + , + ) + expect(screen.queryByTestId('img')).not.toBeInTheDocument() + expect(document.querySelector('img')).toBeNull() + }) + + it('routes a plain external link to the ExternalLink leaf', () => { + render( + + {'[Redis](https://redis.io)'} + , + ) + const link = screen.getByTestId('ext') + expect(link).toHaveAttribute('href', 'https://redis.io') + expect(link).toHaveTextContent('Redis') + }) + + it('routes a redisinsight: link to the RedisInsightLink leaf with the scheme stripped', () => { + render( + + {'[Open](redisinsight:/browser)'} + , + ) + const link = screen.getByTestId('ri-link') + expect(link).toHaveAttribute('href', '/browser') + expect(link).toHaveTextContent('Open') + // safeUrl only allowlists http/https/mailto/relative, so a redisinsight: + // href would otherwise be stripped before any component sees it; this + // link must reach the leaf via the structured redisinsightlink node, not + // via the sanitized href. + expect(screen.queryByTestId('ext')).not.toBeInTheDocument() + }) + + it('preserves an in-page #anchor href unchanged', () => { + render( + + {'[x](#section)'} + , + ) + expect(screen.getByRole('link', { name: 'x' })).toHaveAttribute( + 'href', + '#section', + ) + }) + + it('routes a Redis Cloud titled link to the CloudLink leaf', () => { + render( + + {'[Try Cloud](https://redis.io/try-free "Redis Cloud")'} + , + ) + const link = screen.getByTestId('cloud-link') + expect(link).toHaveAttribute('href', 'https://redis.io/try-free') + expect(link).toHaveTextContent('Try Cloud') + expect(screen.queryByTestId('ext')).not.toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.tsx b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.tsx new file mode 100644 index 0000000000..b2a90c8575 --- /dev/null +++ b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.tsx @@ -0,0 +1,221 @@ +import React, { type ComponentPropsWithoutRef, memo, useMemo } from 'react' +import ReactMarkdown, { type Components, type ExtraProps } from 'react-markdown' +import remarkGfm from 'remark-gfm' +import type { PluggableList } from 'unified' +import { remarkRedisCodeBlock } from 'uiSrc/utils/formatters/markdown/remarkRedisCodeBlock' +import { remarkRedisInsightLink } from 'uiSrc/utils/formatters/markdown/remarkRedisInsightLink' +import { safeUrl } from 'uiSrc/utils/formatters/markdown/safeUrl' +import { getFileUrlFromMd } from 'uiSrc/utils/pathUtil' +import { IS_ABSOLUTE_PATH } from 'uiSrc/constants/regex' +import { + MarkdownRendererProps, + MarkdownLeafComponents, +} from './MarkdownRenderer.types' + +// Flattens a react-markdown node's children into a plain string, for leaves +// (RedisCode/CodeBlock) that take string children instead of React nodes. +const nodeText = (children: React.ReactNode): string => + React.Children.toArray(children) + .map((child) => (typeof child === 'string' ? child : '')) + .join('') + +// The rediscode/codeblock/redisupload/redisinsightlink nodes are hast elements +// tagged via remarkRedisCodeBlock/remarkRedisInsightLink's `data.hName`; their +// `properties` shape is guaranteed by those plugins, not by react-markdown's +// generic node type, so the node arg is typed loosely here. +/* eslint-disable @typescript-eslint/no-explicit-any */ + +// Renders a Redis code fence via the caller's RedisCode leaf (with a Run +// button), falling back to plain code when no leaf is supplied. +export const makeRedisCodeElement = ( + RedisCode: MarkdownLeafComponents['RedisCode'] | undefined, + path: string, +) => + function RedisCodeElement({ node }: any) { + const { + label = '', + params = '', + lang = 'redis', + value = '', + } = node?.properties || {} + if (!RedisCode) return {value} + return ( + + {value} + + ) + } + +// Renders a non-Redis code fence via the caller's CodeBlock leaf (Copilot +// only; tutorials leave these as plain code), falling back to plain code. +export const makeCodeBlockElement = ( + CodeBlock: MarkdownLeafComponents['CodeBlock'] | undefined, +) => + function CodeBlockElement({ node }: any) { + const { label = '', lang = '', value = '' } = node?.properties || {} + if (!CodeBlock) return {value} + return ( + + {value} + + ) + } + +// Renders a redis-upload fence via the caller's RedisUpload leaf. +export const makeRedisUploadElement = ( + RedisUpload: MarkdownLeafComponents['RedisUpload'] | undefined, + path: string, +) => + function RedisUploadElement({ node }: any) { + const { file = '', label = '' } = node?.properties || {} + if (!RedisUpload) return null + // RedisUpload resolves its own path (via getPathToResource), so it needs a + // bare, decoded pathname rather than a full absolute URL. A malformed + // `file` can make `new URL`/`decodeURI` throw (URIError); skip the block + // rather than crash the render tree. + let resolved: string + try { + resolved = decodeURI(new URL(getFileUrlFromMd(file, path)).pathname) + } catch { + return null + } + return + } + +// Renders a redisinsight: link (structured by remarkRedisInsightLink) via the +// caller's RedisInsightLink leaf. +export const makeRedisInsightLinkElement = ( + RedisInsightLink: MarkdownLeafComponents['RedisInsightLink'] | undefined, +) => + function RedisInsightLinkElement({ node }: any) { + const { url = '', text = '' } = node?.properties || {} + if (!RedisInsightLink) return <>{text} + return + } + +/* eslint-enable @typescript-eslint/no-explicit-any */ + +// Routes a markdown link: inert when neutralized, CloudLink for Redis Cloud +// links, the caller's ExternalLink for absolute URLs, and a plain anchor for +// in-page hashes and relative paths (resolved against `path`). +export const makeLinkElement = ( + ExternalLink: MarkdownLeafComponents['ExternalLink'] | undefined, + CloudLink: MarkdownLeafComponents['CloudLink'] | undefined, + path: string, +) => + function LinkElement({ + href = '', + title, + children: linkChildren, + }: ComponentPropsWithoutRef<'a'> & ExtraProps) { + // safeUrl (urlTransform) neutralizes dangerous schemes (e.g. javascript:) + // to an empty href before this handler runs. Render an inert anchor with + // no href instead of falling through to getFileUrlFromMd, which would + // resolve '' into a navigable page URL. + if (!href) return {linkChildren} + + const text = nodeText(linkChildren) + + // redisinsight: links never reach this handler with their scheme intact: + // safeUrl's allowlist strips unknown schemes, so remarkRedisInsightLink + // rewrites them to structured redisinsightlink nodes in the remark phase, + // before sanitization runs. + if (title === 'Redis Cloud') { + if (!CloudLink) return <>{linkChildren} + return + } + + if (IS_ABSOLUTE_PATH.test(href)) { + if (!ExternalLink) + return ( + + {linkChildren} + + ) + return {linkChildren} + } + + // In-page anchors must keep their href unchanged: resolving them against + // `path` via getFileUrlFromMd would rewrite `#section` into an absolute + // file URL and lose the hash. + if (href.startsWith('#')) return {linkChildren} + + return {linkChildren} + } + +// Renders an image via the caller's Image leaf, resolving relative sources +// against `path`. +export const makeImageElement = ( + Image: MarkdownLeafComponents['Image'] | undefined, + path: string, +) => + function ImageElement({ + src = '', + alt, + }: ComponentPropsWithoutRef<'img'> & ExtraProps) { + // An empty src means safeUrl neutralized a disallowed URL; render nothing + // rather than resolving '' into a valid page URL. + if (!src) return null + const resolved = getFileUrlFromMd(src, path) + if (!Image) return {alt + return + } + +/** + * Shared markdown renderer for the tutorial pane and Copilot chat. Wraps + * react-markdown with remark-gfm, remarkRedisCodeBlock (structured Redis code + * fences), and remarkRedisInsightLink (structured redisinsight: links), plus + * safeUrl (drops unsafe link/image schemes) and element overrides that + * delegate to the caller-supplied leaf components. Renders without rehype-raw, + * so raw HTML in the source is shown as escaped text rather than parsed into + * elements. + * + * react-markdown's `components` map is typed to intrinsic HTML tag names, but + * remarkRedisCodeBlock/remarkRedisInsightLink emit hast elements with custom + * tag names (rediscode/codeblock/redisupload/redisinsightlink) via + * `data.hName`. Cast through `unknown` to add those handlers alongside the + * built-in `a`/`img` overrides. + */ +export const MarkdownRenderer = memo(function MarkdownRenderer({ + children, + path = '', + components, + allLangs = false, +}: MarkdownRendererProps) { + const remarkPlugins: PluggableList = useMemo( + () => [ + remarkGfm, + [remarkRedisCodeBlock, { allLangs }], + remarkRedisInsightLink, + ], + [allLangs], + ) + + // Memoized on [components, path] (the only things the element components + // close over) so a caller passing a stable `components` prop and `path` + // gets a stable map, and ReactMarkdown doesn't re-render its whole tree on + // unrelated parent re-renders. + const mapped = useMemo( + () => ({ + rediscode: makeRedisCodeElement(components.RedisCode, path), + codeblock: makeCodeBlockElement(components.CodeBlock), + redisupload: makeRedisUploadElement(components.RedisUpload, path), + redisinsightlink: makeRedisInsightLinkElement( + components.RedisInsightLink, + ), + a: makeLinkElement(components.ExternalLink, components.CloudLink, path), + img: makeImageElement(components.Image, path), + }), + [components, path], + ) + + return ( + + {children} + + ) +}) diff --git a/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.types.ts b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.types.ts new file mode 100644 index 0000000000..d71dd7e5c3 --- /dev/null +++ b/redisinsight/ui/src/components/markdown/MarkdownRenderer/MarkdownRenderer.types.ts @@ -0,0 +1,31 @@ +import type { ComponentType, ReactNode } from 'react' + +// Leaf components a consumer (tutorials, Copilot chat) supplies to render the +// structured nodes produced by remarkRedisCodeBlock plus links/images. Every +// leaf is optional; omitted leaves fall back to plain markdown rendering. +export interface MarkdownLeafComponents { + RedisCode: ComponentType<{ + label: string + params?: string + lang: string + path?: string + children: string + }> + CodeBlock: ComponentType<{ label?: string; lang?: string; children: string }> + RedisUpload: ComponentType<{ label: string; path: string }> + ExternalLink: ComponentType<{ href: string; children?: ReactNode }> + CloudLink: ComponentType<{ url: string; text: string }> + RedisInsightLink: ComponentType<{ url: string; text: string }> + Image: ComponentType<{ src: string }> +} + +export interface MarkdownRendererProps { + children: string + path?: string + components: Partial + // When true, every non-Redis fence (languaged or not) is rendered via the + // `CodeBlock` leaf instead of a plain `
`. Copilot chat sets this so
+  // all fences keep copy/run; tutorials leave it off so non-Redis fences
+  // render as plain code with no Run button.
+  allLangs?: boolean
+}
diff --git a/redisinsight/ui/src/components/markdown/MarkdownRenderer/index.ts b/redisinsight/ui/src/components/markdown/MarkdownRenderer/index.ts
new file mode 100644
index 0000000000..efe245bc13
--- /dev/null
+++ b/redisinsight/ui/src/components/markdown/MarkdownRenderer/index.ts
@@ -0,0 +1,5 @@
+export { MarkdownRenderer } from './MarkdownRenderer'
+export type {
+  MarkdownRendererProps,
+  MarkdownLeafComponents,
+} from './MarkdownRenderer.types'
diff --git a/redisinsight/ui/src/components/messages/feature-not-available/constants.ts b/redisinsight/ui/src/components/messages/feature-not-available/constants.ts
index aa95b23449..0918b00002 100644
--- a/redisinsight/ui/src/components/messages/feature-not-available/constants.ts
+++ b/redisinsight/ui/src/components/messages/feature-not-available/constants.ts
@@ -14,10 +14,10 @@ export const FILTER_NOT_AVAILABLE_CONTENT: FeatureNotAvailableContent = {
 
 export const REDISEARCH_VERSION_REQUIRED_CONTENT: FeatureNotAvailableContent = {
   testId: 'redisearch-version-required',
-  title: 'Redis Query Engine 2.0+ required',
+  title: 'Redis Search 2.0+ required',
   description:
-    'This feature requires Redis Query Engine 2.0 or later (included with Redis 6+). ' +
-    'Older versions of the query engine are not compatible with the commands used here.',
+    'This feature requires Redis Search 2.0 or later (included with Redis 6+). ' +
+    'Older versions of Redis Search are not compatible with the commands used here.',
   freeInstanceText:
     'Use your free all-in-one Redis Cloud database to start exploring these capabilities.',
   noInstanceText:
diff --git a/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/ModuleNotLoadedMinimalized.spec.tsx b/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/ModuleNotLoadedMinimalized.spec.tsx
index 8ba0a2c525..e567e7476b 100644
--- a/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/ModuleNotLoadedMinimalized.spec.tsx
+++ b/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/ModuleNotLoadedMinimalized.spec.tsx
@@ -70,7 +70,7 @@ describe('ModuleNotLoadedMinimalized', () => {
     expect(screen.queryByTestId('connect-free-db-btn')).not.toBeInTheDocument()
     expect(screen.getByText(/Redis Databases page/)).toBeInTheDocument()
     expect(
-      screen.getByText(/Open a database with Redis Query Engine/),
+      screen.getByText(/Open a database with Redis Search/),
     ).toBeInTheDocument()
   })
 
diff --git a/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/constants.ts b/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/constants.ts
index 3ae94d92b2..e595894abb 100644
--- a/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/constants.ts
+++ b/redisinsight/ui/src/components/messages/module-not-loaded-minimalized/constants.ts
@@ -15,7 +15,7 @@ export const MODULE_CAPABILITY_TEXT_NOT_AVAILABLE: {
     text: 'Create a free Redis Cloud database with JSON capability that extends the core capabilities of your Redis.',
   },
   [RedisDefaultModules.Search]: {
-    title: 'Redis Query Engine capability is not available',
+    title: 'Redis Search capability is not available',
     text: 'Create a free Redis Cloud database with search and query features that extend the core capabilities of your Redis.',
   },
   [RedisDefaultModules.TimeSeries]: {
@@ -39,8 +39,8 @@ export const MODULE_CAPABILITY_TEXT_NOT_AVAILABLE_ENTERPRISE: {
     text: 'Open a database with JSON.',
   },
   [RedisDefaultModules.Search]: {
-    title: 'Redis Query Engine capability is not available',
-    text: 'Open a database with Redis Query Engine.',
+    title: 'Redis Search capability is not available',
+    text: 'Open a database with Redis Search.',
   },
   [RedisDefaultModules.TimeSeries]: {
     title: 'Time series data structure is not available',
diff --git a/redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoaded.spec.tsx b/redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoaded.spec.tsx
index ae9610df2e..aaf85424a2 100644
--- a/redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoaded.spec.tsx
+++ b/redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoaded.spec.tsx
@@ -80,9 +80,7 @@ describe('ModuleNotLoaded', () => {
     })
     mockGetDbWithModuleLoaded(true) // should not affect output
     const { queryByText } = render()
-    expect(
-      queryByText(/Open a database with Redis Query Engine/),
-    ).toBeInTheDocument()
+    expect(queryByText(/Open a database with Redis Search/)).toBeInTheDocument()
   })
 
   it('should not show CTA button when envDependant feature is disabled', () => {
@@ -133,9 +131,7 @@ describe('ModuleNotLoaded', () => {
       },
     })
     const { getByText } = render()
-    expect(
-      getByText(/Open a database with Redis Query Engine/),
-    ).toBeInTheDocument()
+    expect(getByText(/Open a database with Redis Search/)).toBeInTheDocument()
   })
 
   it('should show expected text when free db exists', () => {
diff --git a/redisinsight/ui/src/components/monitor/Monitor/Monitor.tsx b/redisinsight/ui/src/components/monitor/Monitor/Monitor.tsx
index 2eca6183a9..6ee05cee18 100644
--- a/redisinsight/ui/src/components/monitor/Monitor/Monitor.tsx
+++ b/redisinsight/ui/src/components/monitor/Monitor/Monitor.tsx
@@ -98,7 +98,7 @@ const Monitor = (props: Props) => {
           
{!!items?.length && ( - {({ width, height }) => ( + {({ width, height }: { width: number; height: number }) => ( { const { compressed, items = [], width = 0, height = 0 } = props @@ -75,8 +80,9 @@ const MonitorOutputList = (props: Props) => { } if ( - e.scrollOffset + outerRef.current.offsetHeight === - outerRef.current.scrollHeight + outerRef.current.scrollHeight - + (e.scrollOffset + outerRef.current.offsetHeight) <= + SCROLL_BOTTOM_THRESHOLD ) { autoScrollRef.current = true return diff --git a/redisinsight/ui/src/components/multi-search/MultiSearch.tsx b/redisinsight/ui/src/components/multi-search/MultiSearch.tsx index 6ca106b142..30d543e859 100644 --- a/redisinsight/ui/src/components/multi-search/MultiSearch.tsx +++ b/redisinsight/ui/src/components/multi-search/MultiSearch.tsx @@ -27,6 +27,7 @@ import { } from './MultiSearch.styles' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' interface MultiSearchSuggestion { options: null | Array<{ @@ -58,6 +59,7 @@ export interface Props { } const MultiSearch = (props: Props) => { + const { t } = useTranslation() const { value, options = [], @@ -163,7 +165,7 @@ const MultiSearch = (props: Props) => { const SubmitBtn = () => ( { { e.stopPropagation() handleDeleteSuggestion([id]) @@ -257,17 +259,20 @@ const MultiSearch = (props: Props) => { > - Clear history + {t('browser.search.clearHistory')} )} {(value || !!options.length) && ( - + { }) it("should open What's new and send telemetry on click", () => { - const initialStoreState = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.whatsNew}`, - { flag: true }, - ) - const localStore = mockStore(initialStoreState) - - render(sideBarWithHelpMenu, { store: localStore }) + render(sideBarWithHelpMenu) fireEvent.click(screen.getByTestId('help-menu-button')) fireEvent.click(screen.getByTestId('whats-new-btn')) - expect(localStore.getActions()).toEqual([openWhatsNew()]) + expect(store.getActions()).toEqual([openWhatsNew()]) expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.WHATS_NEW_OPENED, eventData: { @@ -132,21 +125,6 @@ describe('HelpMenu', () => { }) }) - it("should hide What's new item when its feature flag is off", () => { - const initialStoreState = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.whatsNew}`, - { flag: false }, - ) - - render(sideBarWithHelpMenu, { - store: mockStore(initialStoreState), - }) - fireEvent.click(screen.getByTestId('help-menu-button')) - - expect(screen.queryByTestId('whats-new-btn')).not.toBeInTheDocument() - }) - it('should show feature dependent items when feature flag is on', async () => { const initialStoreState = set( cloneDeep(initialStateDefault), diff --git a/redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.tsx b/redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.tsx index e14a12700f..a5d7fc5347 100644 --- a/redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.tsx +++ b/redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.tsx @@ -178,19 +178,17 @@ const HelpMenu = () => { - - - - - {t('whatsNew.menuItem')} - - - + + + + {t('whatsNew.menuItem')} + + diff --git a/redisinsight/ui/src/components/navigation-menu/hooks/useNavigation.ts b/redisinsight/ui/src/components/navigation-menu/hooks/useNavigation.ts index 1e46c78ef7..98d8cf6430 100644 --- a/redisinsight/ui/src/components/navigation-menu/hooks/useNavigation.ts +++ b/redisinsight/ui/src/components/navigation-menu/hooks/useNavigation.ts @@ -6,7 +6,6 @@ import { useEffect, useState } from 'react' import { Props as HighlightedFeatureProps } from 'uiSrc/components/hightlighted-feature/HighlightedFeature' import { ANALYTICS_ROUTES } from 'uiSrc/components/main-router/constants/sub-routes' import { - appFeatureFlagsFeaturesSelector, appFeaturePagesHighlightingSelector, removeFeatureFromHighlighting, } from 'uiSrc/slices/app/features' @@ -48,9 +47,6 @@ export function useNavigation() { connectedRdiInstanceSelector, ) const highlightedPages = useAppSelector(appFeaturePagesHighlightingSelector) - const { [FeatureFlags.vectorSearchV2]: vectorSearchFeature } = useAppSelector( - appFeatureFlagsFeaturesSelector, - ) const isRdiWorkspace = workspace === AppWorkspace.RDI @@ -99,7 +95,7 @@ export function useNavigation() { iconType: BrowserIcon, onboard: ONBOARDING_FEATURES.BROWSER_PAGE, }, - vectorSearchFeature?.flag && { + { tooltipText: 'Search', pageName: PageNames.vectorSearch, ariaLabel: 'Search', diff --git a/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.spec.tsx b/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.spec.tsx index 4263e22d60..96c78722d0 100644 --- a/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.spec.tsx +++ b/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.spec.tsx @@ -1,5 +1,6 @@ import React from 'react' import { render, screen, fireEvent, cleanup } from 'uiSrc/utils/test-utils' +import { AzureLoginSource } from 'uiSrc/slices/interfaces' import AzureTokenExpiredErrorContent from './AzureTokenExpiredErrorContent' @@ -27,18 +28,22 @@ describe('AzureTokenExpiredErrorContent', () => { ) }) - it('should call initiateLogin and onClose when sign in button is clicked', () => { + it('should re-authenticate against the connection tenant and close on click', () => { const onClose = jest.fn() render( , ) fireEvent.click(screen.getByTestId('azure-sign-in-btn')) - expect(mockInitiateLogin).toHaveBeenCalled() + expect(mockInitiateLogin).toHaveBeenCalledWith( + AzureLoginSource.TokenRefresh, + 'realm-guid', + ) expect(onClose).toHaveBeenCalled() }) diff --git a/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.tsx b/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.tsx index e42613742c..f5a292f1c8 100644 --- a/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.tsx +++ b/redisinsight/ui/src/components/notifications/components/azure-token-expired/AzureTokenExpiredErrorContent.tsx @@ -9,15 +9,21 @@ import { AzureLoginSource } from 'uiSrc/slices/interfaces' export interface Props { text: string | JSX.Element | JSX.Element[] + tenantId?: string onClose?: () => void } -const AzureTokenExpiredErrorContent = ({ text, onClose = () => {} }: Props) => { +const AzureTokenExpiredErrorContent = ({ + text, + tenantId, + onClose = () => {}, +}: Props) => { const { initiateLogin, loading } = useAzureAuth() const { t } = useTranslation() const handleSignIn = () => { - initiateLogin(AzureLoginSource.TokenRefresh) + // Recover against the connection's own realm, not the home tenant. + initiateLogin(AzureLoginSource.TokenRefresh, tenantId) onClose?.() } diff --git a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx index a00c543bf9..24b9fe95c4 100644 --- a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx +++ b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx @@ -2,6 +2,7 @@ import React from 'react' import { fireEvent, render, screen, act } from 'uiSrc/utils/test-utils' import { OAuthProvider } from 'uiSrc/components/oauth/oauth-select-plan/constants' +import { EXTERNAL_LINKS } from 'uiSrc/constants/links' import notificationsReducer, { addInfiniteNotification, } from 'uiSrc/slices/app/notifications' @@ -312,16 +313,19 @@ describe('INFINITE_MESSAGES', () => { describe('APP_UPDATE_AVAILABLE', () => { it('should render message', async () => { - const version = '' + const version = '99.9.9' const onSuccess = jest.fn() renderToast(INFINITE_MESSAGES.APP_UPDATE_AVAILABLE(version, onSuccess)) // Wait for the notification to appear - const title = await screen.findByText('New version is now available') + const title = await screen.findByText('Update ready to install') const description = await screen.findByText( - /With Redis Insight you have access to new useful features and optimizations\.\s*Restart Redis Insight to install updates\./, + /Redis Insight 99.9.9 is ready/, ) + const releaseNotesLink = await screen.findByRole('link', { + name: /see what's new/, + }) const restartButton = await screen.findByRole('button', { name: /Restart/, }) @@ -329,12 +333,16 @@ describe('INFINITE_MESSAGES', () => { expect(title).toBeInTheDocument() expect(description).toBeInTheDocument() + expect(releaseNotesLink).toHaveAttribute( + 'href', + EXTERNAL_LINKS.releaseNotes, + ) expect(restartButton).toBeInTheDocument() expect(closeButton).toBeInTheDocument() }) it('should call onSuccess when clicking restart button', async () => { - const version = '' + const version = '99.9.9' const onSuccess = jest.fn() renderToast(INFINITE_MESSAGES.APP_UPDATE_AVAILABLE(version, onSuccess)) @@ -350,6 +358,111 @@ describe('INFINITE_MESSAGES', () => { }) }) + describe('APP_UPDATE_FOUND', () => { + it('should render message', async () => { + const version = '99.9.9' + const onDownload = jest.fn() + const onSkip = jest.fn() + const onClose = jest.fn() + + renderToast( + INFINITE_MESSAGES.APP_UPDATE_FOUND( + version, + onDownload, + onSkip, + onClose, + ), + ) + + // Wait for the notification to appear + const title = await screen.findByText('A new version is available') + const description = await screen.findByText( + /Redis Insight 99.9.9 is here\./, + ) + const releaseNotesLink = await screen.findByRole('link', { + name: /See what's new/, + }) + const updateButton = await screen.findByRole('button', { + name: /Update/, + }) + const skipButton = await screen.findByRole('button', { + name: /Skip this version/, + }) + const closeButton = await screen.findByRole('button', { name: /close/i }) + + expect(title).toBeInTheDocument() + expect(description).toBeInTheDocument() + expect(releaseNotesLink).toHaveAttribute( + 'href', + EXTERNAL_LINKS.releaseNotes, + ) + expect(updateButton).toBeInTheDocument() + expect(skipButton).toBeInTheDocument() + expect(closeButton).toBeInTheDocument() + }) + + it('should call onDownload when clicking the "Update" button', async () => { + const onDownload = jest.fn() + const onSkip = jest.fn() + const onClose = jest.fn() + + renderToast( + INFINITE_MESSAGES.APP_UPDATE_FOUND( + '99.9.9', + onDownload, + onSkip, + onClose, + ), + ) + + const updateButton = await screen.findByRole('button', { + name: /Update/, + }) + + fireEvent.click(updateButton) + + expect(onDownload).toHaveBeenCalled() + expect(onSkip).not.toHaveBeenCalled() + }) + + it('should call onSkip when clicking the "Skip this version" button', async () => { + const onDownload = jest.fn() + const onSkip = jest.fn() + const onClose = jest.fn() + + renderToast( + INFINITE_MESSAGES.APP_UPDATE_FOUND( + '99.9.9', + onDownload, + onSkip, + onClose, + ), + ) + + const skipButton = await screen.findByRole('button', { + name: /Skip this version/, + }) + + fireEvent.click(skipButton) + + expect(onSkip).toHaveBeenCalled() + expect(onDownload).not.toHaveBeenCalled() + }) + }) + + describe('APP_UPDATE_DOWNLOADING', () => { + it('should render message without a close button', async () => { + renderToast(INFINITE_MESSAGES.APP_UPDATE_DOWNLOADING()) + + const title = await screen.findByText('Downloading update…') + + expect(title).toBeInTheDocument() + expect( + screen.queryByRole('button', { name: /close/i }), + ).not.toBeInTheDocument() + }) + }) + describe('SUCCESS_DEPLOY_PIPELINE', () => { it('should render message', async () => { renderToast(INFINITE_MESSAGES.SUCCESS_DEPLOY_PIPELINE()) diff --git a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.tsx b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.tsx index 70508039dc..d95af62c5d 100644 --- a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.tsx +++ b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.tsx @@ -4,7 +4,7 @@ import i18n, { Trans } from 'uiSrc/i18n' import { CloudJobName, CloudJobStep } from 'uiSrc/electron/constants' import Divider from 'uiSrc/components/divider/Divider' import { OAuthProviders } from 'uiSrc/components/oauth/oauth-select-plan/constants' -import { LoaderLargeIcon } from 'uiSrc/components/base/icons' +import { LoaderLargeIcon, RiStarsIcon } from 'uiSrc/components/base/icons' import { CloudSuccessResult, InfiniteMessage } from 'uiSrc/slices/interfaces' @@ -18,7 +18,10 @@ import { } from 'uiSrc/constants/links' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout/spacer' -import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' +import { + PrimaryButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { Link } from 'uiSrc/components/base/link/Link' @@ -39,6 +42,7 @@ export enum InfiniteMessagesIds { databaseImportForbidden = 'databaseImportForbidden', subscriptionExists = 'subscriptionExists', appUpdateAvailable = 'appUpdateAvailable', + appUpdateFound = 'appUpdateFound', pipelineDeploySuccess = 'pipelineDeploySuccess', } @@ -68,7 +72,15 @@ interface InfiniteMessagesType { APP_UPDATE_AVAILABLE: ( version: string, onSuccess?: () => void, + onClose?: () => void, + ) => InfiniteMessage + APP_UPDATE_FOUND: ( + version: string, + onDownload: () => void, + onSkip: () => void, + onClose: () => void, ) => InfiniteMessage + APP_UPDATE_DOWNLOADING: () => InfiniteMessage SUCCESS_DEPLOY_PIPELINE: () => InfiniteMessage } @@ -278,26 +290,93 @@ export const INFINITE_MESSAGES: InfiniteMessagesType = { ), customIcon: LoaderLargeIcon, }), - APP_UPDATE_AVAILABLE: (version: string, onSuccess?: () => void) => ({ + APP_UPDATE_AVAILABLE: ( + version: string, + onSuccess?: () => void, + onClose?: () => void, + ) => ({ id: InfiniteMessagesIds.appUpdateAvailable, + variation: version, + customIcon: RiStarsIcon, + onClose, message: i18n.t('notification.infinite.appUpdateAvailable.message'), description: ( <> - {i18n.t('notification.infinite.appUpdateAvailable.description', { - version, - })} + + ), + }} + /> - {i18n.t('notification.infinite.appUpdateAvailable.descriptionRestart')} + + + onSuccess?.()}> + {i18n.t( + 'notification.infinite.appUpdateAvailable.button.restart', + )} + + + ), - actions: { - primary: { - label: i18n.t( - 'notification.infinite.appUpdateAvailable.button.restart', - ), - onClick: () => onSuccess?.(), - }, - }, + }), + APP_UPDATE_FOUND: ( + version: string, + onDownload: () => void, + onSkip: () => void, + onClose: () => void, + ) => ({ + id: InfiniteMessagesIds.appUpdateFound, + variation: version, + customIcon: RiStarsIcon, + onClose, + message: i18n.t('notification.infinite.appUpdateFound.message'), + description: ( + <> + + ), + }} + /> + + + + onDownload()}> + {i18n.t('notification.infinite.appUpdateFound.button.update')} + + + + onSkip()}> + {i18n.t('notification.infinite.appUpdateFound.button.skip')} + + + + + ), + }), + APP_UPDATE_DOWNLOADING: () => ({ + id: InfiniteMessagesIds.appUpdateFound, + customIcon: LoaderLargeIcon, + message: i18n.t('notification.infinite.appUpdateDownloading.message'), + showCloseButton: false, }), SUCCESS_DEPLOY_PIPELINE: () => ({ id: InfiniteMessagesIds.pipelineDeploySuccess, diff --git a/redisinsight/ui/src/components/notifications/error-messages.tsx b/redisinsight/ui/src/components/notifications/error-messages.tsx index fb3924e70f..3aa54c491a 100644 --- a/redisinsight/ui/src/components/notifications/error-messages.tsx +++ b/redisinsight/ui/src/components/notifications/error-messages.tsx @@ -82,7 +82,7 @@ export default { description: , }), AZURE_TOKEN_EXPIRED: ( - { message }: { message: string | JSX.Element }, + { message, tenantId }: { message: string | JSX.Element; tenantId?: string }, onClose: () => void, ) => ({ 'data-testid': 'toast-info-azure-token-expired', @@ -90,7 +90,11 @@ export default { showCloseButton: true, onClose, description: ( - + ), }), PERSISTENT: ( diff --git a/redisinsight/ui/src/components/notifications/hooks/useErrorNotifications.ts b/redisinsight/ui/src/components/notifications/hooks/useErrorNotifications.ts index 257388fdaa..807c6d84b2 100644 --- a/redisinsight/ui/src/components/notifications/hooks/useErrorNotifications.ts +++ b/redisinsight/ui/src/components/notifications/hooks/useErrorNotifications.ts @@ -88,7 +88,7 @@ export const useErrorNotifications = () => { // Only show toast if not already visible if (!riToast.isActive(AZURE_TOKEN_EXPIRED_TOAST_ID)) { errorMessage = errorMessages.AZURE_TOKEN_EXPIRED( - { message }, + { message, tenantId: additionalInfo?.tenantId }, removeAzureToast, ) riToast(errorMessage, { diff --git a/redisinsight/ui/src/components/notifications/hooks/useInfiniteNotifications.ts b/redisinsight/ui/src/components/notifications/hooks/useInfiniteNotifications.ts index 2bb26f4710..13a64f4fcd 100644 --- a/redisinsight/ui/src/components/notifications/hooks/useInfiniteNotifications.ts +++ b/redisinsight/ui/src/components/notifications/hooks/useInfiniteNotifications.ts @@ -10,17 +10,25 @@ import { InfiniteMessagesIds } from '../components' import { defaultContainerId, ONE_HOUR } from '../constants' const DISPLAY_THROTTLE = 3_000 // 3 seconds - minimum time between displaying notifications -const AUTO_DISMISS_DELAY = 5_000 // 5 seconds - wait before auto-dismissing when no notifications remain +const AUTO_DISMISS_DELAY = 300 + +const PERSISTENT_NOTIFICATION_IDS: string[] = [ + InfiniteMessagesIds.appUpdateFound, + InfiniteMessagesIds.appUpdateAvailable, +] const showNotification = (notification: InfiniteMessage) => { if (!notification) { return } - // Show latest notification + const autoClose = PERSISTENT_NOTIFICATION_IDS.includes(notification.id) + ? false + : ONE_HOUR + return riToast(notification, { containerId: defaultContainerId, - autoClose: ONE_HOUR, + autoClose, }) } diff --git a/redisinsight/ui/src/components/oauth/index.ts b/redisinsight/ui/src/components/oauth/index.ts index cfae4b9b14..14aea3bb0d 100644 --- a/redisinsight/ui/src/components/oauth/index.ts +++ b/redisinsight/ui/src/components/oauth/index.ts @@ -1,6 +1,7 @@ import OAuthSsoDialog from './oauth-sso-dialog' import OAuthSsoHandlerDialog from './oauth-sso-handler-dialog' import OAuthSelectAccountDialog from './oauth-select-account-dialog/OAuthSelectAccountDialog' +import OAuthMfaDialog from './oauth-mfa-dialog/OAuthMfaDialog' import OAuthConnectFreeDb from './oauth-connect-free-db' import OAuthJobs from './oauth-jobs' import OAuthSelectPlan from './oauth-select-plan' @@ -10,6 +11,7 @@ export { OAuthSsoDialog, OAuthSsoHandlerDialog, OAuthSelectAccountDialog, + OAuthMfaDialog, OAuthConnectFreeDb, OAuthJobs, OAuthSelectPlan, diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.constants.ts b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.constants.ts new file mode 100644 index 0000000000..cfbcbd42f8 --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.constants.ts @@ -0,0 +1 @@ +export const MFA_CODE_LENGTH = 6 diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.spec.tsx b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.spec.tsx new file mode 100644 index 0000000000..3134d149eb --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.spec.tsx @@ -0,0 +1,184 @@ +import React from 'react' +import { + act, + cleanup, + createMockedStore, + fireEvent, + mockedStore, + render, + screen, +} from 'uiSrc/utils/test-utils' +import { + logoutUser, + oauthCloudMfaSelector, + resetMfaError, + setMfaDialogState, + setOAuthCloudSource, + submitMfaCode, + submitMfaCodeSuccess, +} from 'uiSrc/slices/oauth/cloud' +import { setSSOFlow } from 'uiSrc/slices/instances/cloud' +import { apiService } from 'uiSrc/services' +import { ApiEndpoints } from 'uiSrc/constants' +import OAuthMfaDialog from './OAuthMfaDialog' +import { OAuthMfaDialogProps } from './OAuthMfaDialog.types' + +const mockMfaOpenState = { + isOpenDialog: true, + loading: false, + error: '', + isProfileRestore: false, +} + +jest.mock('uiSrc/slices/oauth/cloud', () => ({ + ...jest.requireActual('uiSrc/slices/oauth/cloud'), + oauthCloudMfaSelector: jest.fn().mockReturnValue({ + isOpenDialog: true, + loading: false, + error: '', + }), +})) + +let store: typeof mockedStore +beforeEach(() => { + cleanup() + jest.clearAllMocks() + store = createMockedStore() + store.clearActions() +}) + +const renderComponent = (propsOverride?: Partial) => + render(, { store }) + +describe('OAuthMfaDialog', () => { + it('should render when the dialog is open', () => { + renderComponent() + expect(screen.getByTestId('oauth-mfa-dialog')).toBeInTheDocument() + }) + + it('should not render when the dialog is closed', () => { + jest.mocked(oauthCloudMfaSelector).mockReturnValueOnce({ + ...mockMfaOpenState, + isOpenDialog: false, + }) + renderComponent() + expect(screen.queryByTestId('oauth-mfa-dialog')).not.toBeInTheDocument() + }) + + it('should keep verify disabled until the code is complete', () => { + renderComponent() + const submitEl = screen.getByTestId('oauth-mfa-dialog-submit-btn') + + expect(submitEl).toBeDisabled() + + fireEvent.paste(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + clipboardData: { getData: () => '123' }, + }) + expect(submitEl).toBeDisabled() + }) + + it('should auto-submit and call onVerified when the last digit is entered', async () => { + apiService.post = jest.fn().mockResolvedValue({ status: 200 }) + const onVerified = jest.fn() + + renderComponent({ onVerified }) + + // five digits in, then the sixth completes the code and triggers auth + fireEvent.paste(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + clipboardData: { getData: () => '12345' }, + }) + expect(apiService.post).not.toBeCalled() + + await act(() => { + fireEvent.change(screen.getByTestId('oauth-mfa-dialog-code-input-5'), { + target: { value: '6' }, + }) + }) + + expect(apiService.post).toBeCalledWith( + expect.stringContaining('login/mfa'), + { code: '123456' }, + ) + const expectedActions = [submitMfaCode(), submitMfaCodeSuccess()] + expect(store.getActions()).toEqual(expectedActions) + expect(onVerified).toBeCalled() + }) + + it('should auto-submit when a full code is pasted', async () => { + apiService.post = jest.fn().mockResolvedValue({ status: 200 }) + const onVerified = jest.fn() + + renderComponent({ onVerified }) + + await act(() => { + fireEvent.paste(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + clipboardData: { getData: () => '123456' }, + }) + }) + + expect(apiService.post).toBeCalledWith( + expect.stringContaining('login/mfa'), + { code: '123456' }, + ) + expect(onVerified).toBeCalled() + }) + + it('should close the dialog and revoke the backend session on cancel', async () => { + apiService.get = jest.fn().mockResolvedValue({ status: 200 }) + renderComponent() + + await act(async () => { + fireEvent.click(screen.getByTestId('oauth-mfa-dialog-cancel-btn')) + }) + + const actions = store.getActions() + expect(actions).toContainEqual(setMfaDialogState(false)) + expect(actions).toContainEqual(setOAuthCloudSource(null)) + // a canceled sign-in must delete the credentialed backend session, not just + // reset renderer state + expect(apiService.get).toBeCalledWith(ApiEndpoints.CLOUD_ME_LOGOUT) + expect(actions).toContainEqual(logoutUser()) + expect(actions).toContainEqual(setSSOFlow(undefined)) + }) + + it('should show the inline error', () => { + jest.mocked(oauthCloudMfaSelector).mockReturnValueOnce({ + ...mockMfaOpenState, + error: 'Invalid code', + }) + renderComponent() + + expect(screen.getByTestId('oauth-mfa-dialog-error')).toHaveTextContent( + 'Invalid code', + ) + }) + + it('should ignore cancel while a verification is in flight', () => { + jest.mocked(oauthCloudMfaSelector).mockReturnValue({ + ...mockMfaOpenState, + loading: true, + }) + renderComponent() + + const cancelBtn = screen.getByTestId('oauth-mfa-dialog-cancel-btn') + expect(cancelBtn).toBeDisabled() + + fireEvent.click(cancelBtn) + + expect(store.getActions()).toEqual([]) + }) + + it('should reset the error when the user edits the code after a failure', () => { + jest.mocked(oauthCloudMfaSelector).mockReturnValue({ + ...mockMfaOpenState, + error: 'Invalid code', + }) + renderComponent() + + fireEvent.change(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + target: { value: '1' }, + }) + + expect(store.getActions()).toContainEqual(resetMfaError()) + }) +}) diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.tsx b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.tsx new file mode 100644 index 0000000000..66085109ed --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.tsx @@ -0,0 +1,156 @@ +import React, { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' +import { + logoutUserAction, + oauthCloudMfaSelector, + resetMfaError, + setMfaDialogState, + setOAuthCloudSource, + submitMfaCodeAction, +} from 'uiSrc/slices/oauth/cloud' + +import { Modal } from 'uiSrc/components/base/display' +import { CancelIcon } from 'uiSrc/components/base/icons' +import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { + PrimaryButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' +import { ColorText, Text } from 'uiSrc/components/base/text' + +import { OAuthMfaDialogProps } from './OAuthMfaDialog.types' +import { MFA_CODE_LENGTH } from './OAuthMfaDialog.constants' +import OtpInput from './components/otp-input/OtpInput' + +const OAuthMfaDialog = ({ onVerified }: OAuthMfaDialogProps) => { + const { isOpenDialog, loading, error } = useAppSelector(oauthCloudMfaSelector) + const [code, setCode] = useState('') + + const dispatch = useAppDispatch() + const { t } = useTranslation() + + useEffect(() => { + if (!isOpenDialog) { + setCode('') + } + }, [isOpenDialog]) + + // clear the boxes after a rejected code so the user can retype right away + useEffect(() => { + if (error) { + setCode('') + } + }, [error]) + + if (!isOpenDialog) return null + + const isSubmitDisabled = code.length !== MFA_CODE_LENGTH || loading + + const handleCancel = () => { + // ignore cancel while a verification is in flight, otherwise the pending + // request could still resolve and resume the flow after the user cancelled + if (loading) return + + dispatch(setMfaDialogState(false)) + dispatch(setOAuthCloudSource(null)) + // the oauth callback already credentialed the backend session; revoke it so + // the abandoned sign-in cannot be resumed on a later fetch or app restart. + // logout also clears the SSO flow, releasing ConfigOAuth's in-progress guard + dispatch(logoutUserAction()) + } + + const handleChange = (next: string) => { + setCode(next) + // dismiss the previous failure as soon as the user edits the code + if (error) { + dispatch(resetMfaError()) + } + } + + // accept the code explicitly so the auto-submit-on-complete path doesn't + // race the `code` state update + const handleSubmit = (submittedCode: string = code) => { + if (submittedCode.length !== MFA_CODE_LENGTH || loading) return + + dispatch(submitMfaCodeAction(submittedCode, onVerified)) + } + + return ( + + + + + + + {t('oauth.mfa.title')} + + + + + {t('oauth.mfa.description')} + + {error && ( + + + {error} + + + )} + + } + /> + + + + + + {t('oauth.mfa.cancel')} + + handleSubmit()} + disabled={isSubmitDisabled} + loading={loading} + data-testid="oauth-mfa-dialog-submit-btn" + > + {t('oauth.mfa.verify')} + + + + + + + ) +} + +export default OAuthMfaDialog diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.types.ts b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.types.ts new file mode 100644 index 0000000000..2e22137197 --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/OAuthMfaDialog.types.ts @@ -0,0 +1,3 @@ +export interface OAuthMfaDialogProps { + onVerified?: () => void +} diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.spec.tsx b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.spec.tsx new file mode 100644 index 0000000000..7ca81494d6 --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.spec.tsx @@ -0,0 +1,144 @@ +import React from 'react' +import { cleanup, fireEvent, render, screen } from 'uiSrc/utils/test-utils' +import OtpInput from './OtpInput' +import { OtpInputProps } from './OtpInput.types' + +const TESTID = 'otp' + +const defaultProps: OtpInputProps = { + value: '', + onChange: jest.fn(), + length: 6, + 'data-testid': TESTID, +} + +const renderComponent = (propsOverride?: Partial) => + render() + +const box = (index: number) => + screen.getByTestId(`${TESTID}-${index}`) as HTMLInputElement + +beforeEach(() => { + cleanup() + jest.clearAllMocks() +}) + +describe('OtpInput', () => { + it('should render one box per digit of the configured length', () => { + renderComponent({ length: 6 }) + expect(screen.getAllByTestId(/^otp-\d$/)).toHaveLength(6) + }) + + it('should emit the digit typed into a box', () => { + const onChange = jest.fn() + renderComponent({ value: '', onChange }) + + fireEvent.change(box(0), { target: { value: '1' } }) + + expect(onChange).toHaveBeenCalledWith('1') + }) + + it('should ignore non-digit input', () => { + const onChange = jest.fn() + renderComponent({ value: '', onChange }) + + fireEvent.change(box(0), { target: { value: 'a' } }) + + expect(onChange).not.toHaveBeenCalled() + }) + + it('should call onComplete when the last digit fills', () => { + const onChange = jest.fn() + const onComplete = jest.fn() + renderComponent({ value: '12345', onChange, onComplete }) + + fireEvent.change(box(5), { target: { value: '6' } }) + + expect(onChange).toHaveBeenCalledWith('123456') + expect(onComplete).toHaveBeenCalledWith('123456') + }) + + it('should populate every box and complete when a full code is pasted', () => { + const onChange = jest.fn() + const onComplete = jest.fn() + renderComponent({ value: '', onChange, onComplete }) + + fireEvent.paste(box(0), { + clipboardData: { getData: () => '123456' }, + }) + + expect(onChange).toHaveBeenCalledWith('123456') + expect(onComplete).toHaveBeenCalledWith('123456') + }) + + it('should distribute a full code autofilled into one box', () => { + const onChange = jest.fn() + const onComplete = jest.fn() + renderComponent({ value: '', onChange, onComplete }) + + // a password manager / OS autofill delivers the whole code via change + fireEvent.change(box(0), { target: { value: '123456' } }) + + expect(onChange).toHaveBeenCalledWith('123456') + expect(onComplete).toHaveBeenCalledWith('123456') + }) + + it('should strip non-digits and cap the pasted value at the length', () => { + const onChange = jest.fn() + renderComponent({ value: '', onChange }) + + fireEvent.paste(box(0), { + clipboardData: { getData: () => 'ab12-cd34 56 78' }, + }) + + expect(onChange).toHaveBeenCalledWith('123456') + }) + + it('should clear the previous box on backspace when the current is empty', () => { + const onChange = jest.fn() + renderComponent({ value: '12', onChange }) + + fireEvent.keyDown(box(2), { key: 'Backspace' }) + + expect(onChange).toHaveBeenCalledWith('1') + }) + + it('should not shift later digits when a middle box is cleared', () => { + const onChange = jest.fn() + renderComponent({ value: '12345', onChange }) + + fireEvent.keyDown(box(2), { key: 'Backspace' }) + + expect(onChange).toHaveBeenCalledWith('1245') + // the digit after the cleared box keeps its position, it does not slide left + expect(box(2).value).toBe('') + expect(box(3).value).toBe('4') + }) + + it('should clear a box when its digit is deleted', () => { + const onChange = jest.fn() + renderComponent({ value: '123456', onChange }) + + fireEvent.change(box(2), { target: { value: '' } }) + + expect(onChange).toHaveBeenCalledWith('12456') + expect(box(2).value).toBe('') + expect(box(3).value).toBe('4') + }) + + it('should keep the existing digit when a non-digit is typed', () => { + const onChange = jest.fn() + renderComponent({ value: '123456', onChange }) + + fireEvent.change(box(2), { target: { value: 'a' } }) + + expect(onChange).not.toHaveBeenCalled() + expect(box(2).value).toBe('3') + }) + + it('should mark boxes invalid via aria-invalid', () => { + renderComponent({ isInvalid: true }) + + expect(box(0)).toHaveAttribute('aria-invalid', 'true') + }) +}) diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.styles.ts b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.styles.ts new file mode 100644 index 0000000000..4e5fb3b8ed --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.styles.ts @@ -0,0 +1,40 @@ +import styled from 'styled-components' +import { Row } from 'uiSrc/components/base/layout/flex' + +export const Container = styled(Row)` + /* vertical breathing room so the focus ring is not clipped by the dialog body */ + padding: ${({ theme }) => theme.core.space.space025} 0; + + input { + width: 3.5rem; + height: 4rem; + text-align: center; + font-size: 1.75rem; + font-weight: 600; + color: ${({ theme }) => theme.semantic.color.text.neutral800}; + background: ${({ theme }) => theme.semantic.color.background.neutral100}; + border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral500}; + border-radius: ${({ theme }) => theme.core.space.space100}; + outline: none; + caret-color: ${({ theme }) => theme.semantic.color.border.secondary500}; + } + + input:focus { + border-color: ${({ theme }) => theme.semantic.color.border.secondary500}; + box-shadow: 0 0 0 1px + ${({ theme }) => theme.semantic.color.border.secondary500}; + } + + input[aria-invalid='true'] { + border-color: ${({ theme }) => theme.semantic.color.text.danger500}; + } + + input[aria-invalid='true']:focus { + box-shadow: 0 0 0 1px ${({ theme }) => theme.semantic.color.text.danger500}; + } + + input:disabled { + opacity: 0.6; + cursor: not-allowed; + } +` diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.tsx b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.tsx new file mode 100644 index 0000000000..56c444799d --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.tsx @@ -0,0 +1,152 @@ +import React, { useEffect, useRef, useState } from 'react' + +import * as S from './OtpInput.styles' +import { OtpInputProps } from './OtpInput.types' + +const DEFAULT_LENGTH = 6 +const DIGITS_ONLY = /\d/g + +// fixed-length representation so clearing a middle box does not shift the rest +const toSlots = (value: string, length: number): string[] => + Array.from({ length }, (_, index) => value[index] ?? '') + +const OtpInput = ({ + value, + onChange, + onComplete, + length = DEFAULT_LENGTH, + isInvalid, + disabled, + autoFocus, + ariaLabel, + 'data-testid': dataTestid, +}: OtpInputProps) => { + const inputsRef = useRef>([]) + const [slots, setSlots] = useState(() => toSlots(value, length)) + + // the parent clears the value to reset the field (error dismissed, dialog closed) + useEffect(() => { + if (value === '') { + setSlots(toSlots('', length)) + } + }, [value, length]) + + // refocus the first box when the code is rejected so the user can retype + useEffect(() => { + if (isInvalid) { + inputsRef.current[0]?.focus() + } + }, [isInvalid]) + + const focusAt = (index: number) => { + const target = inputsRef.current[Math.max(0, Math.min(index, length - 1))] + target?.focus() + target?.select() + } + + const commit = (next: string[]) => { + setSlots(next) + const code = next.join('') + onChange(code) + if (next.every((digit) => digit !== '')) { + onComplete?.(code) + } + } + + // fill the slots from a full code (paste or OS/password-manager autofill) and + // move focus past the last filled box + const fillFrom = (raw: string) => { + const digits = (raw.match(DIGITS_ONLY) || []).join('').slice(0, length) + if (!digits) { + return + } + commit(toSlots(digits, length)) + focusAt(digits.length) + } + + const handleChange = + (index: number) => (e: React.ChangeEvent) => { + const digits = (e.target.value.match(DIGITS_ONLY) || []).join('') + if (!digits) { + // a cleared box (empty value) clears the slot; a non-digit keystroke + // leaves the existing digit in place + if (e.target.value === '' && slots[index]) { + const next = [...slots] + next[index] = '' + commit(next) + } + return + } + + // autofill delivers the whole code into one box; spread it across the + // slots like a paste instead of keeping only the last digit + if (digits.length > 1) { + fillFrom(digits) + return + } + + const next = [...slots] + next[index] = digits[digits.length - 1] + commit(next) + focusAt(index + 1) + } + + const handleKeyDown = + (index: number) => (e: React.KeyboardEvent) => { + if (e.key === 'Backspace') { + e.preventDefault() + const next = [...slots] + if (next[index]) { + next[index] = '' + commit(next) + } else if (index > 0) { + next[index - 1] = '' + commit(next) + focusAt(index - 1) + } + } else if (e.key === 'ArrowLeft') { + e.preventDefault() + focusAt(index - 1) + } else if (e.key === 'ArrowRight') { + e.preventDefault() + focusAt(index + 1) + } + } + + const handlePaste = (e: React.ClipboardEvent) => { + e.preventDefault() + fillFrom(e.clipboardData.getData('text')) + } + + return ( + + {slots.map((digit, index) => ( + { + inputsRef.current[index] = el + }} + type="text" + inputMode="numeric" + autoComplete="one-time-code" + maxLength={1} + value={digit} + disabled={disabled} + // eslint-disable-next-line jsx-a11y/no-autofocus + autoFocus={autoFocus && index === 0} + aria-label={ariaLabel ? `${ariaLabel} ${index + 1}` : undefined} + aria-invalid={isInvalid} + onChange={handleChange(index)} + onKeyDown={handleKeyDown(index)} + onPaste={handlePaste} + onFocus={(e: React.FocusEvent) => e.target.select()} + data-testid={dataTestid ? `${dataTestid}-${index}` : undefined} + /> + ))} + + ) +} + +export default OtpInput diff --git a/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.types.ts b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.types.ts new file mode 100644 index 0000000000..aef3f7f235 --- /dev/null +++ b/redisinsight/ui/src/components/oauth/oauth-mfa-dialog/components/otp-input/OtpInput.types.ts @@ -0,0 +1,11 @@ +export interface OtpInputProps { + value: string + onChange: (value: string) => void + onComplete?: (value: string) => void + length?: number + isInvalid?: boolean + disabled?: boolean + autoFocus?: boolean + ariaLabel?: string + 'data-testid'?: string +} diff --git a/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.spec.tsx b/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.spec.tsx index 551a5f2028..f7f888f5f2 100644 --- a/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.spec.tsx +++ b/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.spec.tsx @@ -27,7 +27,7 @@ import { resetCliSettings, } from 'uiSrc/slices/cli/cli-settings' import { setMonitorInitialState, showMonitor } from 'uiSrc/slices/cli/monitor' -import { FeatureFlags, Pages } from 'uiSrc/constants' +import { Pages } from 'uiSrc/constants' import { dbAnalysisSelector, setDatabaseAnalysisViewTab, @@ -602,37 +602,7 @@ describe('ONBOARDING_FEATURES', () => { ) }) - it('should skip vector search step and navigate to workbench on next when vectorSearchV2 is off', () => { - const pushMock = jest.fn() - reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock }) - - render( - - - , - ) - fireEvent.click(screen.getByTestId('next-btn')) - - expect(pushMock).toHaveBeenCalledWith(Pages.workbench('')) - - const expectedActions = [ - resetCliSettings(), - resetCliHelperSettings(), - setMonitorInitialState(), - setOnboardNextStep(), - setOnboardNextStep(), - ] - expect(clearStoreActions(store.getActions())).toEqual( - clearStoreActions(expectedActions), - ) - }) - - it('should navigate to vector search on next when vectorSearchV2 is on', () => { - ;(appFeatureFlagsFeaturesSelector as jest.Mock).mockReturnValueOnce({ - databaseChat: { flag: false }, - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - + it('should navigate to vector search on next', () => { const pushMock = jest.fn() reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock }) @@ -673,7 +643,7 @@ describe('ONBOARDING_FEATURES', () => { , ) expect(screen.getByTestId('step-content')).toHaveTextContent( - 'This is Search, where you can index your data and query it using Redis Query Engine.', + 'This is Search, where you can index your data and query it using Redis Search.', ) expect(screen.getByTestId('step-content')).toHaveTextContent( 'Load sample data to create your first index and run sample queries to see results instantly.', @@ -905,35 +875,7 @@ describe('ONBOARDING_FEATURES', () => { ) }) - it('should skip vector search step and navigate to browser on back when vectorSearchV2 is off', () => { - const pushMock = jest.fn() - reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock }) - - render( - - - , - ) - fireEvent.click(screen.getByTestId('back-btn')) - - expect(pushMock).toHaveBeenCalledWith(Pages.browser('')) - - const expectedActions = [ - setOnboardPrevStep(), - showMonitor(), - setOnboardPrevStep(), - ] - expect(clearStoreActions(store.getActions().slice(-3))).toEqual( - clearStoreActions(expectedActions), - ) - }) - - it('should navigate to vector search on back when vectorSearchV2 is on', () => { - ;(appFeatureFlagsFeaturesSelector as jest.Mock).mockReturnValueOnce({ - databaseChat: { flag: false }, - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - + it('should navigate to vector search on back', () => { const pushMock = jest.fn() reactRouterDom.useHistory = jest.fn().mockReturnValue({ push: pushMock }) diff --git a/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.tsx b/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.tsx index b4a1ae5fb0..8765da4af1 100644 --- a/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.tsx +++ b/redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.tsx @@ -268,8 +268,6 @@ const ONBOARDING_FEATURES = { const { id: connectedInstanceId = '' } = useAppSelector( connectedInstanceSelector, ) - const { [FeatureFlags.vectorSearchV2]: vectorSearchFeature } = - useAppSelector(appFeatureFlagsFeaturesSelector) const dispatch = useAppDispatch() const history = useHistory() @@ -301,12 +299,7 @@ const ONBOARDING_FEATURES = { dispatch(resetCliHelperSettings()) dispatch(setMonitorInitialState()) - if (vectorSearchFeature?.flag) { - history.push(Pages.vectorSearch(connectedInstanceId)) - } else { - dispatch(setOnboardNextStep()) - history.push(Pages.workbench(connectedInstanceId)) - } + history.push(Pages.vectorSearch(connectedInstanceId)) sendNextTelemetryEvent(...telemetryArgs) }, @@ -332,8 +325,8 @@ const ONBOARDING_FEATURES = { content: ( <> This is Search, where you can index your data and query it using - Redis Query Engine. Run full-text search, vector similarity, and - filtered queries right from the UI. + Redis Search. Run full-text search, vector similarity, and filtered + queries right from the UI. Load sample data to create your first index and run sample queries to see results instantly. @@ -359,8 +352,6 @@ const ONBOARDING_FEATURES = { const { id: connectedInstanceId = '' } = useAppSelector( connectedInstanceSelector, ) - const { [FeatureFlags.vectorSearchV2]: vectorSearchFeature } = - useAppSelector(appFeatureFlagsFeaturesSelector) const [firstIndex, setFirstIndex] = useState>(null) const dispatch = useAppDispatch() @@ -445,13 +436,7 @@ const ONBOARDING_FEATURES = { ), onSkip: () => sendClosedTelemetryEvent(...telemetryArgs), onBack: () => { - if (vectorSearchFeature?.flag) { - history.push(Pages.vectorSearch(connectedInstanceId)) - } else { - history.push(Pages.browser(connectedInstanceId)) - dispatch(setOnboardPrevStep()) - dispatch(showMonitor()) - } + history.push(Pages.vectorSearch(connectedInstanceId)) sendBackTelemetryEvent(...telemetryArgs) }, diff --git a/redisinsight/ui/src/components/onboarding-tour/OnboardingTour.tsx b/redisinsight/ui/src/components/onboarding-tour/OnboardingTour.tsx index 4a618536a2..6ee4435cfc 100644 --- a/redisinsight/ui/src/components/onboarding-tour/OnboardingTour.tsx +++ b/redisinsight/ui/src/components/onboarding-tour/OnboardingTour.tsx @@ -1,15 +1,12 @@ -import React, { useEffect, useMemo, useState } from 'react' -import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' +import React, { useEffect, useState } from 'react' +import { useAppDispatch } from 'uiSrc/slices/hooks' import cx from 'classnames' import { - appFeatureFlagsFeaturesSelector, skipOnboarding, setOnboardNextStep, setOnboardPrevStep, } from 'uiSrc/slices/app/features' -import { FeatureFlags } from 'uiSrc/constants' -import { OnboardingSteps } from 'uiSrc/constants/onboarding' import { CancelSlimIcon } from 'uiSrc/components/base/icons' import { EmptyButton, @@ -53,24 +50,9 @@ const OnboardingTour = (props: Props) => { onSkip = () => {}, } = Inner ? Inner() : {} - const { [FeatureFlags.vectorSearchV2]: vectorSearchFeature } = useAppSelector( - appFeatureFlagsFeaturesSelector, - ) - const [isOpen, setIsOpen] = useState(step === currentStep && isActive) const isLastStep = currentStep === totalSteps - const { displayStep, displayTotalSteps } = useMemo(() => { - const skippedSteps = vectorSearchFeature?.flag ? 0 : 1 - return { - displayStep: - currentStep > OnboardingSteps.VectorSearchPage - ? currentStep - skippedSteps - : currentStep, - displayTotalSteps: totalSteps - skippedSteps, - } - }, [currentStep, totalSteps, vectorSearchFeature?.flag]) - const dispatch = useAppDispatch() useEffect(() => { @@ -133,7 +115,7 @@ const OnboardingTour = (props: Props) => { - {displayStep} of {displayTotalSteps} + {currentStep} of {totalSteps} {currentStep > 1 && ( diff --git a/redisinsight/ui/src/components/query/components/RunButton.tsx b/redisinsight/ui/src/components/query/components/RunButton.tsx index 882f5d0dcc..ca710b33d5 100644 --- a/redisinsight/ui/src/components/query/components/RunButton.tsx +++ b/redisinsight/ui/src/components/query/components/RunButton.tsx @@ -1,5 +1,6 @@ import React from 'react' import styled from 'styled-components' +import { useTranslation } from 'uiSrc/i18n' import { PlayFilledIcon } from 'uiSrc/components/base/icons' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' @@ -24,6 +25,7 @@ export const RunButton = ({ isLoading?: boolean onSubmit: () => void }) => { + const { t } = useTranslation() return ( { @@ -32,10 +34,10 @@ export const RunButton = ({ loading={isLoading} disabled={isLoading} icon={PlayFilledIcon} - aria-label="submit" + aria-label={t('query.runButton.aria')} data-testid="btn-submit" > - Run + {t('query.runButton.label')} ) } diff --git a/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.styles.ts b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.styles.ts new file mode 100644 index 0000000000..9164b09ef0 --- /dev/null +++ b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.styles.ts @@ -0,0 +1,51 @@ +import { createGlobalStyle } from 'styled-components' +import { Theme } from 'uiSrc/components/base/theme/types' + +import { + EMBEDDING_COPY_CLASS, + EMBEDDING_EXPAND_CLASS, + EMBEDDING_HIDDEN_CLASS, + EMBEDDING_TOGGLE_CLASS, +} from '../../hooks/useVectorEmbeddingCollapse.constants' + +export const VectorEmbeddingHighlightStyles = createGlobalStyle<{ + theme: Theme +}>` + .monaco-vector-embedding { + background-color: ${({ theme }) => theme.semantic.color.background.neutral400}; + border-radius: ${({ theme }) => theme.core.space.space050}; + } + + /* font-size: 0 (not display: none) keeps the caret measurable inside it. */ + .${EMBEDDING_HIDDEN_CLASS} { + font-size: 0; + } + + .${EMBEDDING_TOGGLE_CLASS}, + .${EMBEDDING_EXPAND_CLASS}, + .${EMBEDDING_COPY_CLASS} { + cursor: pointer; + pointer-events: auto; + background-color: ${({ theme }) => + theme.semantic.color.background.primary200}; + border-radius: ${({ theme }) => theme.core.space.space100}; + padding: 0 ${({ theme }) => theme.core.space.space100}; + font-size: 1.2rem; + } + + .${EMBEDDING_TOGGLE_CLASS}:hover, + .${EMBEDDING_EXPAND_CLASS}:hover, + .${EMBEDDING_COPY_CLASS}:hover { + background-color: ${({ theme }) => + theme.semantic.color.background.primary300}; + } + + .${EMBEDDING_TOGGLE_CLASS} { + margin-right: ${({ theme }) => theme.core.space.space050}; + } + + .${EMBEDDING_COPY_CLASS}, + .${EMBEDDING_EXPAND_CLASS} { + margin-right: ${({ theme }) => theme.core.space.space100}; + } +` diff --git a/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.tsx b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.tsx new file mode 100644 index 0000000000..544f65d965 --- /dev/null +++ b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.tsx @@ -0,0 +1,22 @@ +import React from 'react' + +import { useVectorEmbeddingMarks } from '../../hooks/useVectorEmbeddingMarks' +import { useVectorEmbeddingDecorations } from '../../hooks/useVectorEmbeddingDecorations' +import { useVectorEmbeddingCollapse } from '../../hooks/useVectorEmbeddingCollapse' +import { VectorEmbeddingHighlightProps } from './VectorEmbeddingHighlight.types' +import { VectorEmbeddingHighlightStyles } from './VectorEmbeddingHighlight.styles' + +/** + * Highlights and collapses detected vector embeddings. Render alongside a + * CodeEditor that shares the same monaco instance. + */ +export const VectorEmbeddingHighlight = ({ + monacoObjects, + query, +}: VectorEmbeddingHighlightProps) => { + const { marks } = useVectorEmbeddingMarks({ query }) + useVectorEmbeddingDecorations({ monacoObjects, marks }) + useVectorEmbeddingCollapse({ monacoObjects, query }) + + return +} diff --git a/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.types.ts b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.types.ts new file mode 100644 index 0000000000..afb90dff35 --- /dev/null +++ b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/VectorEmbeddingHighlight.types.ts @@ -0,0 +1,9 @@ +import { RefObject } from 'react' + +import { Nullable } from 'uiSrc/utils' +import { IEditorMount } from 'uiSrc/pages/workbench/interfaces' + +export interface VectorEmbeddingHighlightProps { + monacoObjects: RefObject> + query: string +} diff --git a/redisinsight/ui/src/components/query/components/vector-embedding-highlight/index.ts b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/index.ts new file mode 100644 index 0000000000..5487a1204c --- /dev/null +++ b/redisinsight/ui/src/components/query/components/vector-embedding-highlight/index.ts @@ -0,0 +1 @@ +export { VectorEmbeddingHighlight } from './VectorEmbeddingHighlight' diff --git a/redisinsight/ui/src/components/query/context/query-editor.context.tsx b/redisinsight/ui/src/components/query/context/query-editor.context.tsx index 74cd0c0aa0..611f05325c 100644 --- a/redisinsight/ui/src/components/query/context/query-editor.context.tsx +++ b/redisinsight/ui/src/components/query/context/query-editor.context.tsx @@ -1,6 +1,6 @@ -import React, { createContext, useContext, useRef } from 'react' +import React, { createContext, useCallback, useContext, useRef } from 'react' -import { Nullable } from 'uiSrc/utils' +import { expandVectorEmbeddings, Nullable } from 'uiSrc/utils' import { IEditorMount } from 'uiSrc/pages/workbench/interfaces' import { @@ -27,8 +27,19 @@ export const QueryEditorContextProvider = ({ }: QueryEditorContextProviderProps) => { const monacoObjects = useRef>(null) + const { onSubmit, query } = value + // The editor may show collapsed vector embedding placeholders instead of + // the full values, so every submitted query is expanded back first. + const handleSubmit = useCallback( + (submittedQuery?: string) => + onSubmit(expandVectorEmbeddings(submittedQuery ?? query)), + [onSubmit, query], + ) + return ( - + {children} ) diff --git a/redisinsight/ui/src/components/query/hooks/index.ts b/redisinsight/ui/src/components/query/hooks/index.ts index 2b588aa281..c6945897e5 100644 --- a/redisinsight/ui/src/components/query/hooks/index.ts +++ b/redisinsight/ui/src/components/query/hooks/index.ts @@ -1,6 +1,8 @@ export { useMonacoRedisEditor } from './useMonacoRedisEditor' export { useRedisCompletions } from './useRedisCompletions' export { useQueryDecorations } from './useQueryDecorations' +export { useVectorEmbeddingMarks } from './useVectorEmbeddingMarks' +export { useVectorEmbeddingCollapse } from './useVectorEmbeddingCollapse' export { useCommandHistory } from './useCommandHistory' export { useDslSyntax } from './useDslSyntax' export { useQueryEditor } from './useQueryEditor' diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.constants.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.constants.ts new file mode 100644 index 0000000000..bbea30f60c --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.constants.ts @@ -0,0 +1,13 @@ +export const EMBEDDING_HIDDEN_CLASS = 'monaco-vector-embedding-hidden' +export const EMBEDDING_TOGGLE_CLASS = 'monaco-vector-embedding-toggle' +export const EMBEDDING_EXPAND_CLASS = 'monaco-vector-embedding-expand' +export const EMBEDDING_COPY_CLASS = 'monaco-vector-embedding-copy' + +export const ARROW_COLLAPSED = '▸' +export const ARROW_EXPANDED = '▾' +export const COPY_ICON = '⧉' +export const COPIED_ICON = '✓' + +export const COPIED_RESET_MS = 1500 + +export const COLLAPSE_EDIT_SOURCE = 'vector-embedding-collapse' diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.spec.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.spec.ts new file mode 100644 index 0000000000..4ce35708fd --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.spec.ts @@ -0,0 +1,122 @@ +import { renderHook } from 'uiSrc/utils/test-utils' +import { + collapseVectorEmbeddingValue, + resetVectorEmbeddingPlaceholders, +} from 'uiSrc/utils' +import { FP32_VECTOR_FIXTURE_1_2_3 } from 'uiSrc/mocks/factories/browser/vectorSet/vectorSetElement.factory' +import { useVectorEmbeddingCollapse } from './useVectorEmbeddingCollapse' +import { UseVectorEmbeddingCollapseProps } from './useVectorEmbeddingCollapse.types' + +const { escaped: FP32_ESCAPED } = FP32_VECTOR_FIXTURE_1_2_3 + +const monaco = { + Range: jest.fn((sl: number, sc: number, el: number, ec: number) => ({ + startLineNumber: sl, + startColumn: sc, + endLineNumber: el, + endColumn: ec, + })), +} + +const createEditor = (value: string) => { + const model = { + getValue: jest.fn(() => value), + getPositionAt: jest.fn((offset: number) => ({ + lineNumber: 1, + column: offset + 1, + })), + getOffsetAt: jest.fn(() => 0), + getValueInRange: jest.fn(() => ''), + getFullModelRange: jest.fn(() => ({})), + isDisposed: jest.fn(() => false), + } + const decorations = { set: jest.fn(), clear: jest.fn() } + const dispose = jest.fn() + const editor = { + getModel: jest.fn(() => model), + createDecorationsCollection: jest.fn(() => decorations), + executeEdits: jest.fn(), + pushUndoStop: jest.fn(), + getSelection: jest.fn(() => null), + getSelections: jest.fn(() => null), + setSelection: jest.fn(), + getPosition: jest.fn(() => ({ lineNumber: 1, column: 1 })), + revealPositionInCenterIfOutsideViewport: jest.fn(), + getContainerDomNode: jest.fn(() => document.createElement('div')), + getTargetAtClientPoint: jest.fn(() => null), + onDidChangeModelContent: jest.fn(() => ({ dispose })), + } + return { editor, decorations, dispose } +} + +const renderCollapse = (value: string) => { + const { editor, decorations, dispose } = createEditor(value) + const monacoObjects = { + current: { editor, monaco }, + } as unknown as UseVectorEmbeddingCollapseProps['monacoObjects'] + const view = renderHook(() => + useVectorEmbeddingCollapse({ monacoObjects, query: value }), + ) + return { ...view, editor, decorations, dispose } +} + +describe('useVectorEmbeddingCollapse', () => { + beforeEach(() => { + resetVectorEmbeddingPlaceholders() + }) + + it('collapses a detected embedding to a placeholder in the model', () => { + const { editor } = renderCollapse(`HSET k v "${FP32_ESCAPED}"`) + + expect(editor.executeEdits).toHaveBeenCalled() + const [, edits] = editor.executeEdits.mock.calls[0] + expect(edits[0].text).toMatch(/^\[▸vector·\d+dims#.+\]$/) + // Wrapped in undo stops so Ctrl+Z lands on the raw value first. + expect(editor.pushUndoStop).toHaveBeenCalled() + // View is brought back to the caret so a pasted blob doesn't leave the + // editor scrolled to the bottom. + expect(editor.revealPositionInCenterIfOutsideViewport).toHaveBeenCalled() + }) + + it('draws hidden, toggle and copy chips for a known placeholder', () => { + const placeholder = collapseVectorEmbeddingValue(`"${FP32_ESCAPED}"`, 3, 12) + const { decorations } = renderCollapse(`HSET k v ${placeholder}`) + + expect(decorations.set).toHaveBeenCalled() + const [drawn] = decorations.set.mock.calls.at(-1)! + expect(drawn).toHaveLength(3) + }) + + it('omits the copy chip for a value-less (stale) placeholder', () => { + // A placeholder-shaped token whose value is not in this session's store. + const { decorations } = renderCollapse('HSET k v [▸vector·3dims#gone-9]') + + const [drawn] = decorations.set.mock.calls.at(-1)! + // hidden + toggle only, no copy button. + expect(drawn).toHaveLength(2) + }) + + it('disposes the content-change subscription on unmount', () => { + const { unmount, editor, dispose } = renderCollapse( + `HSET k v "${FP32_ESCAPED}"`, + ) + + expect(editor.onDidChangeModelContent).toHaveBeenCalled() + unmount() + expect(dispose).toHaveBeenCalled() + }) + + it('restores collapsed embeddings and clears decorations on unmount', () => { + const placeholder = collapseVectorEmbeddingValue(`"${FP32_ESCAPED}"`, 3, 12) + const { unmount, editor, decorations } = renderCollapse( + `HSET k v ${placeholder}`, + ) + + unmount() + + expect(decorations.clear).toHaveBeenCalled() + const [, edits] = editor.executeEdits.mock.calls.at(-1)! + expect(edits[0].text).toContain(FP32_ESCAPED) + expect(edits[0].text).not.toContain('▸vector') + }) +}) diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.ts new file mode 100644 index 0000000000..2c989f2437 --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.ts @@ -0,0 +1,368 @@ +import { useEffect, useRef, useState } from 'react' +import { monaco as monacoEditor } from 'react-monaco-editor' + +import { useTranslation } from 'uiSrc/i18n' +import { + collapseVectorEmbeddingValue, + detectVectorEmbeddings, + expandVectorEmbeddings, + findVectorEmbeddingPlaceholders, + getEmbeddingKey, + getVectorEmbeddingValue, + handleCopy, + Nullable, +} from 'uiSrc/utils' + +import { UseVectorEmbeddingCollapseProps } from './useVectorEmbeddingCollapse.types' +import { + ARROW_COLLAPSED, + ARROW_EXPANDED, + COLLAPSE_EDIT_SOURCE, + COPIED_ICON, + COPIED_RESET_MS, + COPY_ICON, + EMBEDDING_COPY_CLASS, + EMBEDDING_EXPAND_CLASS, + EMBEDDING_HIDDEN_CLASS, + EMBEDDING_TOGGLE_CLASS, +} from './useVectorEmbeddingCollapse.constants' +import { findAtOffset, toMonacoRange } from './useVectorEmbeddingCollapse.utils' + +/** + * Collapses every detected embedding to a placeholder chip in the model and + * expands it back on click. The full value lives in the placeholder store and + * is restored at every exit path (expand, copy, submit, save). Detection runs + * off the live model text; embeddings start collapsed unless explicitly + * expanded. + */ +export const useVectorEmbeddingCollapse = ({ + monacoObjects, + query, +}: UseVectorEmbeddingCollapseProps) => { + const { t } = useTranslation() + // Placeholder id whose copy button currently shows the "copied" tick. + const [copiedId, setCopiedId] = useState>(null) + // monacoObjects is a ref, so a late editorDidMount doesn't retrigger the + // effects below. This flag flips once the editor is attached, guaranteeing + // the first collapse/listener pass runs even if `query` never changes. + const [isEditorReady, setIsEditorReady] = useState(false) + const decorationCollection = + useRef>(null) + const userExpandedKeys = useRef>(new Set()) + const copiedTimer = useRef>>(null) + // Set when the last model change was an undo/redo, so the next pass does not + // re-collapse embedding text that the user is trying to step back to. + const skipAutoCollapseOnce = useRef(false) + + useEffect(() => { + if (isEditorReady) return undefined + let frame = 0 + const waitForEditor = () => { + if (monacoObjects.current) { + setIsEditorReady(true) + return + } + frame = requestAnimationFrame(waitForEditor) + } + waitForEditor() + return () => cancelAnimationFrame(frame) + }, [isEditorReady, monacoObjects]) + + // The feature can be switched off at runtime (vectorSearchEnhancements flag), + // unmounting this component while embeddings are still collapsed. Restore the + // real values into the model and drop the decorations on unmount so the + // editor is never left with an inert placeholder chip. + useEffect( + () => () => { + decorationCollection.current?.clear() + + const model = monacoObjects.current?.editor.getModel() + if (!model || model.isDisposed()) return + + const text = model.getValue() + const expanded = expandVectorEmbeddings(text) + if (expanded !== text) { + monacoObjects.current?.editor.executeEdits(COLLAPSE_EDIT_SOURCE, [ + { range: model.getFullModelRange(), text: expanded }, + ]) + } + }, + [monacoObjects], + ) + + // Auto-collapse detected embeddings and (re)draw the placeholder chips. Runs + // whenever the query text or the copied-tick state changes. + useEffect(() => { + if (!monacoObjects.current) return + const { editor, monaco } = monacoObjects.current + + const model = editor.getModel() + if (!model) return + + if (!decorationCollection.current) { + decorationCollection.current = editor.createDecorationsCollection() + } + + const text = model.getValue() + const detected = detectVectorEmbeddings(text) + + // Drop expanded keys whose embedding is no longer in the editor (cleared, + // replaced, deleted) so a later paste always starts collapsed. + const detectedKeys = new Set(detected.map(getEmbeddingKey)) + userExpandedKeys.current = new Set( + [...userExpandedKeys.current].filter((key) => detectedKeys.has(key)), + ) + + const marksToCollapse = detected.filter( + (mark) => !userExpandedKeys.current.has(getEmbeddingKey(mark)), + ) + // An undo/redo restored raw embedding text. Mark it user-expanded rather + // than just skipping this one pass, so an unrelated later re-render (e.g. + // the copied-tick timer) does not re-collapse it and defeat the undo. + const isUndoRestore = skipAutoCollapseOnce.current + skipAutoCollapseOnce.current = false + if (marksToCollapse.length > 0 && isUndoRestore) { + marksToCollapse.forEach((mark) => + userExpandedKeys.current.add(getEmbeddingKey(mark)), + ) + } else if (marksToCollapse.length > 0) { + // Undo stops keep the collapse a separate undo entry from the paste/type + // that produced the vector, so Ctrl+Z first lands on the raw value (where + // the isUndoing guard keeps it expanded) instead of skipping past it. + editor.pushUndoStop() + // executeEdits remaps the caret next to the placeholder — don't restore a + // pre-edit selection, whose columns are stale once the long blob is gone. + editor.executeEdits( + COLLAPSE_EDIT_SOURCE, + marksToCollapse.map((mark) => ({ + range: toMonacoRange(monaco, model, mark.range), + text: collapseVectorEmbeddingValue( + text.slice(mark.range.start, mark.range.end), + mark.dimensions, + mark.byteSize, + ), + })), + ) + editor.pushUndoStop() + // A paste scrolls the view to the end of the long blob; once it collapses, + // bring the view back to the caret (now beside the placeholder) so it + // doesn't stay parked at the bottom. + const position = editor.getPosition() + if (position) editor.revealPositionInCenterIfOutsideViewport(position) + return + } + + const decorations: monacoEditor.editor.IModelDeltaDecoration[] = [] + + findVectorEmbeddingPlaceholders(text).forEach((placeholder) => { + const { start, end } = placeholder.range + const metadataHover = + placeholder.byteSize !== undefined + ? { + value: t('query.editor.vectorEmbedding.hover', { + dimensions: placeholder.dimensions, + byteSize: placeholder.byteSize, + }), + } + : undefined + + // Hide the placeholder text (else the tokenizer colours it) and draw the + // chip as injected spans; label and copy button hover independently. + decorations.push( + { + range: toMonacoRange(monaco, model, { start, end }), + options: { inlineClassName: EMBEDDING_HIDDEN_CLASS }, + }, + { + range: toMonacoRange(monaco, model, { start, end: start + 1 }), + options: { + hoverMessage: metadataHover, + before: { + content: `${ARROW_COLLAPSED} ${t( + 'query.editor.vectorEmbedding.label', + { dimensions: placeholder.dimensions }, + )}`, + inlineClassName: EMBEDDING_TOGGLE_CLASS, + }, + }, + }, + ) + + // Only offer copy when the value is retrievable this session; a stale or + // foreign placeholder can't be copied, so don't draw a dead button. + if (getVectorEmbeddingValue(placeholder.id) !== undefined) { + decorations.push({ + range: toMonacoRange(monaco, model, { start: end - 1, end }), + options: { + hoverMessage: { value: t('query.editor.vectorEmbedding.copy') }, + after: { + content: placeholder.id === copiedId ? COPIED_ICON : COPY_ICON, + inlineClassName: EMBEDDING_COPY_CLASS, + }, + }, + }) + } + }) + + detected.forEach((mark) => { + decorations.push({ + range: toMonacoRange(monaco, model, { + start: mark.range.start, + end: mark.range.start + 1, + }), + options: { + before: { + content: ARROW_EXPANDED, + inlineClassName: EMBEDDING_EXPAND_CLASS, + }, + }, + }) + }) + + decorationCollection.current.set(decorations) + }, [query, t, copiedId, monacoObjects, isEditorReady]) + + // Wire the editor-level listeners once the editor is attached. Kept separate + // from the decoration pass so the handlers aren't rebuilt on every query or + // copied-tick change; they read live model state, so they never go stale. + useEffect(() => { + if (!isEditorReady || !monacoObjects.current) return undefined + const { editor, monaco } = monacoObjects.current + const domNode = editor.getContainerDomNode() + + // Handle chip clicks in the capture phase and stop the event before Monaco + // sees it, so the caret never lands on the zero-width chip (even on hold). + const handleChipMouseDown = (e: MouseEvent) => { + const classList = (e.target as HTMLElement | null)?.classList + const isCopy = classList?.contains(EMBEDDING_COPY_CLASS) + const isCollapsedToggle = classList?.contains(EMBEDDING_TOGGLE_CLASS) + const isExpandArrow = classList?.contains(EMBEDDING_EXPAND_CLASS) + if (!isCopy && !isCollapsedToggle && !isExpandArrow) return + + e.preventDefault() + e.stopPropagation() + + const currentModel = editor.getModel() + if (!currentModel) return + const currentText = currentModel.getValue() + const mouseTarget = editor.getTargetAtClientPoint(e.clientX, e.clientY) + const offset = mouseTarget?.position + ? currentModel.getOffsetAt(mouseTarget.position) + : null + + if (isExpandArrow) { + const mark = findAtOffset(detectVectorEmbeddings(currentText), offset) + if (!mark) return + userExpandedKeys.current.delete(getEmbeddingKey(mark)) + // The click is prevented from moving the caret, and executeEdits remaps + // the existing selection across the edit, so we don't restore it (its + // pre-edit columns would be stale once the text length changes). + // Undo stops keep this manual collapse its own undo entry, so Ctrl+Z + // undoes only the collapse and not a preceding edit to the vector. + editor.pushUndoStop() + editor.executeEdits(COLLAPSE_EDIT_SOURCE, [ + { + range: toMonacoRange(monaco, currentModel, mark.range), + text: collapseVectorEmbeddingValue( + currentText.slice(mark.range.start, mark.range.end), + mark.dimensions, + mark.byteSize, + ), + }, + ]) + editor.pushUndoStop() + return + } + + const placeholder = findAtOffset( + findVectorEmbeddingPlaceholders(currentText), + offset, + ) + if (!placeholder) return + const value = getVectorEmbeddingValue(placeholder.id) + if (value === undefined) return + + if (isCopy) { + handleCopy(value) + setCopiedId(placeholder.id) + if (copiedTimer.current) clearTimeout(copiedTimer.current) + copiedTimer.current = setTimeout( + () => setCopiedId(null), + COPIED_RESET_MS, + ) + return + } + + // The click is prevented from moving the caret, and executeEdits remaps + // the existing selection across the edit, so we don't restore it: the + // saved columns would point inside the now-longer vector. + // Undo stops keep this manual expand its own undo entry, symmetric with + // the collapse paths, so Ctrl+Z steps through it cleanly. + editor.pushUndoStop() + editor.executeEdits(COLLAPSE_EDIT_SOURCE, [ + { + range: toMonacoRange(monaco, currentModel, placeholder.range), + text: value, + }, + ]) + editor.pushUndoStop() + // Keep the stored value: an undo can restore the placeholder text, and it + // must still resolve on expand/copy/submit. The store is session-scoped. + const expandedMark = detectVectorEmbeddings(currentModel.getValue()).find( + (m) => m.range.start === placeholder.range.start, + ) + if (expandedMark) + userExpandedKeys.current.add(getEmbeddingKey(expandedMark)) + } + + // Copy/cut with full values instead of placeholders; cut also removes the + // selection since we take over the clipboard write. Every cursor/selection + // is handled (not just the primary), ordered top-to-bottom, so a + // multi-selection copy/cut never drops ranges or leaves raw placeholders. + const writeExpandedClipboard = (e: ClipboardEvent, isCut: boolean) => { + const currentModel = editor.getModel() + const selections = editor.getSelections() + if (!currentModel || !selections?.length || !e.clipboardData) return + + const ordered = [...selections].sort( + (a, b) => + currentModel.getOffsetAt(a.getStartPosition()) - + currentModel.getOffsetAt(b.getStartPosition()), + ) + const parts = ordered.map((range) => currentModel.getValueInRange(range)) + const selected = parts.join('\n') + const expanded = parts.map(expandVectorEmbeddings).join('\n') + if (expanded === selected) return + + e.preventDefault() + e.stopPropagation() + e.clipboardData.setData('text/plain', expanded) + if (isCut) { + editor.executeEdits( + COLLAPSE_EDIT_SOURCE, + ordered.map((range) => ({ range, text: '' })), + ) + } + } + const handleCopyEvent = (e: ClipboardEvent) => + writeExpandedClipboard(e, false) + const handleCutEvent = (e: ClipboardEvent) => + writeExpandedClipboard(e, true) + + const contentChangeSub = editor.onDidChangeModelContent((e) => { + if (e.isUndoing || e.isRedoing) skipAutoCollapseOnce.current = true + }) + + domNode.addEventListener('mousedown', handleChipMouseDown, true) + domNode.addEventListener('copy', handleCopyEvent, true) + domNode.addEventListener('cut', handleCutEvent, true) + + return () => { + domNode.removeEventListener('mousedown', handleChipMouseDown, true) + domNode.removeEventListener('copy', handleCopyEvent, true) + domNode.removeEventListener('cut', handleCutEvent, true) + contentChangeSub.dispose() + if (copiedTimer.current) clearTimeout(copiedTimer.current) + } + }, [monacoObjects, isEditorReady]) +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.types.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.types.ts new file mode 100644 index 0000000000..025e89c41c --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.types.ts @@ -0,0 +1,8 @@ +import { Nullable } from 'uiSrc/utils' +import { IEditorMount } from 'uiSrc/pages/workbench/interfaces' + +export interface UseVectorEmbeddingCollapseProps { + monacoObjects: React.RefObject> + /** Editor content; only a change trigger — detection runs off the model. */ + query: string +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.utils.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.utils.ts new file mode 100644 index 0000000000..08c713f24e --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingCollapse.utils.ts @@ -0,0 +1,30 @@ +import { monaco as monacoEditor } from 'react-monaco-editor' + +import { VectorEmbeddingRange } from 'uiSrc/utils' + +export const toMonacoRange = ( + monaco: typeof monacoEditor, + model: monacoEditor.editor.ITextModel, + range: VectorEmbeddingRange, +): monacoEditor.Range => { + const start = model.getPositionAt(range.start) + const end = model.getPositionAt(range.end) + return new monaco.Range( + start.lineNumber, + start.column, + end.lineNumber, + end.column, + ) +} + +export const findAtOffset = ( + items: T[], + offset: number | null, +): T | undefined => { + if (offset !== null) { + return items.find( + (item) => offset >= item.range.start && offset <= item.range.end, + ) + } + return items.length === 1 ? items[0] : undefined +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.ts new file mode 100644 index 0000000000..699b923668 --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.ts @@ -0,0 +1,61 @@ +import { useEffect, useRef } from 'react' +import { monaco as monacoEditor } from 'react-monaco-editor' + +import { useTranslation } from 'uiSrc/i18n' +import { Nullable } from 'uiSrc/utils' + +import { UseVectorEmbeddingDecorationsProps } from './useVectorEmbeddingDecorations.types' + +const EMBEDDING_INLINE_CLASS = 'monaco-vector-embedding' + +/** + * Applies an inline highlight behind every detected embedding. Lazily creates + * the decoration collection after mount and recomputes when the marks change. + */ +export const useVectorEmbeddingDecorations = ({ + monacoObjects, + marks, +}: UseVectorEmbeddingDecorationsProps) => { + const { t } = useTranslation() + const decorationCollection = + useRef>(null) + + useEffect(() => { + if (!monacoObjects.current) return + const { editor, monaco } = monacoObjects.current + + if (!decorationCollection.current) { + decorationCollection.current = editor.createDecorationsCollection() + } + + const model = editor.getModel() + if (!model) return + + const newDecorations = marks.map((mark) => { + const start = model.getPositionAt(mark.range.start) + const end = model.getPositionAt(mark.range.end) + + return { + range: new monaco.Range( + start.lineNumber, + start.column, + end.lineNumber, + end.column, + ), + options: { + inlineClassName: EMBEDDING_INLINE_CLASS, + hoverMessage: { + value: t('query.editor.vectorEmbedding.hover', { + dimensions: mark.dimensions, + byteSize: mark.byteSize, + }), + }, + }, + } + }) + + decorationCollection.current.set(newDecorations) + }, [marks, t]) + + return { decorationCollection } +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.types.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.types.ts new file mode 100644 index 0000000000..e94580ae74 --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingDecorations.types.ts @@ -0,0 +1,8 @@ +import { Nullable, VectorEmbeddingMark } from 'uiSrc/utils' +import { IEditorMount } from 'uiSrc/pages/workbench/interfaces' + +export interface UseVectorEmbeddingDecorationsProps { + monacoObjects: React.RefObject> + /** Marks produced by {@link useVectorEmbeddingMarks}. */ + marks: VectorEmbeddingMark[] +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.ts new file mode 100644 index 0000000000..5f89b2263e --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.ts @@ -0,0 +1,19 @@ +import { useMemo } from 'react' + +import { detectVectorEmbeddings } from 'uiSrc/utils' + +import { + UseVectorEmbeddingMarksProps, + UseVectorEmbeddingMarksReturn, +} from './useVectorEmbeddingMarks.types' + +/** + * Detects large vector embeddings in the query text and exposes them as marks. + * Recomputes on query change. + */ +export const useVectorEmbeddingMarks = ({ + query, +}: UseVectorEmbeddingMarksProps): UseVectorEmbeddingMarksReturn => { + const marks = useMemo(() => detectVectorEmbeddings(query), [query]) + return { marks } +} diff --git a/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.types.ts b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.types.ts new file mode 100644 index 0000000000..f23651bdca --- /dev/null +++ b/redisinsight/ui/src/components/query/hooks/useVectorEmbeddingMarks.types.ts @@ -0,0 +1,11 @@ +import { VectorEmbeddingMark } from 'uiSrc/utils' + +export interface UseVectorEmbeddingMarksProps { + /** Current editor content to scan for embeddings. */ + query: string +} + +export interface UseVectorEmbeddingMarksReturn { + /** All large vector embeddings detected in the query, ordered by position. */ + marks: VectorEmbeddingMark[] +} diff --git a/redisinsight/ui/src/components/query/index.ts b/redisinsight/ui/src/components/query/index.ts index 70ce41b551..e3dcc418d1 100644 --- a/redisinsight/ui/src/components/query/index.ts +++ b/redisinsight/ui/src/components/query/index.ts @@ -12,6 +12,8 @@ export { QueryResults, } +export { VectorEmbeddingHighlight } from './components/vector-embedding-highlight' + export { QueryEditorContextProvider, useQueryEditorContext, @@ -22,6 +24,8 @@ export { useMonacoRedisEditor, useRedisCompletions, useQueryDecorations, + useVectorEmbeddingMarks, + useVectorEmbeddingCollapse, useCommandHistory, useDslSyntax, useQueryEditor, diff --git a/redisinsight/ui/src/components/query/query-actions/QueryActions.tsx b/redisinsight/ui/src/components/query/query-actions/QueryActions.tsx index fb188aeef9..598efc7559 100644 --- a/redisinsight/ui/src/components/query/query-actions/QueryActions.tsx +++ b/redisinsight/ui/src/components/query/query-actions/QueryActions.tsx @@ -1,9 +1,11 @@ import React from 'react' +import { Trans, useTranslation } from 'uiSrc/i18n' import { ResultsMode, RunQueryMode } from 'uiSrc/slices/interfaces' import { KEYBOARD_SHORTCUTS } from 'uiSrc/constants' import { KeyboardShortcut, RiTooltip } from 'uiSrc/components' import { isGroupMode } from 'uiSrc/utils' +import { isMacOs } from 'uiSrc/utils/dom' import { RiIcon } from 'uiSrc/components/base/icons' @@ -24,6 +26,7 @@ export interface Props { } const QueryActions = (props: Props) => { + const { t } = useTranslation() const { isLoading, activeMode, @@ -34,7 +37,14 @@ const QueryActions = (props: Props) => { } = props const KeyBoardTooltipContent = KEYBOARD_SHORTCUTS?.workbench?.runQuery && ( <> - {KEYBOARD_SHORTCUTS.workbench.runQuery?.label}: + + {t( + isMacOs() + ? 'query.runShortcut.label' + : 'query.runShortcut.labelNonMac', + )} + : + { {onChangeMode && ( { data-testid="btn-change-mode" > - Raw mode + {t('query.actions.rawMode.label')} )} @@ -66,12 +76,10 @@ const QueryActions = (props: Props) => { - Groups the command results into a single window. -
- When grouped, the results can be visualized only in the text - format. - + }} + /> } data-testid="group-results-tooltip" > @@ -82,18 +90,14 @@ const QueryActions = (props: Props) => { data-testid="btn-change-group-mode" > - Group results + {t('query.actions.groupMode.label')}
)} diff --git a/redisinsight/ui/src/components/query/query-card/QueryCard.spec.tsx b/redisinsight/ui/src/components/query/query-card/QueryCard.spec.tsx index ed4ee17fa0..fd3dfeac2c 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCard.spec.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCard.spec.tsx @@ -138,7 +138,7 @@ describe('QueryCard', () => { it('Should return correct summary string', () => { const summary = { total: 2, success: 1, fail: 1 } - const summaryText = '2 Command(s) - 1 success, 1 error(s)' + const summaryText = '2 Commands - 1 success, 1 error' const summaryString = getSummaryText(summary) diff --git a/redisinsight/ui/src/components/query/query-card/QueryCard.tsx b/redisinsight/ui/src/components/query/query-card/QueryCard.tsx index 73d18b8b52..0461319709 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCard.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCard.tsx @@ -3,6 +3,7 @@ import { useAppSelector } from 'uiSrc/slices/hooks' import cx from 'classnames' import { useParams } from 'react-router-dom' import { isNull } from 'lodash' +import i18n from 'uiSrc/i18n' import { KeyboardKeys as keys } from 'uiSrc/constants/keys' import { LoadingContent } from 'uiSrc/components/base/layout' @@ -112,9 +113,12 @@ export const getSummaryText = ( ) => { if (summary) { const { total, success, fail } = summary - const summaryText = `${total} Command(s) - ${success} success` + const summaryText = i18n.t('query.card.summary.commands', { + count: total, + success, + }) if (!isSilentModeWithoutError(mode, summary?.fail)) { - return `${summaryText}, ${fail} error(s)` + return `${summaryText}${i18n.t('query.card.summary.errors', { count: fail })}` } return summaryText } diff --git a/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.spec.tsx b/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.spec.tsx index 089ff006e2..cd1d05bb6e 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.spec.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.spec.tsx @@ -87,4 +87,58 @@ describe('QueryCardCliGroupResult', () => { expect(errorBtn).not.toBeInTheDocument() expect(screen.getByText('(nil)')).toBeInTheDocument() }) + + it('should not show ModuleNotLoaded for successful TS.RANGE in group mode', () => { + // Double cast: group-mode nests execution-like objects under response, but + // CommandExecutionResult.response is typed as string. Same shape as the + // other fixtures in this file; unknown avoids a new TS2352 baseline bump. + const mockResult = [ + { + response: [ + { + id: 'id', + command: 'TS.RANGE ts:prices - +', + response: [[1784245557285, '100']], + status: CommandExecutionStatus.Success, + }, + ], + status: CommandExecutionStatus.Success, + }, + ] as unknown as Props['result'] + render( + , + ) + + expect( + screen.queryByTestId('module-not-loaded-content'), + ).not.toBeInTheDocument() + expect(screen.getByText(/TS\.RANGE ts:prices/)).toBeInTheDocument() + }) + + it('should show ModuleNotLoaded for failed TS.RANGE in group mode', () => { + const mockResult = [ + { + response: [ + { + id: 'id', + command: 'TS.RANGE ts:prices - +', + response: 'ERR unknown command', + status: CommandExecutionStatus.Fail, + }, + ], + status: CommandExecutionStatus.Fail, + }, + ] as unknown as Props['result'] + render( + , + ) + + expect(screen.getByTestId('module-not-loaded-content')).toBeInTheDocument() + }) }) diff --git a/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.tsx b/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.tsx index f2d1173600..56d5f10017 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCardCliGroupResult/QueryCardCliGroupResult.tsx @@ -28,11 +28,7 @@ const QueryCardCliGroupResult = (props: Props) => { isFullScreen={isFullScreen} items={flatten( result?.[0]?.response.map((item: any) => { - const commonError = CommonErrorResponse( - item.id, - item.command, - item.response, - ) + const commonError = CommonErrorResponse(item.id, item.command, item) if (React.isValidElement(commonError) && !isNull(item.response)) { return [wbSummaryCommand(item.command), commonError] } diff --git a/redisinsight/ui/src/components/query/query-card/QueryCardCliResultWrapper/QueryCardCliResultWrapper.tsx b/redisinsight/ui/src/components/query/query-card/QueryCardCliResultWrapper/QueryCardCliResultWrapper.tsx index 7c4639f26f..b32177281c 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCardCliResultWrapper/QueryCardCliResultWrapper.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCardCliResultWrapper/QueryCardCliResultWrapper.tsx @@ -2,6 +2,7 @@ import React, { useMemo } from 'react' import cx from 'classnames' import { isArray } from 'lodash' +import { useTranslation } from 'uiSrc/i18n' import { LoadingContent } from 'uiSrc/components/base/layout' import { CommandExecutionResult } from 'uiSrc/slices/interfaces' import { ResultsMode } from 'uiSrc/slices/interfaces/workbench' @@ -75,6 +76,7 @@ export const getResultText = ( } const QueryCardCliResultWrapper = (props: Props) => { + const { t } = useTranslation() const { result = [], query, @@ -99,16 +101,15 @@ const QueryCardCliResultWrapper = (props: Props) => { <>
{isNotStored && ( - The result is too big to be saved. It will be deleted after the - application is closed. + {t('query.cliResult.tooBig')} )} {isGroupResults(resultsMode) && isArray(result[0]?.response) ? ( diff --git a/redisinsight/ui/src/components/query/query-card/QueryCardCommonResult/components/CommonErrorResponse/CommonErrorResponse.tsx b/redisinsight/ui/src/components/query/query-card/QueryCardCommonResult/components/CommonErrorResponse/CommonErrorResponse.tsx index 198b826504..3c93079802 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCardCommonResult/components/CommonErrorResponse/CommonErrorResponse.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCardCommonResult/components/CommonErrorResponse/CommonErrorResponse.tsx @@ -91,7 +91,17 @@ const CommonErrorResponse = (id: string, command = '', result?: any) => { CommandExecutionStatus.Fail, ) } - const unsupportedModule = checkUnsupportedModuleCommand(modules, commandLine) + + const isSuccessfulResult = Array.isArray(result) + ? result.some((item) => item?.status === CommandExecutionStatus.Success) + : result?.status === CommandExecutionStatus.Success + + // Skip ModuleNotLoaded when any reply already succeeded; under ACL, modules + // may be unknown even when the command ran. Callers must pass + // CommandExecutionResult[] (including group mode), not the raw Redis reply. + const unsupportedModule = !isSuccessfulResult + ? checkUnsupportedModuleCommand(modules, commandLine) + : undefined if (unsupportedModule) { return diff --git a/redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx b/redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx index 5d902cf8c5..b7d0eb0916 100644 --- a/redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx +++ b/redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx @@ -1,4 +1,6 @@ import React, { useContext } from 'react' + +import { useTranslation } from 'uiSrc/i18n' import cx from 'classnames' import { useAppSelector } from 'uiSrc/slices/hooks' import { useParams } from 'react-router-dom' @@ -99,6 +101,7 @@ const getTruncatedExecutionTimeString = (value: number): string => { } const QueryCardHeader = (props: Props) => { + const { t } = useTranslation() const { isOpen, toggleOpen, @@ -339,7 +342,7 @@ const QueryCardHeader = (props: Props) => { { > {isNumber(executionTime) && ( { )} - + @@ -465,14 +471,14 @@ const QueryCardHeader = (props: Props) => { {!isFullScreen && ( @@ -484,7 +490,7 @@ const QueryCardHeader = (props: Props) => { {!isSilentModeWithoutError(resultsMode, summary?.fail) && ( )} @@ -500,19 +506,19 @@ const QueryCardHeader = (props: Props) => { {isGroupMode(resultsMode) && ( - Group mode + {t('query.card.mode.group')} )} {isSilentMode(resultsMode) && ( - Silent mode + {t('query.card.mode.silent')} )} {isRawMode(mode) && ( - Raw mode + {t('query.card.mode.raw')} )} @@ -522,7 +528,7 @@ const QueryCardHeader = (props: Props) => { > diff --git a/redisinsight/ui/src/components/query/query-lite-actions/QueryLiteActions.tsx b/redisinsight/ui/src/components/query/query-lite-actions/QueryLiteActions.tsx index 2741f434c3..17e212cb24 100644 --- a/redisinsight/ui/src/components/query/query-lite-actions/QueryLiteActions.tsx +++ b/redisinsight/ui/src/components/query/query-lite-actions/QueryLiteActions.tsx @@ -1,7 +1,9 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { KEYBOARD_SHORTCUTS } from 'uiSrc/constants' import { KeyboardShortcut, RiTooltip } from 'uiSrc/components' +import { isMacOs } from 'uiSrc/utils/dom' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' @@ -15,10 +17,18 @@ export interface Props { } const QueryLiteActions = (props: Props) => { + const { t } = useTranslation() const { isLoading, onSubmit, onClear } = props const KeyBoardTooltipContent = KEYBOARD_SHORTCUTS?.workbench?.runQuery && ( <> - {KEYBOARD_SHORTCUTS.workbench.runQuery?.label}: + + {t( + isMacOs() + ? 'query.runShortcut.label' + : 'query.runShortcut.labelNonMac', + )} + : + { position="right" content={ isLoading - ? 'Please wait while the commands are being executed…' - : 'Clear query' + ? t('query.executing') + : t('query.liteActions.clear.tooltip') } data-testid="clear-query-tooltip" > @@ -42,20 +52,16 @@ const QueryLiteActions = (props: Props) => { onClick={onClear} loading={isLoading} disabled={isLoading} - aria-label="clear" + aria-label={t('query.liteActions.clear.aria')} data-testid="btn-clear" > - Clear + {t('query.liteActions.clear.label')} diff --git a/redisinsight/ui/src/components/query/query-results/QueryResults.tsx b/redisinsight/ui/src/components/query/query-results/QueryResults.tsx index 20b8b4c616..194960b3dc 100644 --- a/redisinsight/ui/src/components/query/query-results/QueryResults.tsx +++ b/redisinsight/ui/src/components/query/query-results/QueryResults.tsx @@ -1,5 +1,6 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { CodeButtonParams } from 'uiSrc/constants' import { ProfileQueryType } from 'uiSrc/pages/workbench/constants' import { generateProfileQueryForCommand } from 'uiSrc/pages/workbench/utils/profile' @@ -39,6 +40,7 @@ export interface QueryResultsProps { } const QueryResults = (props: QueryResultsProps) => { + const { t } = useTranslation() const { isResultsLoaded, items = [], @@ -91,7 +93,7 @@ const QueryResults = (props: QueryResultsProps) => { disabled={clearing || processing} data-testid="clear-history-btn" > - Clear Results + {t('query.results.clear')} )} diff --git a/redisinsight/ui/src/components/query/query-tutorials/QueryTutorials.tsx b/redisinsight/ui/src/components/query/query-tutorials/QueryTutorials.tsx index 3ee1fbeceb..f229d9bcd9 100644 --- a/redisinsight/ui/src/components/query/query-tutorials/QueryTutorials.tsx +++ b/redisinsight/ui/src/components/query/query-tutorials/QueryTutorials.tsx @@ -1,5 +1,6 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { useAppDispatch } from 'uiSrc/slices/hooks' import { useHistory, useParams } from 'react-router-dom' import styled from 'styled-components' @@ -47,6 +48,7 @@ const QueryTutorialsButton = styled(EmptyButton)` ` const QueryTutorials = ({ tutorials, source }: Props) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const history = useHistory() const { instanceId } = useParams<{ instanceId: string }>() @@ -67,7 +69,7 @@ const QueryTutorials = ({ tutorials, source }: Props) => { return (
- Tutorials: + {t('query.tutorials.title')} {tutorials.map(({ id, title }) => ( , - name: 'Code Changes', + nameKey: 'tips.badge.codeChanges', }, { id: 'configuration_changes', icon: , - name: 'Configuration Changes', + nameKey: 'tips.badge.configurationChanges', }, { id: 'upgrade', icon: , - name: 'Upgrade', + nameKey: 'tips.badge.upgrade', }, -] +] as const diff --git a/redisinsight/ui/src/components/recommendation/content-element/ContentElement.tsx b/redisinsight/ui/src/components/recommendation/content-element/ContentElement.tsx index 19b2ab4093..d896540e3e 100644 --- a/redisinsight/ui/src/components/recommendation/content-element/ContentElement.tsx +++ b/redisinsight/ui/src/components/recommendation/content-element/ContentElement.tsx @@ -1,6 +1,7 @@ import React from 'react' import { isArray, isString } from 'lodash' import cx from 'classnames' +import { useTranslation } from 'uiSrc/i18n' import { OAuthSsoHandlerDialog, OAuthConnectFreeDb } from 'uiSrc/components' import { getUtmExternalLink } from 'uiSrc/utils/links' import { replaceVariables } from 'uiSrc/utils/recommendation' @@ -33,6 +34,7 @@ const ContentElement = (props: Props) => { insights, idx, } = props + const { t } = useTranslation() const { type, value, parameter } = content const replacedValue = replaceVariables(value, parameter, params) @@ -187,7 +189,7 @@ const ContentElement = (props: Props) => { /> ) default: - return isString(value) ? <>{value} : *Unknown format* + return isString(value) ? <>{value} : {t('tips.unknownFormat')} } } diff --git a/redisinsight/ui/src/components/recommendation/recommendation-badges-legend/RecommendationBadgesLegend.tsx b/redisinsight/ui/src/components/recommendation/recommendation-badges-legend/RecommendationBadgesLegend.tsx index 5e2240c161..a5e945ea10 100644 --- a/redisinsight/ui/src/components/recommendation/recommendation-badges-legend/RecommendationBadgesLegend.tsx +++ b/redisinsight/ui/src/components/recommendation/recommendation-badges-legend/RecommendationBadgesLegend.tsx @@ -1,24 +1,29 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { badgesContent } from '../constants' import styles from '../styles.module.scss' -const RecommendationBadgesLegend = () => ( - - {badgesContent.map(({ id, icon, name }) => ( - -
- {icon} - {name} -
-
- ))} -
-) +const RecommendationBadgesLegend = () => { + const { t } = useTranslation() + + return ( + + {badgesContent.map(({ id, icon, nameKey }) => ( + +
+ {icon} + {t(nameKey)} +
+
+ ))} +
+ ) +} export default RecommendationBadgesLegend diff --git a/redisinsight/ui/src/components/recommendation/recommendation-badges/RecommendationBadges.tsx b/redisinsight/ui/src/components/recommendation/recommendation-badges/RecommendationBadges.tsx index 292b4bd61f..3f7013dfe7 100644 --- a/redisinsight/ui/src/components/recommendation/recommendation-badges/RecommendationBadges.tsx +++ b/redisinsight/ui/src/components/recommendation/recommendation-badges/RecommendationBadges.tsx @@ -1,5 +1,6 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { Row } from 'uiSrc/components/base/layout/flex' import BadgeIcon from '../badge-icon' import { badgesContent } from '../constants' @@ -8,15 +9,19 @@ export interface Props { badges?: string[] } -const RecommendationBadges = ({ badges = [] }: Props) => ( - - {badgesContent.map( - ({ id, name, icon }) => - badges.includes(id) && ( - - ), - )} - -) +const RecommendationBadges = ({ badges = [] }: Props) => { + const { t } = useTranslation() + + return ( + + {badgesContent.map( + ({ id, nameKey, icon }) => + badges.includes(id) && ( + + ), + )} + + ) +} export default RecommendationBadges diff --git a/redisinsight/ui/src/components/recommendation/recommendation-copy-component/RecommendationCopyComponent.tsx b/redisinsight/ui/src/components/recommendation/recommendation-copy-component/RecommendationCopyComponent.tsx index ea9e22192e..59cf18d396 100644 --- a/redisinsight/ui/src/components/recommendation/recommendation-copy-component/RecommendationCopyComponent.tsx +++ b/redisinsight/ui/src/components/recommendation/recommendation-copy-component/RecommendationCopyComponent.tsx @@ -2,6 +2,7 @@ import React from 'react' import { useParams } from 'react-router-dom' import styled from 'styled-components' +import { useTranslation } from 'uiSrc/i18n' import { bufferToString } from 'uiSrc/utils' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' @@ -51,6 +52,7 @@ const RecommendationCopyComponent = ({ telemetryEvent, provider, }: IProps) => { + const { t } = useTranslation() const { instanceId = '' } = useParams<{ instanceId: string }>() const formattedName = bufferToString(keyName) @@ -70,7 +72,7 @@ const RecommendationCopyComponent = ({ return ( - Example of a key that may be relevant: + {t('tips.copyKey.label')} diff --git a/redisinsight/ui/src/components/recommendation/recommendation-voting/RecommendationVoting.tsx b/redisinsight/ui/src/components/recommendation/recommendation-voting/RecommendationVoting.tsx index 2042d07225..0ec49c44b9 100644 --- a/redisinsight/ui/src/components/recommendation/recommendation-voting/RecommendationVoting.tsx +++ b/redisinsight/ui/src/components/recommendation/recommendation-voting/RecommendationVoting.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' import cx from 'classnames' +import { useTranslation } from 'uiSrc/i18n' import { userSettingsConfigSelector } from 'uiSrc/slices/user/user-settings' import { Vote } from 'uiSrc/constants/recommendations' import { Nullable } from 'uiSrc/utils' @@ -25,6 +26,7 @@ const RecommendationVoting = ({ live = false, containerClass = '', }: Props) => { + const { t } = useTranslation() const config = useAppSelector(userSettingsConfigSelector) const [popover, setPopover] = useState('') @@ -35,7 +37,7 @@ const RecommendationVoting = ({ gap={live ? 'none' : 'l'} data-testid="recommendation-voting" > - Is this useful? + {t('tips.voting.question')}
{Object.values(Vote).map((option) => ( { name, } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const { id: instanceId = '', provider } = useAppSelector( connectedInstanceSelector, @@ -120,8 +122,12 @@ const VoteOption = (props: Props) => { const getTooltipContent = (voteOption: Vote) => isAnalyticsEnable - ? voteTooltip[voteOption] - : 'Enable Analytics on the Settings page to vote for a tip' + ? t( + voteOption === Vote.Like + ? 'tips.voting.useful' + : 'tips.voting.notUseful', + ) + : t('tips.voting.disabledTooltip') return ( { disabled={!isAnalyticsEnable} icon={iconType[voteOption] ?? 'LikeIcon'} className={cx('vote__btn', { selected: vote === voteOption })} - aria-label="vote useful" + aria-label={t('tips.voting.voteUsefulAria')} data-testid={`${voteOption}-vote-btn`} onClick={() => handleClick(name)} /> @@ -160,10 +166,14 @@ const VoteOption = (props: Props) => {
- Thank you for the feedback. + {t('tips.voting.thanks')} - {getVotedText(voteOption)} + {t( + voteOption === Vote.Like + ? 'tips.voting.likeFollowUp' + : 'tips.voting.dislikeFollowUp', + )}
@@ -171,7 +181,7 @@ const VoteOption = (props: Props) => { setPopover('')} @@ -189,12 +199,12 @@ const VoteOption = (props: Props) => { > - To Github + {t('tips.voting.githubLink')} diff --git a/redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/utils.ts b/redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/utils.ts index f2d4db20b5..9badc7e0a3 100644 --- a/redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/utils.ts +++ b/redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/utils.ts @@ -1,17 +1,6 @@ import { Vote } from 'uiSrc/constants/recommendations' -import { Nullable } from 'uiSrc/utils' import { DislikeIcon, LikeIcon } from 'uiSrc/components/base/icons' -export const getVotedText = (vote: Nullable) => - vote === Vote.Like - ? 'Share your ideas with us.' - : 'Tell us how we can improve.' - -export const voteTooltip = Object.freeze({ - [Vote.Like]: 'Useful', - [Vote.Dislike]: 'Not Useful', -}) - export const iconType = { [Vote.Like]: LikeIcon, [Vote.Dislike]: DislikeIcon, diff --git a/redisinsight/ui/src/components/scan-more/ScanMore.tsx b/redisinsight/ui/src/components/scan-more/ScanMore.tsx index 07a7e31770..9d742ce98d 100644 --- a/redisinsight/ui/src/components/scan-more/ScanMore.tsx +++ b/redisinsight/ui/src/components/scan-more/ScanMore.tsx @@ -8,6 +8,7 @@ import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { TextButton } from '@redis-ui/components' import { Text } from 'uiSrc/components/base/text' import { Theme } from 'uiSrc/components/base/theme/types' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -23,9 +24,6 @@ export interface Props { loadMoreItems?: (config: any) => void } -const WARNING_MESSAGE = - 'Scanning additional keys may decrease performance and memory available.' - const ScanMoreButton = styled(TextButton)` color: ${({ theme }: { theme: Theme }) => theme.semantic.color.text.primary400} !important; @@ -39,32 +37,35 @@ const ScanMore = ({ loading, loadMoreItems, nextCursor, -}: Props) => ( - <> - {(scanned || isNull(totalItemsCount)) && nextCursor !== '0' && ( - - loadMoreItems?.({ - stopIndex: SCAN_COUNT_DEFAULT - 1, - startIndex: 0, - }) - } - data-testid="scan-more" - > - Scan more - {withAlert && ( - - - - )} - - )} - -) +}: Props) => { + const { t } = useTranslation() + return ( + <> + {(scanned || isNull(totalItemsCount)) && nextCursor !== '0' && ( + + loadMoreItems?.({ + stopIndex: SCAN_COUNT_DEFAULT - 1, + startIndex: 0, + }) + } + data-testid="scan-more" + > + {t('browser.scanMore.button')} + {withAlert && ( + + + + )} + + )} + + ) +} export default ScanMore diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/ExpertChat.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/ExpertChat.tsx index 5dbe9ced91..64a55b9e4b 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/ExpertChat.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/ExpertChat.tsx @@ -198,16 +198,16 @@ const ExpertChat = () => { return { title: 'Open a database', content: - 'Open your Redis database with Redis Query Engine, or create a new database to get started.', + 'Open your Redis database with Redis Search, or create a new database to get started.', } } if (!isRedisearchAvailable(modules)) { return { - title: 'Redis Query Engine capability is not available', + title: 'Redis Search capability is not available', content: freeInstances?.length ? 'Use your free all-in-one Redis Cloud database to start exploring these capabilities.' - : 'Create a free Redis Cloud database with Redis Query Engine capability that extends the core capabilities of open-source Redis.', + : 'Create a free Redis Cloud database with Redis Search capability that extends the core capabilities of open-source Redis.', icon: , } } diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.spec.tsx index ed27a9b328..38d0505abe 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.spec.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { render, act, screen } from 'uiSrc/utils/test-utils' +import { render, screen } from 'uiSrc/utils/test-utils' import MarkdownMessage from './MarkdownMessage' @@ -8,11 +8,113 @@ describe('MarkdownMessage', () => { expect(render(1)).toBeTruthy() }) - it('should render 2', async () => { - await act(() => { - render(1) + it('should render plain markdown content', () => { + render(Hello **world**) + + expect(screen.getByText(/world/i)).toBeInTheDocument() + }) + + it('should render a redis code fence via the chat code block', async () => { + render({'```redis\nGET foo\n```'}) + + // CodeButtonBlock resolves Monaco syntax highlighting asynchronously + // even for its initial render; await it so the microtask settles inside + // `act` instead of leaking past this test. + expect( + await screen.findByTestId('code-button-block-content'), + ).toHaveTextContent('GET foo') + }) + + it('should render a language-less code fence via the chat code block', async () => { + render({'```\nGET foo\n```'}) + + // Copilot passes allLangs to MarkdownRenderer so fences without a + // language still render as an interactive chat code block (copy/run) + // instead of a plain
.
+    expect(
+      await screen.findByTestId('code-button-block-content'),
+    ).toHaveTextContent('GET foo')
+  })
+
+  it('should call onMessageRendered on mount when there is content', () => {
+    const onMessageRendered = jest.fn()
+
+    render(
+      
+        Hello
+      ,
+    )
+
+    expect(onMessageRendered).toHaveBeenCalledTimes(1)
+  })
+
+  it('should not call onMessageRendered when content is empty', () => {
+    const onMessageRendered = jest.fn()
+
+    render(
+      
+        {''}
+      ,
+    )
+
+    expect(onMessageRendered).not.toHaveBeenCalled()
+  })
+
+  it('should not re-fire onMessageRendered when only the callback reference changes', () => {
+    const first = jest.fn()
+    const { rerender } = render(
+      Hello,
+    )
+    expect(first).toHaveBeenCalledTimes(1)
+
+    const second = jest.fn()
+    rerender(
+      Hello,
+    )
+
+    // Same message content, only the callback identity changed: no re-fire.
+    expect(second).not.toHaveBeenCalled()
+    expect(first).toHaveBeenCalledTimes(1)
+  })
+
+  describe('security', () => {
+    // RED-194228 / VDP-4596: message content can be influenced by untrusted
+    // data (indirect prompt injection). MarkdownRenderer renders without
+    // rehype-raw, so raw HTML in the source shows as literal text instead of
+    // being parsed into live elements — nothing can execute or beacon out.
+    it('should render raw HTML as literal text, not as elements', () => {
+      render({'

{alert(1)}

'}
) + + expect( + screen.getByText('

{alert(1)}

', { exact: false }), + ).toBeInTheDocument() + expect(document.querySelector('script')).toBeNull() + }) + + it('should not render tags from AI content', () => { + const { container } = render( + + {'A bike. '} + , + ) + + expect(screen.getByText(/A bike\./)).toBeInTheDocument() + expect(container.querySelector('img')).toBeNull() }) - screen.debug(undefined, 100_000) + // Copilot content never contains images, and markdown image syntax + // (unlike raw HTML) reaches MarkdownRenderer's own `img` handler, which + // renders a live by default — a crafted `![](https://attacker/?...)` + // would fire an outbound GET on load and exfiltrate data. + it('should not render an for markdown image syntax', () => { + render( + + {'![leak](https://attacker.example/x.png)'} + , + ) + + expect(document.querySelector('img')).toBeNull() + expect(screen.queryByRole('img')).toBeNull() + }) }) }) diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.tsx index 1bdc8aaf48..7d58021f36 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/MarkdownMessage.tsx @@ -1,13 +1,15 @@ -import React, { useCallback, useEffect, useState } from 'react' -import JsxParser from 'react-jsx-parser' -import MarkdownToJsxString from 'uiSrc/services/formatter/MarkdownToJsxString' +import React, { useCallback, useEffect, useMemo } from 'react' import { CloudLink } from 'uiSrc/components/markdown' +import { MarkdownRenderer } from 'uiSrc/components/markdown/MarkdownRenderer' import { AdditionalRedisModule } from 'apiClient' import { ChatExternalLink, CodeBlock } from './components' +// Matches the leaf shape MarkdownRenderer passes for its `RedisCode`/ +// `CodeBlock` nodes; `label`/`params`/`path` are part of that shape too but +// unused here, since Copilot chat only needs the code text and its language. export interface CodeProps { children: string - lang: string + lang?: string } export interface Props { @@ -17,59 +19,64 @@ export interface Props { onMessageRendered?: () => void } +// Renders nothing for both markdown image syntax (`![]()`) and any raw +// `` MarkdownRenderer's default `img` handler would otherwise emit. +const NoImage = () => null + +/** + * Copilot answers are plain markdown (text, tables, code, links). They never + * contain images or embedded media, and message content can be influenced by + * untrusted data (e.g. indirect prompt injection via values stored in the + * database), so images must never render: an `` + * (from raw HTML or from markdown image syntax) would otherwise fire an + * outbound request as soon as the browser loads it, silently exfiltrating + * data. Raw HTML is already inert because MarkdownRenderer never parses it + * into live elements (no rehype-raw); the `Image` leaf below closes the + * remaining gap for markdown-syntax images, which MarkdownRenderer renders as + * a live `` by default when no `Image` leaf is supplied. See + * RED-194228 / VDP-4596. + */ const MarkdownMessage = (props: Props) => { const { modules, children, onMessageRendered, onRunCommand } = props - const [content, setContent] = useState('') - const [parseAsIs, setParseAsIs] = useState(false) - const ChatCodeBlock = useCallback( - (codeProps: CodeProps) => ( - + ({ lang, children: code }: CodeProps) => ( + + {code} + ), - [modules], + [modules, onRunCommand], ) - const components: any = { - Code: ChatCodeBlock, - CloudLink, - Link: ChatExternalLink, - } - - useEffect(() => { - const formatContent = async () => { - try { - const formated = await new MarkdownToJsxString().format({ - data: children, - codeOptions: { allLangs: true }, - }) - setContent(formated) - } catch { - setParseAsIs(true) - } - } - formatContent() - }, [children]) + // ChatCodeBlock in deps transitively covers modules/onRunCommand; the + // other leaves are stable module-level, so this only changes when + // ChatCodeBlock does. Keeps MarkdownRenderer's own [components, path] + // memoization from being defeated by a fresh object every render. + const components = useMemo( + () => ({ + RedisCode: ChatCodeBlock, + CodeBlock: ChatCodeBlock, + CloudLink, + ExternalLink: ChatExternalLink, + Image: NoImage, + }), + [ChatCodeBlock], + ) + // Fire once per message content, keyed on `children` only: including + // onMessageRendered would re-run this whenever the parent passes a new + // callback reference, causing repeated scroll-to-bottom for the same message. useEffect(() => { - if (content) { + if (children) { onMessageRendered?.() } - }, [content]) - - if (parseAsIs) { - return <>{children} - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [children]) return ( - // @ts-ignore - setParseAsIs(true)} - /> + + {children} + ) } diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.spec.tsx index ebd39c7775..a8227d3227 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.spec.tsx @@ -7,7 +7,7 @@ import { cleanup, mockedStore, } from 'uiSrc/utils/test-utils' -import { ButtonLang } from 'uiSrc/utils/formatters/markdown/remarkCode' +import { ButtonLang } from 'uiSrc/utils/formatters/markdown/buttonLang' import { sendWBCommand } from 'uiSrc/slices/workbench/wb-results' import { setDbIndexState } from 'uiSrc/slices/app/context' diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.tsx index 5b2c835c0b..fef3cf399b 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/markdown-message/components/code-block/CodeBlock.tsx @@ -3,7 +3,7 @@ import { useAppDispatch } from 'uiSrc/slices/hooks' import { CodeButtonParams } from 'uiSrc/constants' import { sendWbQueryAction } from 'uiSrc/slices/workbench/wb-results' import { CodeButtonBlock } from 'uiSrc/components/markdown' -import { ButtonLang } from 'uiSrc/utils/formatters/markdown/remarkCode' +import { ButtonLang } from 'uiSrc/utils/formatters/markdown/buttonLang' import { AdditionalRedisModule } from 'apiClient' export interface Props { diff --git a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Code/Code.tsx b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Code/Code.tsx index b52996f8f6..5871cb2629 100644 --- a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Code/Code.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Code/Code.tsx @@ -16,9 +16,9 @@ import CodeButtonBlock from 'uiSrc/components/markdown/CodeButtonBlock' import { getFileInfo, getTutorialSection } from '../../utils' export interface Props { - label: string + label?: string children: string - lang: string + lang?: string params?: string path?: string } diff --git a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.spec.tsx index 6a5117bf3f..a7f5f23470 100644 --- a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.spec.tsx @@ -1,6 +1,6 @@ import React from 'react' import { instance, mock } from 'ts-mockito' -import { fireEvent, render } from 'uiSrc/utils/test-utils' +import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry' import { isShowCapabilityTutorialPopover, @@ -79,23 +79,50 @@ describe('InternalPage', () => { expect(onClose).toBeCalled() }) - it('should parse and render JSX string', () => { - const content = '

Header

' - const { queryByTestId } = render( - , + it('should render a redis code fence and a relative link as markdown', () => { + const content = '```redis Run me\nGET k\n```\n\n[Doc](./doc.md)' + render( + , ) - expect(queryByTestId('header')).toBeInTheDocument() - }) - it('should strip lowercase tags from content', () => { - const content = - '

safe

' - const { queryByTestId, container } = render( - , + expect(screen.getByTestId('code-button-block-label')).toHaveTextContent( + 'Run me', ) + expect(screen.getByRole('link', { name: 'Doc' })).toBeInTheDocument() + }) + it('should render a non-redis fence as plain code with no Run button, alongside a redis fence with one', () => { + const content = '```redis Run me\nGET k\n```\n\n```bash\nls -la\n```' + render() + + expect(screen.getByTestId('run-btn-Run me')).toBeInTheDocument() + expect(screen.getByText('ls -la')).toBeInTheDocument() + // Only the redis fence above is interactive; the bash fence must not + // render a second copy/run block. + expect(screen.getAllByTestId('code-button-block-content')).toHaveLength(1) + }) + + it('should render an external link with inline/small styling props', () => { + const content = '[Redis Docs](https://redis.io/docs)' + render() + + const link = screen.getByRole('link', { name: /Redis Docs/ }) + expect(link).toHaveAttribute('href', 'https://redis.io/docs') + // The base Link already adds target/rel for any href; this only checks + // the visual props (external/inline/small) applied by InternalPage's + // ExternalLink leaf, matching the old remarkLink styling. + expect(link).toHaveAttribute('target', '_blank') + }) + + it('should render raw HTML in content as literal text and inject no script', () => { + const content = '

{alert(1)}

' + render() - expect(queryByTestId('safe')).toBeInTheDocument() - expect(container.querySelector('link')).not.toBeInTheDocument() + expect(screen.getByText(content, { exact: false })).toBeInTheDocument() + expect(document.querySelector('script')).toBeNull() }) describe('capability', () => { diff --git a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx index a84f0080e9..660a998ed3 100644 --- a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx @@ -1,5 +1,10 @@ -import React, { useMemo, useRef, useEffect, useState } from 'react' -import JsxParser from 'react-jsx-parser' +import React, { + useRef, + useEffect, + useMemo, + useState, + type ReactNode, +} from 'react' import cx from 'classnames' import { debounce } from 'lodash' import { useLocation, useParams } from 'react-router-dom' @@ -29,6 +34,10 @@ import { CloudLink, RedisInsightLink, } from 'uiSrc/components/markdown' +import { + MarkdownRenderer, + MarkdownLeafComponents, +} from 'uiSrc/components/markdown/MarkdownRenderer' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' import { Text } from 'uiSrc/components/base/text' import { getTutorialSection } from '../../utils' @@ -36,10 +45,21 @@ import { EmptyPrompt, Pagination, Code } from '..' import styles from './styles.module.scss' -// Case-sensitive strip of HTML elements to prevent external resource loading -// while preserving PascalCase React components used by tutorials. -// JsxParser's blacklistedTags is case-insensitive, so we handle separately. -const LOWERCASE_LINK_TAG = /]*\/?>|<\/link\s*>/g +// External link leaf rendered for absolute-path markdown links. Defined at +// module scope (not per render) so its function identity is stable across +// re-renders and react-markdown doesn't remount the link's DOM node on every +// scroll/popover update. The base Link already adds target/rel on its own. +const TutorialExternalLink = ({ + href, + children, +}: { + href: string + children?: ReactNode +}) => ( + + {children} + +) export interface Props { onClose: () => void @@ -73,14 +93,23 @@ const InternalPage = (props: Props) => { manifestPath, sourcePath, } = props - const components: any = { - Image, - Code, - RedisUploadButton, - CloudLink, - RedisInsightLink, - Link, - } + // Defined per render (not at module scope) because Code is re-exported + // through the components barrel that InternalPage itself is part of; + // capturing it at module-eval time would see it as undefined mid-cycle. + // Memoized with no deps: every value below is a stable module-level + // import, so the object identity stays stable across re-renders and + // MarkdownRenderer/ReactMarkdown don't re-render the whole tutorial tree. + const markdownComponents: Partial = useMemo( + () => ({ + RedisCode: Code, + RedisUpload: RedisUploadButton, + ExternalLink: TutorialExternalLink, + CloudLink, + RedisInsightLink, + Image, + }), + [], + ) const containerRef = useRef(null) const { instanceId = '' } = useParams<{ instanceId: string }>() const { source } = useAppSelector(appContextCapability) @@ -153,48 +182,6 @@ const InternalPage = (props: Props) => { } }, [isLoading, location]) - const sanitizedContent = useMemo( - () => content?.replace(LOWERCASE_LINK_TAG, '') ?? '', - [content], - ) - - const contentComponent = useMemo( - () => ( - // @ts-ignore - console.error(e)} - /> - ), - [sanitizedContent], - ) - return (
@@ -254,7 +241,11 @@ const InternalPage = (props: Props) => { /> )} {!isLoading && error && } - {!isLoading && !error && contentComponent} + {!isLoading && !error && ( + + {content ?? ''} + + )}
{!!pagination?.length && ( <> diff --git a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.spec.tsx index bb39dab244..4e8ae4ddb7 100644 --- a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.spec.tsx @@ -1,7 +1,9 @@ import { cloneDeep } from 'lodash' import React from 'react' import { instance, mock } from 'ts-mockito' -import { cleanup, mockedStore, render } from 'uiSrc/utils/test-utils' +import { cleanup, mockedStore, render, waitFor } from 'uiSrc/utils/test-utils' +import { resourcesService } from 'uiSrc/services' +import InternalPage from '../InternalPage' import LazyInternalPage, { Props } from './LazyInternalPage' const mockedProps = mock() @@ -19,15 +21,59 @@ jest.mock('uiSrc/services', () => ({ set: jest.fn(), get: jest.fn(), }, + resourcesService: { + get: jest.fn(), + }, +})) + +jest.mock('../InternalPage', () => ({ + __esModule: true, + default: jest.fn(() => null), })) +const mockedResourcesGet = resourcesService.get as jest.Mock +const mockedInternalPage = InternalPage as unknown as jest.Mock + /** * LazyInternalPage tests * * @group component */ describe('LazyInternalPage', () => { - it('should render', () => { - expect(render()).toBeTruthy() + beforeEach(() => { + mockedResourcesGet.mockReset() + mockedInternalPage.mockClear() + }) + + it('should render', async () => { + mockedResourcesGet.mockResolvedValue({ status: 200, data: '' }) + + const { container } = render( + , + ) + expect(container).toBeTruthy() + + await waitFor(() => { + expect(mockedResourcesGet).toHaveBeenCalled() + }) + }) + + it('should pass the fetched content to InternalPage as raw markdown, unformatted', async () => { + const rawMarkdown = '# Raw Heading\n\nSome *raw* markdown text.' + mockedResourcesGet.mockResolvedValue({ status: 200, data: rawMarkdown }) + + render( + , + ) + + await waitFor(() => { + expect(mockedInternalPage).toHaveBeenCalledWith( + expect.objectContaining({ content: rawMarkdown }), + expect.anything(), + ) + }) }) }) diff --git a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx index 02326a4a8b..1cf7d731c3 100644 --- a/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/LazyInternalPage/LazyInternalPage.tsx @@ -1,6 +1,5 @@ import React, { useEffect, useRef, useState } from 'react' import { startCase } from 'lodash' -import { useHistory } from 'react-router-dom' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { AxiosError } from 'axios' @@ -20,7 +19,6 @@ import { setExplorePanelSearch, setExplorePanelScrollTop, } from 'uiSrc/slices/panels/sidePanels' -import FormatSelector from 'uiSrc/services/formatter/FormatSelector' import InternalPage from '../InternalPage' import { getFileInfo, @@ -62,7 +60,6 @@ const LazyInternalPage = ({ manifestPath, search, }: Props) => { - const history = useHistory() const { itemScrollTop, data: contentContext, @@ -122,7 +119,6 @@ const LazyInternalPage = ({ throw new Error('Custom tutorials are disabled') } - const formatter = FormatSelector.selectFor(pageInfo.extension) let content = contentContext if (url !== path || !contentContext) { @@ -134,11 +130,7 @@ const LazyInternalPage = ({ } dispatch(setExplorePanelSearch(search)) - const contentData = await formatter.format( - { data: content, path }, - { history }, - ) - setPageData((prevState) => ({ ...prevState, content: contentData })) + setPageData((prevState) => ({ ...prevState, content: content ?? '' })) setLoading(false) } catch (error) { setLoading(false) diff --git a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/LiveTimeRecommendations.tsx b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/LiveTimeRecommendations.tsx index 9b7a9dc1c4..de5837b2a1 100644 --- a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/LiveTimeRecommendations.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/LiveTimeRecommendations.tsx @@ -4,11 +4,8 @@ import { useHistory, useParams } from 'react-router-dom' import { remove } from 'lodash' import styled from 'styled-components' +import { Trans, useTranslation } from 'uiSrc/i18n' import { FeatureFlags, DEFAULT_DELIMITER, Pages } from 'uiSrc/constants' -import { - ANALYZE_CLUSTER_TOOLTIP_MESSAGE, - ANALYZE_TOOLTIP_MESSAGE, -} from 'uiSrc/constants/recommendations' import { recommendationsSelector, fetchRecommendationsAction, @@ -61,7 +58,36 @@ const FooterLink = styled.button<{ } ` +const AnalysisLink = ({ + isShowPopover, + setIsShowPopover, + onApproveClick, + popoverContent, + children, +}: { + isShowPopover: boolean + setIsShowPopover: (value: boolean) => void + onApproveClick: () => void + popoverContent: string + children?: React.ReactNode +}) => ( + + setIsShowPopover(true)} + data-testid="footer-db-analysis-link" + > + {children} + + +) + const LiveTimeRecommendations = () => { + const { t } = useTranslation() const { provider, connectionType } = useAppSelector(connectedInstanceSelector) const { loading, @@ -158,21 +184,20 @@ const LiveTimeRecommendations = () => { const renderHeader = () => ( - Our Tips + {t('tips.panel.title')} - Tips will help you improve your database. + {t('tips.panel.infoTooltip')} - New tips appear while you work with your database, including how - to improve performance and optimize memory usage. + {t('tips.newTipsInfo')} <> - Eager for more tips? Run Database Analysis to get started. + {t('tips.eagerForMoreTips')} @@ -195,7 +220,7 @@ const LiveTimeRecommendations = () => { > { onChangeShowHidden(e.target.checked)} data-testid="checkbox-show-hidden" - aria-label="checkbox show hidden" + aria-label={t('tips.panel.checkboxShowHiddenAria')} /> )} @@ -240,25 +265,23 @@ const LiveTimeRecommendations = () => { type="MessageInfoIcon" /> - {'Run '} - - setIsShowApproveRun(true)} - data-testid="footer-db-analysis-link" - > - Database Analysis - - - {' to get more tips'} + + ), + }} + />
diff --git a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/popover-run-analyze/PopoverRunAnalyze.tsx b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/popover-run-analyze/PopoverRunAnalyze.tsx index 8c85f430ae..87a9803df9 100644 --- a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/popover-run-analyze/PopoverRunAnalyze.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/popover-run-analyze/PopoverRunAnalyze.tsx @@ -1,5 +1,6 @@ import React from 'react' +import { useTranslation } from 'uiSrc/i18n' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { Text } from 'uiSrc/components/base/text' @@ -22,6 +23,7 @@ const PopoverRunAnalyze = (props: Props) => { onApproveClick, children, } = props + const { t } = useTranslation() return ( { data-testid="insights-db-analysis-popover" > - Run database analysis + {t('tips.runAnalysis.popoverTitle')} {popoverContent} - Analyze + {t('tips.runAnalysis.approveButton')}
diff --git a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.tsx b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.tsx index c918f05d26..15850f5bd3 100644 --- a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.tsx @@ -3,7 +3,9 @@ import { useAppDispatch } from 'uiSrc/slices/hooks' import { useHistory, useParams } from 'react-router-dom' import { isUndefined } from 'lodash' +import { useTranslation } from 'uiSrc/i18n' import { findTutorialPath, Maybe, Nullable } from 'uiSrc/utils' +import { getTranslatedTipTitle } from 'uiSrc/utils/recommendation' import { FeatureFlags, Pages } from 'uiSrc/constants' import { FeatureFlagComponent, @@ -72,6 +74,8 @@ const RecommendationTitle = ({ title?: string id: string }) => { + const { t } = useTranslation() + return ( @@ -122,6 +126,7 @@ const Recommendation = ({ params, recommendationsContent, }: IProps) => { + const { t } = useTranslation() const history = useHistory() const dispatch = useAppDispatch() const { instanceId = '' } = useParams<{ instanceId: string }>() @@ -132,6 +137,7 @@ const Recommendation = ({ liveTitle, content = [], } = recommendationsContent[name] || {} + const translatedTitle = getTranslatedTipTitle(name, title || liveTitle) const handleRedirect = () => { sendEventTelemetry({ @@ -211,7 +217,9 @@ const Recommendation = ({ onClick={handleRedirect} data-testid={`${name}-to-tutorial-btn`} > - {tutorialId ? 'Start Tutorial' : 'Workbench'} + {tutorialId + ? t('tips.recommendation.startTutorial') + : t('tips.recommendation.workbench')} @@ -250,8 +258,8 @@ const Recommendation = ({ @@ -259,19 +267,23 @@ const Recommendation = ({ icon={SnoozeIcon} className={styles.snoozeBtn} onClick={handleDelete} - aria-label="snooze tip" + aria-label={t('tips.recommendation.snooze.aria')} data-testid={`${name}-delete-btn`} /> @@ -279,7 +291,7 @@ const Recommendation = ({ icon={hide ? HideIcon : ShowIcon} className={styles.hideBtn} onClick={toggleHide} - aria-label="hide/unhide tip" + aria-label={t('tips.recommendation.toggleHideAria')} data-testid={`toggle-hide-${name}-btn`} /> @@ -303,7 +315,7 @@ const Recommendation = ({ label={ } @@ -312,7 +324,9 @@ const Recommendation = ({ > {/* Note: Temporary dirty fix for RI-7474, before the full redesign of this component */} - {title?.length > TITLE_TRUNCATE_LENGTH && {title}} + {(translatedTitle?.length ?? 0) > TITLE_TRUNCATE_LENGTH && ( + {translatedTitle} + )} { + const { t } = useTranslation() const { provider, connectionType } = useAppSelector(connectedInstanceSelector) const { data: { recommendations }, @@ -53,14 +51,11 @@ const NoRecommendationsScreen = () => { return (
- Welcome to - Tips! - - Where we help improve your database. - + {t('tips.welcome.title')} + {t('tips.welcome.product')} + {t('tips.welcome.subtitle')} - New tips appear while you work with your database, including how to - improve performance and optimize memory usage. + {t('tips.newTipsInfo')} {instanceId ? ( @@ -69,25 +64,25 @@ const NoRecommendationsScreen = () => { className={styles.text} data-testid="no-recommendations-analyse-text" > - Eager for more tips? Run Database Analysis to get started. + {t('tips.eagerForMoreTips')} setIsShowInfo(true)} data-testid="insights-db-analysis-link" > - Analyze Database + {t('tips.welcome.analyzeButton')} @@ -96,7 +91,7 @@ const NoRecommendationsScreen = () => { className={styles.text} data-testid="no-recommendations-analyse-text" > - Eager for tips? Connect to a database to get started. + {t('tips.welcome.connectPrompt')} )}
diff --git a/redisinsight/ui/src/components/upload-file/UploadFile.tsx b/redisinsight/ui/src/components/upload-file/UploadFile.tsx index bda8521e89..c91675e0fa 100644 --- a/redisinsight/ui/src/components/upload-file/UploadFile.tsx +++ b/redisinsight/ui/src/components/upload-file/UploadFile.tsx @@ -3,6 +3,7 @@ import React from 'react' import { Text } from 'uiSrc/components/base/text' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -14,6 +15,7 @@ export interface Props { const UploadFile = (props: Props) => { const { onFileChange, onClick, accept, id = 'upload-input-file' } = props + const { t } = useTranslation() const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { @@ -34,7 +36,7 @@ const UploadFile = (props: Props) => { > {/* todo: 'folderOpen', replace with redis-ui once available */} - Upload + {t('browser.addKey.upload.label')} { onClick?.() }} className={styles.fileDrop} - aria-label="Select file" + aria-label={t('browser.addKey.upload.aria')} /> diff --git a/redisinsight/ui/src/components/upload-warning/UploadWarning.tsx b/redisinsight/ui/src/components/upload-warning/UploadWarning.tsx index 5a5a6dba1d..90385ace17 100644 --- a/redisinsight/ui/src/components/upload-warning/UploadWarning.tsx +++ b/redisinsight/ui/src/components/upload-warning/UploadWarning.tsx @@ -1,19 +1,22 @@ import React from 'react' import { Text } from 'uiSrc/components/base/text' import { UploadWarningBanner } from 'uiSrc/components/upload-warning/styles' +import { useTranslation } from 'uiSrc/i18n' -const UploadWarning = () => ( - - Use files only from trusted authors to avoid automatic execution of - malicious code. - - } - show - showIcon - variant="attention" - /> -) +const UploadWarning = () => { + const { t } = useTranslation() + return ( + + {t('common.uploadWarning')} + + } + show + showIcon + variant="attention" + /> + ) +} export default UploadWarning diff --git a/redisinsight/ui/src/components/virtual-grid/VirtualGrid.tsx b/redisinsight/ui/src/components/virtual-grid/VirtualGrid.tsx index b1b2a670c2..7a4a827ec8 100644 --- a/redisinsight/ui/src/components/virtual-grid/VirtualGrid.tsx +++ b/redisinsight/ui/src/components/virtual-grid/VirtualGrid.tsx @@ -13,7 +13,11 @@ import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { ProgressBarLoader } from 'uiSrc/components/base/display' import { Row } from 'uiSrc/components/base/layout/flex' import { IProps } from './interfaces' -import { getColumnWidth, useInnerElementType } from './utils' +import { + getColumnWidth, + getExpandedRowHeight, + useInnerElementType, +} from './utils' import styles from './styles.module.scss' @@ -68,9 +72,7 @@ const VirtualGrid = (props: IProps) => { ) const getRowHeight = (index: number) => - expandedRows.indexOf(index) !== -1 - ? Math.max(...Object.values(rowHeightsMap.current[index])) - : rowHeight + getExpandedRowHeight(index, expandedRows, rowHeightsMap.current, rowHeight) useEffect( () => () => { diff --git a/redisinsight/ui/src/components/virtual-grid/tests/utils.spec.ts b/redisinsight/ui/src/components/virtual-grid/tests/utils.spec.ts index b75f0eb97a..3b355fbaa3 100644 --- a/redisinsight/ui/src/components/virtual-grid/tests/utils.spec.ts +++ b/redisinsight/ui/src/components/virtual-grid/tests/utils.spec.ts @@ -1,4 +1,4 @@ -import { getColumnWidth } from '../utils' +import { getColumnWidth, getExpandedRowHeight } from '../utils' const getColumnWidthTests: any[] = [ [0, 500, [{ maxWidth: 70, minWidth: 50 }], 50], @@ -33,3 +33,31 @@ describe('getColumnWidth', () => { }, ) }) + +describe('getExpandedRowHeight (RI-8349)', () => { + const DEFAULT = 43 + + it('returns the default height for a non-expanded row', () => { + expect(getExpandedRowHeight(0, [], { 0: { 0: 100 } }, DEFAULT)).toBe( + DEFAULT, + ) + }) + + it('returns the tallest recorded column height for an expanded row', () => { + expect( + getExpandedRowHeight(1, [1], { 1: { 0: 80, 1: 120, 2: 50 } }, DEFAULT), + ).toBe(120) + }) + + it('falls back to the default when an expanded row has no recorded height (no crash)', () => { + // Row flagged expanded before setRowHeight ran — previously threw + // "Cannot convert undefined or null to object" on Object.values(undefined). + expect(() => getExpandedRowHeight(2, [2], {}, DEFAULT)).not.toThrow() + expect(getExpandedRowHeight(2, [2], {}, DEFAULT)).toBe(DEFAULT) + }) + + it('falls back to the default when the recorded height map is empty', () => { + // Guards Math.max() with no args returning -Infinity. + expect(getExpandedRowHeight(3, [3], { 3: {} }, DEFAULT)).toBe(DEFAULT) + }) +}) diff --git a/redisinsight/ui/src/components/virtual-grid/utils.tsx b/redisinsight/ui/src/components/virtual-grid/utils.tsx index 109d7a9f49..693632b5c2 100644 --- a/redisinsight/ui/src/components/virtual-grid/utils.tsx +++ b/redisinsight/ui/src/components/virtual-grid/utils.tsx @@ -230,6 +230,29 @@ export const useInnerElementType = ( [Cell, columnWidth, rowHeight, columnCount, tableWidth], ) +/** + * Row height for a virtual-grid row. Expanded rows use the tallest recorded + * column height; everything else uses the default. + * + * A row can be flagged expanded before any column height has been recorded (or + * after the height map is reset), so `rowHeights[index]` may be missing/empty. + * Fall back to the default in that case rather than calling `Object.values()` + * on `undefined` ("Cannot convert undefined or null to object") or `Math.max()` + * with no args (`-Infinity`). + */ +export const getExpandedRowHeight = ( + index: number, + expandedRows: number[], + rowHeights: { [key: number]: { [key: number]: number } }, + defaultRowHeight: number, +): number => { + if (expandedRows.indexOf(index) === -1) return defaultRowHeight + + const columnHeights = rowHeights[index] + const sizes = columnHeights ? Object.values(columnHeights) : [] + return sizes.length ? Math.max(...sizes) : defaultRowHeight +} + export const getColumnWidth = ( i: number, width: number, diff --git a/redisinsight/ui/src/components/virtual-list/VirtualList.tsx b/redisinsight/ui/src/components/virtual-list/VirtualList.tsx index 7cdbbb75c9..56830a5660 100644 --- a/redisinsight/ui/src/components/virtual-list/VirtualList.tsx +++ b/redisinsight/ui/src/components/virtual-list/VirtualList.tsx @@ -83,23 +83,37 @@ const VirtualList = (props: Props) => { ) } - return ( - forceRender({})}> - {({ width, height = 0 }) => ( - - {Row} - - )} + // AutoSizer types disableHeight as a literal, so the two modes cannot share a + // single element with a computed value. Both branches render the same list. + const renderList = ({ + width, + height = 0, + }: { + width: number + height?: number + }) => ( + + {Row} + + ) + + const handleResize = () => forceRender({}) + + return dynamicHeight ? ( + + {renderList} + ) : ( + {renderList} ) } diff --git a/redisinsight/ui/src/components/whats-new/WhatsNewModal.spec.tsx b/redisinsight/ui/src/components/whats-new/WhatsNewModal.spec.tsx index aa0c496e02..8df191cc09 100644 --- a/redisinsight/ui/src/components/whats-new/WhatsNewModal.spec.tsx +++ b/redisinsight/ui/src/components/whats-new/WhatsNewModal.spec.tsx @@ -22,21 +22,23 @@ jest.mock('uiSrc/telemetry', () => ({ const latestVersion = whatsNewFeed[0].version -const getOpenState = (flagsOn = false) => { +// Card-level assertions pin to a shipped version so they don't churn when a +// new release is added to the top of the feed. 3.6.0 carries unflagged cards +// (e.g. geodata-workbench); 3.2.0's azure-managed-redis card is flag-gated +// (azureEntraId) and is used to exercise the coming-soon / active states. +const CONTENT_VERSION = '3.6.0' +const FLAG_GATED_VERSION = '3.2.0' + +const getOpenState = (flagsOn = false, version = latestVersion) => { let state = set(cloneDeep(initialStateDefault), 'app.whatsNew', { isOpen: true, - selectedVersion: latestVersion, + selectedVersion: version, lastVersionSeen: null, }) if (flagsOn) { state = set( state, - `app.features.featureFlags.features.${FeatureFlags.vectorSet}`, - { flag: true }, - ) - state = set( - state, - `app.features.featureFlags.features.${FeatureFlags.prodMode}`, + `app.features.featureFlags.features.${FeatureFlags.azureEntraId}`, { flag: true }, ) } @@ -70,24 +72,30 @@ describe('WhatsNewModal', () => { }) it('should show where to find a feature', () => { - render(, { store: mockStore(getOpenState()) }) + render(, { + store: mockStore(getOpenState(false, CONTENT_VERSION)), + }) expect( screen.getByTestId('whats-new-card-location-geodata-workbench'), ).toBeInTheDocument() + // unflagged card carries no indicator + expect( + screen.queryByTestId('whats-new-card-inactive-geodata-workbench'), + ).not.toBeInTheDocument() }) it('should show flag-gated cards marked as coming soon when their flags are off', () => { - render(, { store: mockStore(getOpenState(false)) }) + render(, { + store: mockStore(getOpenState(false, FLAG_GATED_VERSION)), + }) - expect(screen.getByTestId('whats-new-card-vector-sets')).toBeInTheDocument() expect( - screen.getByTestId('whats-new-card-inactive-vector-sets'), + screen.getByTestId('whats-new-card-azure-managed-redis'), ).toBeInTheDocument() - // unflagged card carries no indicator expect( - screen.queryByTestId('whats-new-card-inactive-geodata-workbench'), - ).not.toBeInTheDocument() + screen.getByTestId('whats-new-card-inactive-azure-managed-redis'), + ).toBeInTheDocument() }) it('should show versions whose cards are all flag-gated off', () => { @@ -106,14 +114,15 @@ describe('WhatsNewModal', () => { }) it('should not mark flag-gated cards when their flags are on', () => { - render(, { store: mockStore(getOpenState(true)) }) + render(, { + store: mockStore(getOpenState(true, FLAG_GATED_VERSION)), + }) - expect(screen.getByTestId('whats-new-card-vector-sets')).toBeInTheDocument() expect( - screen.queryByTestId('whats-new-card-inactive-vector-sets'), - ).not.toBeInTheDocument() + screen.getByTestId('whats-new-card-azure-managed-redis'), + ).toBeInTheDocument() expect( - screen.queryByTestId('whats-new-card-inactive-dev-vs-prod-mode'), + screen.queryByTestId('whats-new-card-inactive-azure-managed-redis'), ).not.toBeInTheDocument() }) diff --git a/redisinsight/ui/src/components/whats-new/WhatsNewModal.tsx b/redisinsight/ui/src/components/whats-new/WhatsNewModal.tsx index 9805048aaf..0db6ebd29f 100644 --- a/redisinsight/ui/src/components/whats-new/WhatsNewModal.tsx +++ b/redisinsight/ui/src/components/whats-new/WhatsNewModal.tsx @@ -92,7 +92,7 @@ const WhatsNewModal = () => { return ( - + diff --git a/redisinsight/ui/src/components/whats-new/components/feature-card/FeatureCard.tsx b/redisinsight/ui/src/components/whats-new/components/feature-card/FeatureCard.tsx index 78e54dbc06..b63b3319e9 100644 --- a/redisinsight/ui/src/components/whats-new/components/feature-card/FeatureCard.tsx +++ b/redisinsight/ui/src/components/whats-new/components/feature-card/FeatureCard.tsx @@ -1,6 +1,7 @@ import React from 'react' import { useTranslation } from 'uiSrc/i18n' +import { RiTooltip } from 'uiSrc/components' import { Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { Text } from 'uiSrc/components/base/text' @@ -24,10 +25,12 @@ const FeatureCard = ({ card, isActive = true, onLinkClick }: Props) => { )} {!isActive && ( - + + + )}
diff --git a/redisinsight/ui/src/constants/api.ts b/redisinsight/ui/src/constants/api.ts index 015d60abf7..c7636648e2 100644 --- a/redisinsight/ui/src/constants/api.ts +++ b/redisinsight/ui/src/constants/api.ts @@ -36,7 +36,6 @@ enum ApiEndpoints { KEY_INFO = 'keys/get-info', KEY_NAME = 'keys/name', KEY_TTL = 'keys/ttl', - KEYS_NAMESPACE_SEARCHABLE = 'keys/get-namespace-searchable', ZSET = 'zSet', ZSET_MEMBERS = 'zSet/members', @@ -158,6 +157,7 @@ enum ApiEndpoints { CLOUD_ME = 'cloud/me', CLOUD_ME_JOBS = 'cloud/me/jobs', CLOUD_ME_ACCOUNTS = 'cloud/me/accounts', + CLOUD_ME_LOGIN_MFA = 'cloud/me/login/mfa', CLOUD_ME_LOGOUT = 'cloud/me/logout', CLOUD_CURRENT = 'current', diff --git a/redisinsight/ui/src/constants/browser.ts b/redisinsight/ui/src/constants/browser.ts index e86b7cbf8b..44c9ea521f 100644 --- a/redisinsight/ui/src/constants/browser.ts +++ b/redisinsight/ui/src/constants/browser.ts @@ -1,4 +1,5 @@ import { EuiComboBoxOptionOption } from '@elastic/eui' +import { TFunction } from 'i18next' import { KeyValueFormat, SortOrder } from './keys' export const DEFAULT_DELIMITER: EuiComboBoxOptionOption = { @@ -8,10 +9,10 @@ export const DEFAULT_DELIMITER: EuiComboBoxOptionOption = { export const DEFAULT_TREE_SORTING = SortOrder.ASC export const DEFAULT_SHOW_HIDDEN_RECOMMENDATIONS = false -export const TEXT_UNPRINTABLE_CHARACTERS = { - title: 'Non-printable characters have been detected', - content: 'Use Workbench or CLI to edit without data loss.', -} +export const getTextUnprintableCharacters = (t: TFunction) => ({ + title: t('browser.keyDetails.unprintable.title'), + content: t('browser.keyDetails.unprintable.content'), +}) export const TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA = 'This action is disabled because the key or value is too large to process within Redis Insight.' export const AXIOS_ERROR_DISABLED_ACTION_WITH_TRUNCATED_DATA = { @@ -28,13 +29,11 @@ export const TEXT_CONSUMER_NAME_TOO_LONG = export const TEXT_DISABLED_FORMATTER_EDITING = 'Cannot edit the value in this format' export const TEXT_DISABLED_STRING_EDITING = 'Load the entire value to edit it' -export const TEXT_DISABLED_STRING_FORMATTING = - 'Load the entire value to select a format' -export const TEXT_INVALID_VALUE = { - title: 'Value will be saved as Unicode', - text: 'as it is not valid in the selected format.', -} +export const getTextInvalidValue = (t: TFunction) => ({ + title: t('browser.keyDetails.invalidValue.title'), + text: t('browser.keyDetails.invalidValue.text'), +}) export const TEXT_DISABLED_COMPRESSED_VALUE: string = 'Cannot edit the decompressed value' @@ -42,13 +41,6 @@ export const TEXT_DISABLED_COMPRESSED_VALUE: string = export const TEXT_FAILED_CONVENT_FORMATTER = (format: KeyValueFormat) => `Failed to convert to ${format}` -export const TEXT_BULK_DELETE_TOOLTIP = (pattern: string) => - `Delete all keys matching: ${pattern}` -export const TEXT_BULK_DELETE_DISABLED_UNPRINTABLE = - 'Non-printable characters detected. Bulk delete disabled due to unreliable key grouping.' -export const TEXT_BULK_DELETE_DISABLED_MULTIPLE_DELIMITERS = - 'To use bulk delete, configure tree view with one delimiter.' - export const DATABASE_OVERVIEW_REFRESH_INTERVAL = riConfig.browser.databaseOverviewRefreshInterval export const DATABASE_OVERVIEW_MINIMUM_REFRESH_INTERVAL = diff --git a/redisinsight/ui/src/constants/content/whats-new/index.ts b/redisinsight/ui/src/constants/content/whats-new/index.ts index 936140af9e..e545f57e2b 100644 --- a/redisinsight/ui/src/constants/content/whats-new/index.ts +++ b/redisinsight/ui/src/constants/content/whats-new/index.ts @@ -1,10 +1,12 @@ import { WhatsNewVersion } from './types' +import { version380 } from './versions/v3.8.0' import { version360 } from './versions/v3.6.0' import { version341 } from './versions/v3.4.1' import { version320 } from './versions/v3.2.0' // One module per release — add the new version here in each release PR. export const WHATS_NEW_VERSIONS: WhatsNewVersion[] = [ + version380, version360, version341, version320, diff --git a/redisinsight/ui/src/constants/content/whats-new/versions/v3.4.1.ts b/redisinsight/ui/src/constants/content/whats-new/versions/v3.4.1.ts index cb99fc3869..f96d6c71d9 100644 --- a/redisinsight/ui/src/constants/content/whats-new/versions/v3.4.1.ts +++ b/redisinsight/ui/src/constants/content/whats-new/versions/v3.4.1.ts @@ -10,8 +10,7 @@ export const version341: WhatsNewVersion = { id: 'search-workspace', title: 'Dedicated Search workspace', body: 'A new Search workspace with full index lifecycle support: create indexes from sample or existing data, query indexed data with an assisted editor, and save queries to a Query Library for reuse.', - location: 'Search workspace in the left navigation', - featureFlag: FeatureFlags.vectorSearchV2, + location: 'Search workspace in the main database navigation', }, { id: 'azure-integration-enhancements', diff --git a/redisinsight/ui/src/constants/content/whats-new/versions/v3.6.0.ts b/redisinsight/ui/src/constants/content/whats-new/versions/v3.6.0.ts index f4469a2760..43b2a70f66 100644 --- a/redisinsight/ui/src/constants/content/whats-new/versions/v3.6.0.ts +++ b/redisinsight/ui/src/constants/content/whats-new/versions/v3.6.0.ts @@ -1,4 +1,3 @@ -import { FeatureFlags } from 'uiSrc/constants/featureFlags' import { WhatsNewVersion, WhatsNewVersionType } from '../types' export const version360: WhatsNewVersion = { @@ -9,21 +8,19 @@ export const version360: WhatsNewVersion = { { id: 'vector-sets', title: 'Vector Sets support', - body: 'Full support for Vector Sets, the Redis 8 vector-native data type: create them manually or from a bundled sample dataset, add elements, and run similarity search end-to-end.', + body: 'Create Vector Sets (Redis 8) manually or from the bundled vec2word sample, add elements with attributes, and run similarity search in the GUI. Handy for prototyping semantic search.', location: 'Browser — add a key of type Vector Set', - featureFlag: FeatureFlags.vectorSet, }, { id: 'dev-vs-prod-mode', title: 'Dev vs Production database mode', - body: 'Classify databases by environment with clear visual indicators, and require type-to-confirm for destructive actions on production databases.', + body: 'Tag connections as dev or production. Production shows a PROD badge and requires type-to-confirm before destructive actions. Makes it harder to run destructive actions against the wrong database.', location: "Database list — edit a database's connection settings", - featureFlag: FeatureFlags.prodMode, }, { id: 'geodata-workbench', title: 'Geodata Workbench plugin', - body: 'Renders Redis GEO command results as an interactive map, density heatmap, or details card — auto-selected per command.', + body: 'GEO results render as a map, heatmap, or details card, auto-selected per command. Verify GEOSEARCH output visually instead of reading raw coordinates.', location: 'Workbench — run a GEO command (e.g. GEOSEARCH)', }, ], diff --git a/redisinsight/ui/src/constants/content/whats-new/versions/v3.8.0.ts b/redisinsight/ui/src/constants/content/whats-new/versions/v3.8.0.ts new file mode 100644 index 0000000000..0ba5250651 --- /dev/null +++ b/redisinsight/ui/src/constants/content/whats-new/versions/v3.8.0.ts @@ -0,0 +1,31 @@ +import { FeatureFlags } from 'uiSrc/constants/featureFlags' +import { WhatsNewVersion, WhatsNewVersionType } from '../types' + +export const version380: WhatsNewVersion = { + version: '3.8.0', + releaseDate: '2026-07-21', + type: WhatsNewVersionType.Major, + cards: [ + { + id: 'arrays', + title: 'Support for new Array data type', + body: "Arrays are a new indexed type in Redis 8.8 where each element's position is meaningful: sensor readings by time, calendar slots by interval, workflow steps by stage. Sparse data stays memory-cheap, and you can search and aggregate server-side instead of pulling everything client-side. In Redis Insight, create Arrays manually or from a sample, then browse, edit, search with AND/OR queries, and aggregate.", + location: 'Browser — add a key of type Array', + featureFlag: FeatureFlags.array, + }, + { + id: 'ipv4-ipv6-selection', + tag: 'Improved', + title: 'IPv4 / IPv6 selection on connection', + body: 'Pick IPv4 or IPv6 explicitly when connecting to a database. Gives you a reliable connection in environments where one protocol does not resolve correctly.', + location: 'Database list — add or edit a database connection', + }, + { + id: 'markdown-format', + tag: 'Improved', + title: 'Markdown value format', + body: 'View stored values rendered as formatted Markdown, for any key type. Makes documents, notes, and generated content readable without copying them out to another tool.', + location: 'Key details — switch the value format to Markdown', + }, + ], +} diff --git a/redisinsight/ui/src/constants/customErrorCodes.ts b/redisinsight/ui/src/constants/customErrorCodes.ts index baeb9bb718..91a6dd27bc 100644 --- a/redisinsight/ui/src/constants/customErrorCodes.ts +++ b/redisinsight/ui/src/constants/customErrorCodes.ts @@ -30,6 +30,9 @@ export enum CustomErrorCodes { CloudCapiKeyUnauthorized = 11_022, CloudCapiKeyNotFound = 11_023, AzureEntraIdTokenExpired = 11_024, + CloudApiMfaRequired = 11_025, + CloudApiMfaQuotaExceeded = 11_026, + CloudApiMfaInvalidCode = 11_027, // Cloud Job errors [11100, 11199] CloudJobUnexpectedError = 11_100, diff --git a/redisinsight/ui/src/constants/featureFlags.ts b/redisinsight/ui/src/constants/featureFlags.ts index efd3a03fe5..23468ec390 100644 --- a/redisinsight/ui/src/constants/featureFlags.ts +++ b/redisinsight/ui/src/constants/featureFlags.ts @@ -12,12 +12,11 @@ export enum FeatureFlags { cloudAds = 'cloudAds', databaseManagement = 'databaseManagement', customTutorials = 'customTutorials', - vectorSearchV2 = 'vectorSearchV2', - vectorSet = 'vectorSet', - devArray = 'dev-array', + array = 'array', azureEntraId = 'azureEntraId', devBrowser = 'dev-browser', - prodMode = 'prodMode', devLanguage = 'dev-language', - whatsNew = 'whatsNew', + vectorSearchEnhancements = 'vectorSearchEnhancements', + valueDecoder = 'valueDecoder', + appUpdateStrategySettings = 'appUpdateStrategySettings', } diff --git a/redisinsight/ui/src/constants/help-texts.tsx b/redisinsight/ui/src/constants/help-texts.tsx index 9de4922e49..13f042bb16 100644 --- a/redisinsight/ui/src/constants/help-texts.tsx +++ b/redisinsight/ui/src/constants/help-texts.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { Trans } from 'uiSrc/i18n' import { FeatureFlagComponent } from 'uiSrc/components' import { EXTERNAL_LINKS, @@ -46,22 +47,26 @@ export default { REMOVE_LAST_ELEMENT: () => ( - Removing the last item deletes the entire key. + + + ), REMOVING_MULTIPLE_ELEMENTS_NOT_SUPPORT: ( - <> - Removing multiple elements is available for Redis databases v. 6.2 or - later. Update your Redis database or create a new  - - free up-to-date - -  Redis database. - + + free up-to-date + + ), + }} + /> ), } diff --git a/redisinsight/ui/src/constants/keys.ts b/redisinsight/ui/src/constants/keys.ts index 88edec1cc2..e1af7d47e2 100644 --- a/redisinsight/ui/src/constants/keys.ts +++ b/redisinsight/ui/src/constants/keys.ts @@ -1,3 +1,4 @@ +import { ParseKeys } from 'i18next' import { StreamViewType } from 'uiSrc/slices/interfaces/stream' import { ApiEndpoints } from 'uiSrc/constants' import { CommandGroup } from './commands' @@ -104,20 +105,22 @@ export const STREAM_ADD_GROUP_VIEW_TYPES = [ StreamViewType.Messages, ] -export const STREAM_ADD_ACTION = Object.freeze({ - [StreamViewType.Data]: { - name: 'New Entry', - }, - [StreamViewType.Groups]: { - name: 'New Group', - }, - [StreamViewType.Consumers]: { - name: 'New Group', - }, - [StreamViewType.Messages]: { - name: 'New Group', - }, -}) +// `name` holds an i18n key resolved with t() at render time. +export const STREAM_ADD_ACTION: Record = + Object.freeze({ + [StreamViewType.Data]: { + name: 'browser.stream.addAction.newEntry', + }, + [StreamViewType.Groups]: { + name: 'browser.stream.addAction.newGroup', + }, + [StreamViewType.Consumers]: { + name: 'browser.stream.addAction.newGroup', + }, + [StreamViewType.Messages]: { + name: 'browser.stream.addAction.newGroup', + }, + }) export enum SortOrder { ASC = 'ASC', @@ -125,14 +128,15 @@ export enum SortOrder { } export interface LengthNamingByType { - [key: string]: string + // i18n keys resolved with t() at render time. + [key: string]: ParseKeys } export const LENGTH_NAMING_BY_TYPE: LengthNamingByType = Object.freeze({ - [ModulesKeyTypes.Graph]: 'Nodes', - [ModulesKeyTypes.TimeSeries]: 'Samples', - [KeyTypes.Stream]: 'Entries', - [KeyTypes.ReJSON]: 'Top-level values', + [ModulesKeyTypes.Graph]: 'browser.keyDetails.length.nodes', + [ModulesKeyTypes.TimeSeries]: 'browser.keyDetails.length.samples', + [KeyTypes.Stream]: 'browser.keyDetails.length.entries', + [KeyTypes.ReJSON]: 'browser.keyDetails.length.topLevelValues', }) export interface ModulesKeyTypesNames { @@ -158,6 +162,7 @@ export enum KeyValueFormat { Vector32Bit = 'Vector 32-bit', Vector64Bit = 'Vector 64-bit', DateTime = 'DateTime', + Markdown = 'Markdown', } export const DATETIME_FORMATTER_DEFAULT = 'HH:mm:ss d MMM yyyy' diff --git a/redisinsight/ui/src/constants/rdiList.ts b/redisinsight/ui/src/constants/rdiList.ts index 7df38791dc..72e04b2b80 100644 --- a/redisinsight/ui/src/constants/rdiList.ts +++ b/redisinsight/ui/src/constants/rdiList.ts @@ -1,3 +1,5 @@ +import { TFunction } from 'i18next' + export enum RdiListColumn { Name = 'name', Url = 'url', @@ -6,13 +8,16 @@ export enum RdiListColumn { Controls = 'controls', } -export const RDI_COLUMN_FIELD_NAME_MAP = new Map([ - [RdiListColumn.Name, 'RDI alias'], - [RdiListColumn.Url, 'URL'], - [RdiListColumn.Version, 'RDI version'], - [RdiListColumn.LastConnection, 'Last connection'], - [RdiListColumn.Controls, 'Controls'], -]) +// Built via a factory so headers resolve against the active language at render +// time (a module-level map would freeze the English values at import). +export const getRdiColumnFieldNameMap = (t: TFunction) => + new Map([ + [RdiListColumn.Name, t('rdi.home.column.name')], + [RdiListColumn.Url, t('rdi.home.column.url')], + [RdiListColumn.Version, t('rdi.home.column.version')], + [RdiListColumn.LastConnection, t('rdi.home.column.lastConnection')], + [RdiListColumn.Controls, t('rdi.home.column.controls')], + ]) export const DEFAULT_RDI_SHOWN_COLUMNS = [ RdiListColumn.Name, diff --git a/redisinsight/ui/src/constants/recommendations.ts b/redisinsight/ui/src/constants/recommendations.ts index 8f02c8e36e..c2dd52c8e3 100644 --- a/redisinsight/ui/src/constants/recommendations.ts +++ b/redisinsight/ui/src/constants/recommendations.ts @@ -7,9 +7,4 @@ export enum RecommendationsSocketEvents { Recommendation = 'recommendation', } -export const ANALYZE_TOOLTIP_MESSAGE = - 'Analyze up to 10 000 keys to get an overview of your data and tips on how to save memory and optimize the usage of your database.' -export const ANALYZE_CLUSTER_TOOLTIP_MESSAGE = - 'Analyze up to 10 000 keys per shard to get an overview of your data and tips on how to save memory and optimize the usage of your database.' - export const ANIMATION_INSIGHT_PANEL_MS = 400 diff --git a/redisinsight/ui/src/constants/storage.ts b/redisinsight/ui/src/constants/storage.ts index 3d43e1796a..af978c2ec7 100644 --- a/redisinsight/ui/src/constants/storage.ts +++ b/redisinsight/ui/src/constants/storage.ts @@ -51,6 +51,7 @@ enum BrowserStorageItem { whatsNewLastVersionSeen = 'whatsNewLastVersionSeen', agentMemoryPanelSizes = 'agentMemoryPanelSizes', agentMemoryLtmPanelSizes = 'agentMemoryLtmPanelSizes', + valueDecoderRules = 'valueDecoderRules_', } export default BrowserStorageItem diff --git a/redisinsight/ui/src/constants/texts.tsx b/redisinsight/ui/src/constants/texts.tsx index 61fdbcf9c1..4df5e03a05 100644 --- a/redisinsight/ui/src/constants/texts.tsx +++ b/redisinsight/ui/src/constants/texts.tsx @@ -2,52 +2,13 @@ import React from 'react' import { Text } from 'uiSrc/components/base/text' import { Spacer } from 'uiSrc/components/base/layout/spacer' +// Shared across several key-detail tables; migrate to i18n with those areas. export const NoResultsFoundText = ( No results found. ) -export const LoadingText = ( - - loading... - -) - -export const NoSelectedIndexText = ( - - Select an index and enter a query to search per values of keys. - -) - -export const FullScanNoResultsFoundText = ( - <> - - No results found. - - - - Check the spelling. -
- Check upper and lower cases. -
- Use an asterisk (*) in your request for more generic results. -
- -) -export const ScanNoResultsFoundText = ( - <> - - No results found. - -
- - Use "Scan more" button to proceed or filter per exact Key Name - to scan more efficiently. - - -) - export const lastDeliveredIDTooltipText = ( <> diff --git a/redisinsight/ui/src/constants/workbenchResults.ts b/redisinsight/ui/src/constants/workbenchResults.ts index 8c022f51cd..403cbe7148 100644 --- a/redisinsight/ui/src/constants/workbenchResults.ts +++ b/redisinsight/ui/src/constants/workbenchResults.ts @@ -25,8 +25,8 @@ export const MODULE_NOT_LOADED_CONTENT: { [key in RedisDefaultModules]?: any } = link: 'https://redis.io/docs/latest/develop/data-types/timeseries/', }, [RedisDefaultModules.Search]: { - title: ['Redis Query Engine is not available for this database'], - text: ['Redis Query Engine allows to:'], + title: ['Redis Search is not available for this database'], + text: ['Redis Search allows to:'], improvements: ['Query', 'Secondary index', 'Full-text search'], additionalText: [ 'These features enable multi-field queries, aggregation, exact phrase matching, numeric filtering, ', @@ -45,7 +45,7 @@ export const MODULE_NOT_LOADED_CONTENT: { [key in RedisDefaultModules]?: any } = 'Retrieve JSON documents', ], additionalText: [ - 'JSON data structure also works seamlessly with Redis Query Engine to let you index and query JSON documents.', + 'JSON data structure also works seamlessly with Redis Search to let you index and query JSON documents.', ], link: 'https://redis.io/docs/latest/develop/data-types/json/', }, @@ -68,6 +68,6 @@ export const MODULE_NOT_LOADED_CONTENT: { [key in RedisDefaultModules]?: any } = export const MODULE_TEXT_VIEW: { [key in RedisDefaultModules]?: string } = { [RedisDefaultModules.Bloom]: 'probabilistic data structures', [RedisDefaultModules.ReJSON]: 'JSON data structure', - [RedisDefaultModules.Search]: 'Redis Query Engine', + [RedisDefaultModules.Search]: 'Redis Search', [RedisDefaultModules.TimeSeries]: 'time series data structure', } diff --git a/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.spec.tsx b/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.spec.tsx index f4ec477f03..43c8823742 100644 --- a/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.spec.tsx +++ b/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.spec.tsx @@ -46,12 +46,14 @@ describe('ConfigAzureAuth', () => { homeAccountId: faker.string.uuid(), username: faker.internet.email(), name: faker.person.fullName(), + tenantId: faker.string.uuid(), } const expectedAccount = { id: mockMsalAccount.homeAccountId, username: mockMsalAccount.username, name: mockMsalAccount.name, + tenantId: mockMsalAccount.tenantId, } it('should call proper actions on success', () => { @@ -135,6 +137,7 @@ describe('ConfigAzureAuth', () => { account: null, error: '', source: AzureLoginSource.TokenRefresh, + tenant: null, }, }, } @@ -166,6 +169,7 @@ describe('ConfigAzureAuth', () => { account: null, error: '', source: AzureLoginSource.Autodiscovery, + tenant: null, }, }, } diff --git a/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.tsx b/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.tsx index 9456feb940..b21dd5dc45 100644 --- a/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.tsx +++ b/redisinsight/ui/src/electron/components/ConfigAzureAuth/ConfigAzureAuth.tsx @@ -19,6 +19,7 @@ interface MsalAccountInfo { homeAccountId: string username: string name?: string + tenantId?: string } interface AzureAuthCallbackResponse { @@ -47,6 +48,7 @@ const ConfigAzureAuth = () => { id: account.homeAccountId, username: account.username, name: account.name, + tenantId: account.tenantId, } const currentSource = sourceRef.current dispatch(handleAzureOAuthSuccess(azureAccount)) diff --git a/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.spec.tsx b/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.spec.tsx index b2ba2c7c6a..5214caddd8 100644 --- a/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.spec.tsx +++ b/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.spec.tsx @@ -1,10 +1,648 @@ import React from 'react' -import { render } from 'uiSrc/utils/test-utils' +import { cloneDeep } from 'lodash' +import { + cleanup, + mockedStore, + render, + screen, + fireEvent, +} from 'uiSrc/utils/test-utils' +import { AppUpdateStatus, AppUpdateStrategy } from 'uiSrc/electron/constants' +import { TelemetryEvent } from 'uiSrc/telemetry' +import { + addInfiniteNotification, + addMessageNotification, + removeInfiniteNotification, +} from 'uiSrc/slices/app/notifications' +import { InfiniteMessagesIds } from 'uiSrc/components/notifications/components' +import { IMessage, InfiniteMessage } from 'uiSrc/slices/interfaces' import ConfigElectron from './ConfigElectron' +const findInfiniteNotification = (store: typeof mockedStore) => + store + .getActions() + .find((action) => action.type === addInfiniteNotification.type) as + | { payload: InfiniteMessage } + | undefined + +const findMessageNotification = (store: typeof mockedStore) => + store + .getActions() + .find((action) => action.type === addMessageNotification.type) as + | { payload: IMessage } + | undefined + +jest.mock('uiSrc/telemetry', () => ({ + ...jest.requireActual('uiSrc/telemetry'), + sendEventTelemetry: jest.fn(), +})) + +jest.mock('uiSrc/electron/utils', () => ({ + ...jest.requireActual('uiSrc/electron/utils'), + ipcCheckUpdates: jest.fn(), + ipcSendEvents: jest.fn(), + ipcAppUpdateDownload: jest.fn(), + ipcSkipUpdateVersion: jest.fn(), + ipcGetUpdateDownloadedStrategy: jest.fn(), +})) + +const { sendEventTelemetry } = require('uiSrc/telemetry') +const { + ipcAppUpdateDownload, + ipcSkipUpdateVersion, + ipcGetUpdateDownloadedStrategy, +} = require('uiSrc/electron/utils') + +let store: typeof mockedStore + describe('ConfigElectron', () => { + beforeEach(() => { + cleanup() + jest.clearAllMocks() + ipcGetUpdateDownloadedStrategy.mockResolvedValue(AppUpdateStrategy.auto) + store = cloneDeep(mockedStore) + store.clearActions() + window.app = { + ...window.app, + updateState: jest.fn(), + updateAvailable: jest.fn(), + } + }) + it('should render', () => { expect(render()).toBeTruthy() }) + + it('should register an update-state listener on mount', () => { + render(, { store }) + + expect(window.app.updateState).toHaveBeenCalledWith(expect.any(Function)) + }) + + describe('update-available listener', () => { + it('should dispatch the restart notification synchronously, not gated behind the strategy IPC call', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + const addAction = findInfiniteNotification(store) + expect(addAction?.payload.id).toBe(InfiniteMessagesIds.appUpdateAvailable) + }) + + it('should report the persisted downloaded strategy for displayed telemetry, not the live setting', async () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + ipcGetUpdateDownloadedStrategy.mockResolvedValue(AppUpdateStrategy.notify) + + updateAvailableAction(null, { version: '1.2.3' }) + await Promise.resolve() + + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DISPLAYED, + eventData: { strategy: AppUpdateStrategy.notify }, + }) + }) + + it('should remove the restart notification from the store when dismissed with X', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + const addAction = findInfiniteNotification(store) + addAction?.payload.onClose?.() + + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateAvailable), + ) + }) + + it('should not resurface a dismissed restart version on the next periodic completion', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + const addAction = findInfiniteNotification(store) + addAction?.payload.onClose?.() + + store.clearActions() + + // Main resends appUpdateAvailable for the same version on a later + // periodic check that still finds it already downloaded. + updateAvailableAction(null, { version: '1.2.3' }) + + expect(store.getActions()).toHaveLength(0) + + // A genuinely newer version is still announced. + updateAvailableAction(null, { version: '1.2.4' }) + + const newAddAction = findInfiniteNotification(store) + expect(newAddAction?.payload.variation).toBe('1.2.4') + }) + + it('should not session-dismiss a version after Restart is clicked, even if the toast is later dismissed', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + const restartAction = findInfiniteNotification(store) + + render(restartAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Restart/ })) + + // quitAndInstall didn't actually quit (e.g. a platform-specific + // failure); the toast is later dismissed by unrelated queue churn. + restartAction?.payload.onClose?.() + + store.clearActions() + updateAvailableAction(null, { version: '1.2.3' }) + + const newAddAction = findInfiniteNotification(store) + expect(newAddAction?.payload.id).toBe( + InfiniteMessagesIds.appUpdateAvailable, + ) + expect(newAddAction?.payload.variation).toBe('1.2.3') + }) + + it('should leave a still-open restart toast alone when the same version resends', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + store.clearActions() + + // Main resends the same still-pending restart prompt on the next + // periodic check; the open, unactioned toast must not be re-created. + updateAvailableAction(null, { version: '1.2.3' }) + + expect(store.getActions()).toHaveLength(0) + }) + + it('should not let a stale restart toast close remove a newer version that replaced it', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + const restartAction = findInfiniteNotification(store) + + // A newer version finishes downloading before the user acts on the + // current restart prompt (e.g. a settings-triggered recheck). + updateAvailableAction(null, { version: '1.2.4' }) + + // The queue later dismisses the stale, still-mounted original toast; + // its onClose must not act on the newer prompt that replaced it. + restartAction?.payload.onClose?.() + + const relevantActions = store + .getActions() + .filter( + (action) => + (action.type === removeInfiniteNotification.type && + action.payload === InfiniteMessagesIds.appUpdateAvailable) || + (action.type === addInfiniteNotification.type && + (action.payload as InfiniteMessage).id === + InfiniteMessagesIds.appUpdateAvailable), + ) + expect(relevantActions[relevantActions.length - 1].type).toBe( + addInfiniteNotification.type, + ) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + const latestRestartAction = addActions[addActions.length - 1] + expect(latestRestartAction.payload.variation).toBe('1.2.4') + }) + + it('should not falsely session-dismiss a restart toast replaced by a newer found toast', () => { + render(, { store }) + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateAvailableAction(null, { version: '1.2.3' }) + const restartAction = findInfiniteNotification(store) + + // A newer version is found while the restart-to-install toast for + // 1.2.3 is still open. + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.4', + }) + + // The queue's programmatic dismiss of the now-stale restart toast + // must not falsely mark 1.2.3 as session-dismissed. + restartAction?.payload.onClose?.() + + store.clearActions() + updateAvailableAction(null, { version: '1.2.3' }) + + const addAction = findInfiniteNotification(store) + expect(addAction?.payload.id).toBe(InfiniteMessagesIds.appUpdateAvailable) + expect(addAction?.payload.variation).toBe('1.2.3') + }) + }) + + describe('update-state listener', () => { + const triggerUpdateState = (payload: { + status: AppUpdateStatus + version?: string + }) => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + updateStateAction(null, payload) + } + + it('should show the update-found notification and start the download on "Update"', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + expect(addAction?.payload.id).toBe(InfiniteMessagesIds.appUpdateFound) + + render(addAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + expect(ipcAppUpdateDownload).toHaveBeenCalled() + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DOWNLOAD_CLICKED, + }) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + const downloadingAction = addActions[addActions.length - 1] + expect(downloadingAction.payload.id).toBe( + InfiniteMessagesIds.appUpdateFound, + ) + }) + + it('should clear a pending restart-to-install toast when a newer update is found', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateAvailable), + ) + }) + + it('should leave a still-open found toast alone when the same version resends', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + const foundAction = findInfiniteNotification(store) + store.clearActions() + jest.clearAllMocks() + + // Main resends the same still-pending version on the next periodic + // check; the open, unactioned toast must not be re-created. + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + expect(store.getActions()).toHaveLength(0) + + render(foundAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + expect(ipcAppUpdateDownload).toHaveBeenCalled() + }) + + it('should skip the version when clicking "Skip this version"', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + + render(addAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Skip this version/ })) + + expect(ipcSkipUpdateVersion).toHaveBeenCalledWith('1.2.3') + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_SKIPPED, + }) + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + }) + + it('should ignore "Skip this version" if "Update" was already clicked', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + render(addAction?.payload.description as React.ReactElement) + + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + fireEvent.click(screen.getByRole('button', { name: /Skip this version/ })) + + expect(ipcSkipUpdateVersion).not.toHaveBeenCalled() + }) + + it('should emit close telemetry only when dismissed without choosing an action', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + addAction?.payload.onClose?.() + + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_CLOSED, + }) + }) + + it('should remove the found notification when dismissed with X', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + addAction?.payload.onClose?.() + + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + }) + + it('should not resurface a dismissed version on the next periodic check, but should announce a newer one', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + const foundAction = findInfiniteNotification(store) + foundAction?.payload.onClose?.() + + store.clearActions() + jest.clearAllMocks() + + // Main resends 'available' for the same version on the next + // periodic check - it must stay hidden until the next app launch. + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + expect(store.getActions()).toHaveLength(0) + + // A genuinely newer version is still announced. + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.4', + }) + + const addAction = findInfiniteNotification(store) + expect(addAction?.payload.id).toBe(InfiniteMessagesIds.appUpdateFound) + }) + + it('should not emit close telemetry after "Update" was clicked', () => { + triggerUpdateState({ + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + + const addAction = findInfiniteNotification(store) + render(addAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + jest.clearAllMocks() + + addAction?.payload.onClose?.() + + expect(sendEventTelemetry).not.toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_CLOSED, + }) + }) + + it('should clear the toast and show an error notification on failure', () => { + triggerUpdateState({ status: AppUpdateStatus.Error }) + + expect(store.getActions()).toContainEqual( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + const messageAction = findMessageNotification(store) + expect(messageAction?.payload.variant).toBe('danger') + }) + + it('should restore a working retry prompt after a download failure', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + store.clearActions() + jest.clearAllMocks() + + updateStateAction(null, { status: AppUpdateStatus.Error }) + + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DISPLAYED, + eventData: { strategy: AppUpdateStrategy.notify }, + }) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + const retryAction = addActions[addActions.length - 1] + expect(retryAction.payload.id).toBe(InfiniteMessagesIds.appUpdateFound) + + render(retryAction.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + expect(ipcAppUpdateDownload).toHaveBeenCalled() + }) + + it('should not let a stale found-toast close resolve its replacement', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + const foundAction = findInfiniteNotification(store) + + // User clicks Update; the throttled notification queue hasn't + // visually replaced the found toast with the downloading one yet. + render(foundAction?.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + store.clearActions() + jest.clearAllMocks() + + // The download fails immediately, before the queue swaps the toast. + updateStateAction(null, { status: AppUpdateStatus.Error }) + + // The queue later dismisses the stale, still-mounted original toast; + // its onClose must not act on the retry prompt that replaced it. + foundAction?.payload.onClose?.() + + // The retry prompt (added by the Error branch) must be the last + // thing to happen to appUpdateFound - not removed by the stale close. + const relevantActions = store + .getActions() + .filter( + (action) => + (action.type === removeInfiniteNotification.type && + action.payload === InfiniteMessagesIds.appUpdateFound) || + (action.type === addInfiniteNotification.type && + (action.payload as InfiniteMessage).id === + InfiniteMessagesIds.appUpdateFound), + ) + expect(relevantActions[relevantActions.length - 1].type).toBe( + addInfiniteNotification.type, + ) + expect(sendEventTelemetry).not.toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_CLOSED, + }) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + const retryAction = addActions[addActions.length - 1] + cleanup() + render(retryAction.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + expect(ipcAppUpdateDownload).toHaveBeenCalled() + }) + + it('should not let a stale found-toast close remove a newer version that replaced it', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + const foundAction = findInfiniteNotification(store) + + // A newer version is found before the user acts on the current toast. + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.4', + }) + + // The queue later dismisses the stale, still-mounted original toast; + // its onClose must not act on the newer prompt that replaced it. + foundAction?.payload.onClose?.() + + const relevantActions = store + .getActions() + .filter( + (action) => + (action.type === removeInfiniteNotification.type && + action.payload === InfiniteMessagesIds.appUpdateFound) || + (action.type === addInfiniteNotification.type && + (action.payload as InfiniteMessage).id === + InfiniteMessagesIds.appUpdateFound), + ) + expect(relevantActions[relevantActions.length - 1].type).toBe( + addInfiniteNotification.type, + ) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + const latestFoundAction = addActions[addActions.length - 1] + expect(latestFoundAction.payload.variation).toBe('1.2.4') + cleanup() + render(latestFoundAction.payload.description as React.ReactElement) + fireEvent.click(screen.getByRole('button', { name: /Update/ })) + + expect(ipcAppUpdateDownload).toHaveBeenCalledWith('1.2.4') + }) + + it('should restore a retry prompt even if the available version was falsy', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + + updateStateAction(null, { status: AppUpdateStatus.Available }) + store.clearActions() + + updateStateAction(null, { status: AppUpdateStatus.Error }) + + const addActions = store + .getActions() + .filter( + (action) => action.type === addInfiniteNotification.type, + ) as unknown as { payload: InfiniteMessage }[] + expect(addActions[addActions.length - 1]?.payload.id).toBe( + InfiniteMessagesIds.appUpdateFound, + ) + }) + + it('should not emit close telemetry when a completed download replaces the open prompt', () => { + render(, { store }) + const updateStateAction = (window.app.updateState as jest.Mock).mock + .calls[0][0] + const updateAvailableAction = (window.app.updateAvailable as jest.Mock) + .mock.calls[0][0] + + updateStateAction(null, { + status: AppUpdateStatus.Available, + version: '1.2.3', + }) + const foundAction = findInfiniteNotification(store) + jest.clearAllMocks() + + // The user switched strategy while the prompt was open; the resulting + // download completes and replaces it programmatically. + updateAvailableAction(null, { version: '1.2.3' }) + foundAction?.payload.onClose?.() + + expect(sendEventTelemetry).not.toHaveBeenCalledWith({ + event: TelemetryEvent.UPDATE_NOTIFICATION_CLOSED, + }) + }) + }) }) diff --git a/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.tsx b/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.tsx index 3086f98619..8d63fc5c0e 100644 --- a/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.tsx +++ b/redisinsight/ui/src/electron/components/ConfigElectron/ConfigElectron.tsx @@ -2,42 +2,87 @@ import { useEffect } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { useHistory } from 'react-router-dom' import { UpdateInfo } from 'electron-updater' -import { IParsedDeepLink } from 'uiSrc/electron/constants' +import { + AppUpdateState, + AppUpdateStatus, + AppUpdateStrategy, + IParsedDeepLink, +} from 'uiSrc/electron/constants' import { appServerInfoSelector, appElectronInfoSelector, } from 'uiSrc/slices/app/info' -import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features' import { ipcAppRestart, + ipcAppUpdateDownload, ipcCheckUpdates, + ipcGetUpdateDownloadedStrategy, ipcSendEvents, + ipcSkipUpdateVersion, } from 'uiSrc/electron/utils' import { ipcDeleteDownloadedVersion } from 'uiSrc/electron/utils/ipcDeleteStoreValues' -import { addInfiniteNotification } from 'uiSrc/slices/app/notifications' -import { INFINITE_MESSAGES } from 'uiSrc/components/notifications/components' +import { + addInfiniteNotification, + addMessageNotification, + removeInfiniteNotification, +} from 'uiSrc/slices/app/notifications' +import { + INFINITE_MESSAGES, + InfiniteMessagesIds, +} from 'uiSrc/components/notifications/components' import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry' +import { useTranslation } from 'uiSrc/i18n' + +const createToastGuard = () => { + let dismissedVersion: string | null = null + let lastVersion: string | null = null + let resolvedRef = { current: false } + + return { + get lastVersion() { + return lastVersion + }, + shouldSkip: (version?: string) => + !!version && + (version === dismissedVersion || + (version === lastVersion && !resolvedRef.current)), + resolveCurrent: () => { + resolvedRef.current = true + }, + beginShowing: (version?: string) => { + resolvedRef.current = true + resolvedRef = { current: false } + lastVersion = version ?? null + return resolvedRef + }, + dismiss: (version?: string) => { + dismissedVersion = version ?? null + }, + } +} const ConfigElectron = () => { let isCheckedUpdates = false + const foundGuard = createToastGuard() + const restartGuard = createToastGuard() const { isReleaseNotesViewed } = useAppSelector(appElectronInfoSelector) const serverInfo = useAppSelector(appServerInfoSelector) - const features = useAppSelector(appFeatureFlagsFeaturesSelector) const dispatch = useAppDispatch() const history = useHistory() + const { t } = useTranslation() useEffect(() => { window.app?.deepLinkAction?.(deepLinkAction) window.app?.updateAvailable?.(updateAvailableAction) + window.app?.updateState?.(updateStateAction) }, []) // Keyed on serverInfo only: must run once per load (consumes one-shot - // electron-store flags). Feature flags are already fetched — AppInit - // blocks rendering until they are. + // electron-store flags). useEffect(() => { if (serverInfo) { - ipcCheckUpdates(serverInfo, dispatch, features) + ipcCheckUpdates(serverInfo, dispatch) } }, [serverInfo]) @@ -64,19 +109,129 @@ const ConfigElectron = () => { } const updateAvailableAction = (_e: any, { version }: UpdateInfo) => { - sendEventTelemetry({ event: TelemetryEvent.UPDATE_NOTIFICATION_DISPLAYED }) + if (restartGuard.shouldSkip(version)) { + return + } + foundGuard.resolveCurrent() + dispatch(removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound)) + + const resolvedRef = restartGuard.beginShowing(version) + dispatch( + addInfiniteNotification( + INFINITE_MESSAGES.APP_UPDATE_AVAILABLE( + version, + () => { + resolvedRef.current = true + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_RESTART_CLICKED, + }) + ipcAppRestart() + }, + () => { + if (resolvedRef.current) return + resolvedRef.current = true + restartGuard.dismiss(version) + dispatch( + removeInfiniteNotification( + InfiniteMessagesIds.appUpdateAvailable, + ), + ) + }, + ), + ), + ) + + ipcGetUpdateDownloadedStrategy().then((strategy) => { + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DISPLAYED, + eventData: { strategy }, + }) + }) + } + + const showUpdateFoundToast = (version: string) => { + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DISPLAYED, + eventData: { strategy: AppUpdateStrategy.notify }, + }) + const resolvedRef = foundGuard.beginShowing(version) dispatch( addInfiniteNotification( - INFINITE_MESSAGES.APP_UPDATE_AVAILABLE(version, () => { - sendEventTelemetry({ - event: TelemetryEvent.UPDATE_NOTIFICATION_RESTART_CLICKED, - }) - ipcAppRestart() - }), + INFINITE_MESSAGES.APP_UPDATE_FOUND( + version, + () => { + if (resolvedRef.current) return + resolvedRef.current = true + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_DOWNLOAD_CLICKED, + }) + dispatch( + addInfiniteNotification( + INFINITE_MESSAGES.APP_UPDATE_DOWNLOADING(), + ), + ) + ipcAppUpdateDownload(version) + }, + () => { + if (resolvedRef.current) return + resolvedRef.current = true + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_SKIPPED, + }) + dispatch( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + ipcSkipUpdateVersion(version) + }, + () => { + if (!resolvedRef.current) { + resolvedRef.current = true + foundGuard.dismiss(version) + sendEventTelemetry({ + event: TelemetryEvent.UPDATE_NOTIFICATION_CLOSED, + }) + dispatch( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound), + ) + } + }, + ), ), ) } + const updateStateAction = (_e: any, { status, version }: AppUpdateState) => { + switch (status) { + case AppUpdateStatus.Available: + if (foundGuard.shouldSkip(version)) { + return + } + restartGuard.resolveCurrent() + dispatch( + removeInfiniteNotification(InfiniteMessagesIds.appUpdateAvailable), + ) + showUpdateFoundToast(version ?? '') + break + case AppUpdateStatus.Error: { + dispatch(removeInfiniteNotification(InfiniteMessagesIds.appUpdateFound)) + dispatch( + addMessageNotification({ + title: t('notification.error.appUpdateFailed.title'), + message: t('notification.error.appUpdateFailed.message'), + variant: 'danger', + }), + ) + const lastFoundVersion = foundGuard.lastVersion + if (lastFoundVersion !== null) { + showUpdateFoundToast(lastFoundVersion) + } + break + } + default: + break + } + } + return null } diff --git a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx index 173aa7fa7b..7f5b523c84 100644 --- a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx +++ b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx @@ -1,9 +1,12 @@ import React from 'react' import { + act, cleanup, createMockedStore, + fireEvent, mockedStore, render, + screen, } from 'uiSrc/utils/test-utils' import { @@ -13,14 +16,19 @@ import { } from 'uiSrc/electron/constants' import { addFreeDb, + fetchProfile, fetchUserInfo, getPlans, getUserInfo, + oauthCloudMfaSelector, setJob, + setMfaProfileRestore, setOAuthCloudSource, setSocialDialogState, showOAuthProgress, signInFailure, + submitMfaCode, + submitMfaCodeSuccess, } from 'uiSrc/slices/oauth/cloud' import { cloudSelector, @@ -31,6 +39,7 @@ import { addInfiniteNotification, } from 'uiSrc/slices/app/notifications' import { INFINITE_MESSAGES } from 'uiSrc/components/notifications/components' +import { apiService } from 'uiSrc/services' import ConfigOAuth from './ConfigOAuth' jest.mock('uiSrc/slices/oauth/cloud', () => ({ @@ -40,6 +49,12 @@ jest.mock('uiSrc/slices/oauth/cloud', () => ({ .mockImplementation( jest.requireActual('uiSrc/slices/oauth/cloud').fetchUserInfo, ), + fetchProfile: jest.fn().mockImplementation(() => () => {}), + oauthCloudMfaSelector: jest.fn().mockReturnValue({ + isOpenDialog: false, + loading: false, + error: '', + }), })) jest.mock('uiSrc/slices/instances/cloud', () => ({ @@ -49,6 +64,11 @@ jest.mock('uiSrc/slices/instances/cloud', () => ({ }), })) +const mockCloudSelector = cloudSelector as jest.Mock +const mockFetchUserInfo = fetchUserInfo as jest.Mock +const mockFetchProfile = fetchProfile as jest.Mock +const mockOauthCloudMfaSelector = oauthCloudMfaSelector as jest.Mock + let store: typeof mockedStore beforeEach(() => { cleanup() @@ -69,7 +89,7 @@ describe('ConfigOAuth', () => { }) it('should call proper actions on success', () => { - ;(cloudSelector as jest.Mock).mockReturnValue({ + mockCloudSelector.mockReturnValue({ ssoFlow: 'signIn', }) @@ -93,7 +113,7 @@ describe('ConfigOAuth', () => { }) it('should call proper actions on failed', () => { - ;(cloudSelector as jest.Mock).mockReturnValue({ + mockCloudSelector.mockReturnValue({ ssoFlow: 'signIn', }) @@ -121,7 +141,7 @@ describe('ConfigOAuth', () => { }) it('should fetch plans with create flow', () => { - ;(cloudSelector as jest.Mock).mockReturnValue({ + mockCloudSelector.mockReturnValue({ ssoFlow: 'create', }) @@ -130,7 +150,7 @@ describe('ConfigOAuth', () => { .mockImplementation( (onSuccessAction: () => void) => () => onSuccessAction(), ) - ;(fetchUserInfo as jest.Mock).mockImplementation(fetchUserInfoMock) + mockFetchUserInfo.mockImplementation(fetchUserInfoMock) window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), @@ -159,7 +179,7 @@ describe('ConfigOAuth', () => { }) it('should call fetch subscriptions with autodiscovery flow', () => { - ;(cloudSelector as jest.Mock).mockReturnValue({ + mockCloudSelector.mockReturnValue({ ssoFlow: 'import', }) @@ -168,7 +188,7 @@ describe('ConfigOAuth', () => { .mockImplementation( (onSuccessAction: () => void) => () => onSuccessAction(), ) - ;(fetchUserInfo as jest.Mock).mockImplementation(fetchUserInfoMock) + mockFetchUserInfo.mockImplementation(fetchUserInfoMock) window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), @@ -197,7 +217,7 @@ describe('ConfigOAuth', () => { }) it('should call create free job after success with recommended settings', () => { - ;(cloudSelector as jest.Mock).mockReturnValue({ + mockCloudSelector.mockReturnValue({ isRecommendedSettings: true, ssoFlow: 'create', }) @@ -207,7 +227,7 @@ describe('ConfigOAuth', () => { .mockImplementation( (onSuccessAction: () => void) => () => onSuccessAction(), ) - ;(fetchUserInfo as jest.Mock).mockImplementation(fetchUserInfoMock) + mockFetchUserInfo.mockImplementation(fetchUserInfoMock) window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), @@ -234,4 +254,66 @@ describe('ConfigOAuth', () => { ...expectedActions, ]) }) + + it('should resume the sign in flow after mfa verification', async () => { + mockCloudSelector.mockReturnValue({ + ssoFlow: 'signIn', + }) + mockFetchUserInfo.mockImplementation( + jest.requireActual('uiSrc/slices/oauth/cloud').fetchUserInfo, + ) + mockOauthCloudMfaSelector.mockReturnValue({ + isOpenDialog: true, + loading: false, + error: '', + }) + apiService.post = jest.fn().mockResolvedValue({ status: 200 }) + apiService.get = jest.fn().mockResolvedValue({ status: 200, data: {} }) + + renderConfigOAuth() + + // pasting the full code auto-submits and completes the pending login + await act(async () => { + fireEvent.paste(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + clipboardData: { getData: () => '123456' }, + }) + }) + + const expectedActions = [ + submitMfaCode(), + submitMfaCodeSuccess(), + addInfiniteNotification(INFINITE_MESSAGES.AUTHENTICATING()), + setMfaProfileRestore(false), + getUserInfo(), + ] + expect(store.getActions().slice(0, expectedActions.length)).toEqual( + expectedActions, + ) + }) + + it('should resume the profile restore, not the sign in flow, after mfa verification', async () => { + mockCloudSelector.mockReturnValue({}) + mockFetchUserInfo.mockClear() + mockFetchProfile.mockClear() + mockOauthCloudMfaSelector.mockReturnValue({ + isOpenDialog: true, + loading: false, + error: '', + isProfileRestore: true, + }) + apiService.post = jest.fn().mockResolvedValue({ status: 200 }) + + renderConfigOAuth() + + await act(async () => { + fireEvent.paste(screen.getByTestId('oauth-mfa-dialog-code-input-0'), { + clipboardData: { getData: () => '123456' }, + }) + }) + + // a restored session re-fetches its profile; it must not enter the + // interactive create/select-database flow + expect(fetchProfile).toHaveBeenCalled() + expect(fetchUserInfo).not.toHaveBeenCalled() + }) }) diff --git a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.tsx b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.tsx index a9c4aa9ecd..ddb4d071ab 100644 --- a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.tsx +++ b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.tsx @@ -1,12 +1,15 @@ -import { useEffect, useRef } from 'react' +import React, { useEffect, useRef } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { useHistory } from 'react-router-dom' import { createFreeDbJob, fetchPlans, + fetchProfile, fetchUserInfo, + oauthCloudMfaSelector, setJob, + setMfaProfileRestore, setOAuthCloudSource, setSocialDialogState, showOAuthProgress, @@ -36,12 +39,15 @@ import { } from 'uiSrc/components/notifications/components' import { localStorageService } from 'uiSrc/services' import { CustomError, OAuthSocialAction } from 'uiSrc/slices/interfaces' +import { OAuthMfaDialog } from 'uiSrc/components/oauth' const ConfigOAuth = () => { const { ssoFlow, isRecommendedSettings } = useAppSelector(cloudSelector) + const { isProfileRestore } = useAppSelector(oauthCloudMfaSelector) const ssoFlowRef = useRef(ssoFlow) const isRecommendedSettingsRef = useRef(isRecommendedSettings) + const isProfileRestoreRef = useRef(isProfileRestore) const isFlowInProgress = useRef(false) const history = useHistory() @@ -63,6 +69,10 @@ const ConfigOAuth = () => { isRecommendedSettingsRef.current = isRecommendedSettings }, [isRecommendedSettings]) + useEffect(() => { + isProfileRestoreRef.current = isProfileRestore + }, [isProfileRestore]) + const fetchUserInfoSuccess = (isSelectAccout: boolean) => { if (isSelectAccout) return @@ -155,7 +165,23 @@ const ConfigOAuth = () => { } } - return null + const onMfaVerified = () => { + dispatch(addInfiniteNotification(INFINITE_MESSAGES.AUTHENTICATING())) + const isProfileRestoreVerified = isProfileRestoreRef.current + // the origin has been consumed; clear it so it can't leak into a later flow + dispatch(setMfaProfileRestore(false)) + // a startup restore only needs its profile re-fetched; routing it through + // fetchUserInfo would open the interactive create/select-database flow + if (isProfileRestoreVerified) { + dispatch( + fetchProfile(closeInfinityNotification, closeInfinityNotification), + ) + return + } + dispatch(fetchUserInfo(fetchUserInfoSuccess, closeInfinityNotification)) + } + + return } export default ConfigOAuth diff --git a/redisinsight/ui/src/electron/constants/index.ts b/redisinsight/ui/src/electron/constants/index.ts index 77c0560b20..f2f7fb9f89 100644 --- a/redisinsight/ui/src/electron/constants/index.ts +++ b/redisinsight/ui/src/electron/constants/index.ts @@ -3,5 +3,6 @@ import ElectronStorageItem from './storageElectron' export * from './ipcEvent' export * from './cloudAuth' export * from './deepLink' +export * from './updateStrategy' export { ElectronStorageItem } diff --git a/redisinsight/ui/src/electron/constants/ipcEvent.ts b/redisinsight/ui/src/electron/constants/ipcEvent.ts index 13deb32efb..c72a2179ea 100644 --- a/redisinsight/ui/src/electron/constants/ipcEvent.ts +++ b/redisinsight/ui/src/electron/constants/ipcEvent.ts @@ -7,6 +7,10 @@ enum IpcInvokeEvent { themeChange = 'theme:change', appRestart = 'app:restart', setSentryConsent = 'sentry:set:consent', + getUpdateStrategy = 'app:update:strategy:get', + setUpdateStrategy = 'app:update:strategy:set', + appUpdateDownload = 'app:update:download', + skipUpdateVersion = 'app:update:skip', } enum IpcOnEvent { @@ -15,6 +19,7 @@ enum IpcOnEvent { azureOauthCallback = 'azure:oauth:callback', deepLinkAction = 'deep-link:action', appUpdateAvailable = 'app:update:available', + appUpdateState = 'app:update:state', } export { IpcInvokeEvent, IpcOnEvent } diff --git a/redisinsight/ui/src/electron/constants/storageElectron.ts b/redisinsight/ui/src/electron/constants/storageElectron.ts index 8e0af7a531..9eeaad91df 100644 --- a/redisinsight/ui/src/electron/constants/storageElectron.ts +++ b/redisinsight/ui/src/electron/constants/storageElectron.ts @@ -5,6 +5,9 @@ enum ElectronStorageItem { isUpdateAvailable = 'isUpdateAvailable', isDisplayAppInTray = 'isDisplayAppInTray', updatePreviousVersion = 'updatePreviousVersion', + updateStrategy = 'updateStrategy', + updateSkippedVersion = 'updateSkippedVersion', + updateDownloadedStrategy = 'updateDownloadedStrategy', zoomFactor = 'zoomFactor', themeSource = 'themeSource', bounds = 'bounds', diff --git a/redisinsight/ui/src/electron/constants/updateStrategy.ts b/redisinsight/ui/src/electron/constants/updateStrategy.ts new file mode 100644 index 0000000000..bdef4b5a28 --- /dev/null +++ b/redisinsight/ui/src/electron/constants/updateStrategy.ts @@ -0,0 +1,14 @@ +export enum AppUpdateStrategy { + auto = 'auto', + notify = 'notify', +} + +export enum AppUpdateStatus { + Available = 'available', + Error = 'error', +} + +export interface AppUpdateState { + status: AppUpdateStatus + version?: string +} diff --git a/redisinsight/ui/src/electron/utils/index.ts b/redisinsight/ui/src/electron/utils/index.ts index 30c2ce2318..581df729f9 100644 --- a/redisinsight/ui/src/electron/utils/index.ts +++ b/redisinsight/ui/src/electron/utils/index.ts @@ -3,5 +3,6 @@ import { ipcCheckUpdates, ipcSendEvents } from './ipcCheckUpdates' export * from './ipcAuth' export * from './ipcAppRestart' export * from './ipcThemeChange' +export * from './ipcAppUpdate' export { ipcCheckUpdates, ipcSendEvents } diff --git a/redisinsight/ui/src/electron/utils/ipcAppUpdate.ts b/redisinsight/ui/src/electron/utils/ipcAppUpdate.ts new file mode 100644 index 0000000000..81596241b9 --- /dev/null +++ b/redisinsight/ui/src/electron/utils/ipcAppUpdate.ts @@ -0,0 +1,28 @@ +import { + AppUpdateStrategy, + ElectronStorageItem, + IpcInvokeEvent, +} from 'uiSrc/electron/constants' + +export const ipcGetUpdateStrategy = + async (): Promise => + (await window.app?.ipc?.invoke(IpcInvokeEvent.getUpdateStrategy)) ?? null + +export const ipcGetUpdateDownloadedStrategy = + async (): Promise => + (await window.app?.ipc?.invoke( + IpcInvokeEvent.getStoreValue, + ElectronStorageItem.updateDownloadedStrategy, + )) ?? AppUpdateStrategy.auto + +export const ipcSetUpdateStrategy = async (strategy: AppUpdateStrategy) => { + await window.app?.ipc?.invoke(IpcInvokeEvent.setUpdateStrategy, strategy) +} + +export const ipcAppUpdateDownload = async (version: string) => { + await window.app?.ipc?.invoke(IpcInvokeEvent.appUpdateDownload, version) +} + +export const ipcSkipUpdateVersion = async (version: string) => { + await window.app?.ipc?.invoke(IpcInvokeEvent.skipUpdateVersion, version) +} diff --git a/redisinsight/ui/src/electron/utils/ipcCheckUpdates.ts b/redisinsight/ui/src/electron/utils/ipcCheckUpdates.ts index 629919e57f..37f0b5aef5 100644 --- a/redisinsight/ui/src/electron/utils/ipcCheckUpdates.ts +++ b/redisinsight/ui/src/electron/utils/ipcCheckUpdates.ts @@ -5,35 +5,32 @@ import { ReleaseNotesSource, WhatsNewSource } from 'uiSrc/constants/telemetry' import { setElectronInfo, setReleaseNotesViewed } from 'uiSrc/slices/app/info' import { addMessageNotification } from 'uiSrc/slices/app/notifications' import { openWhatsNew } from 'uiSrc/slices/app/whatsNew' -import { FeatureFlagsMap, isWhatsNewEligible } from 'uiSrc/utils' +import { isWhatsNewEligible } from 'uiSrc/utils' import { localStorageService } from 'uiSrc/services' -import { BrowserStorageItem, FeatureFlags } from 'uiSrc/constants' +import { BrowserStorageItem } from 'uiSrc/constants' import successMessages from 'uiSrc/components/notifications/success-messages' import { GetServerInfoResponse } from 'apiClient' -import { ElectronStorageItem, IpcInvokeEvent } from '../constants' +import { + AppUpdateStrategy, + ElectronStorageItem, + IpcInvokeEvent, +} from '../constants' /** * Whether the What's New modal should replace the update toast for the just * installed version. Flag-gated cards render as "Coming soon", so no card * visibility check is needed. */ -const shouldOpenWhatsNew = ( - version: string, - features?: FeatureFlagsMap, -): boolean => { +const shouldOpenWhatsNew = (version: string): boolean => { const lastVersionSeen = localStorageService?.get(BrowserStorageItem.whatsNewLastVersionSeen) ?? null - return ( - !!features?.[FeatureFlags.whatsNew]?.flag && - isWhatsNewEligible(version, lastVersionSeen) - ) + return isWhatsNewEligible(version, lastVersionSeen) } export const ipcCheckUpdates = async ( serverInfo: GetServerInfoResponse, dispatch: Dispatch, - features?: FeatureFlagsMap, ) => { const isUpdateDownloaded = await window.app.ipc.invoke( IpcInvokeEvent.getStoreValue, @@ -51,7 +48,7 @@ export const ipcCheckUpdates = async ( if (isUpdateDownloaded && !isUpdateAvailable) { if ( serverInfo.appVersion === updateDownloadedVersion && - shouldOpenWhatsNew(updateDownloadedVersion, features) + shouldOpenWhatsNew(updateDownloadedVersion) ) { dispatch(openWhatsNew(updateDownloadedVersion)) sendEventTelemetry({ @@ -113,12 +110,17 @@ export const ipcSendEvents = async (serverInfo: GetServerInfoResponse) => { IpcInvokeEvent.getStoreValue, ElectronStorageItem.updatePreviousVersion, ) + const strategy = await window.app.ipc.invoke( + IpcInvokeEvent.getStoreValue, + ElectronStorageItem.updateDownloadedStrategy, + ) sendEventTelemetry({ event: TelemetryEvent.APPLICATION_UPDATED, eventData: { ...omit(serverInfo, ['id', 'createDateTime']), fromVersion: prevVer, toVersion: newVer, + strategy: strategy ?? AppUpdateStrategy.auto, }, }) await window.app.ipc.invoke( diff --git a/redisinsight/ui/src/electron/utils/tests/ipcCheckUpdates.spec.ts b/redisinsight/ui/src/electron/utils/tests/ipcCheckUpdates.spec.ts index 290cd7a83d..2f8b8066f2 100644 --- a/redisinsight/ui/src/electron/utils/tests/ipcCheckUpdates.spec.ts +++ b/redisinsight/ui/src/electron/utils/tests/ipcCheckUpdates.spec.ts @@ -2,19 +2,23 @@ import { cloneDeep } from 'lodash' import { GetServerInfoResponse } from 'apiClient' import { cleanup, mockedStore } from 'uiSrc/utils/test-utils' -import { FeatureFlagsMap, whatsNewFeed } from 'uiSrc/utils' +import { whatsNewFeed } from 'uiSrc/utils' import { openWhatsNew } from 'uiSrc/slices/app/whatsNew' import { addMessageNotification } from 'uiSrc/slices/app/notifications' -import { FeatureFlags } from 'uiSrc/constants' +import { TelemetryEvent } from 'uiSrc/telemetry' +import { AppUpdateStrategy } from 'uiSrc/electron/constants' import { ipcCheckUpdates, ipcSendEvents } from '../ipcCheckUpdates' +jest.mock('uiSrc/telemetry', () => ({ + ...jest.requireActual('uiSrc/telemetry'), + sendEventTelemetry: jest.fn(), +})) + +const { sendEventTelemetry } = jest.requireMock('uiSrc/telemetry') + const serverInfoMock = (appVersion: string): GetServerInfoResponse => ({ appVersion }) as unknown as GetServerInfoResponse -const whatsNewOnFeatures: FeatureFlagsMap = { - [FeatureFlags.whatsNew]: { flag: true }, -} - const invokeMock = jest.fn() let store: typeof mockedStore beforeEach(() => { @@ -39,48 +43,26 @@ describe('ipcCheckUpdates', () => { expect(invokeMock).toBeCalled() }) - it('should open Whats New when enabled and the version is eligible', async () => { + it('should open Whats New when the version is eligible', async () => { const version = whatsNewFeed[0].version invokeMock .mockReturnValueOnce(true) .mockReturnValueOnce(false) .mockReturnValueOnce(version) - await ipcCheckUpdates( - serverInfoMock(version), - store.dispatch, - whatsNewOnFeatures, - ) + await ipcCheckUpdates(serverInfoMock(version), store.dispatch) expect(store.getActions()).toContainEqual(openWhatsNew(version)) }) - it('should not open Whats New for an ineligible version even when enabled', async () => { + it('should fall back to the update toast for an ineligible version', async () => { const version = '0.0.1' invokeMock .mockReturnValueOnce(true) .mockReturnValueOnce(false) .mockReturnValueOnce(version) - await ipcCheckUpdates( - serverInfoMock(version), - store.dispatch, - whatsNewOnFeatures, - ) - - const actionTypes = store.getActions().map((action) => action.type) - expect(actionTypes).not.toContain(openWhatsNew.type) - expect(actionTypes).toContain(addMessageNotification.type) - }) - - it('should fall back to the update toast when Whats New is disabled', async () => { - const version = whatsNewFeed[0].version - invokeMock - .mockReturnValueOnce(true) - .mockReturnValueOnce(false) - .mockReturnValueOnce(version) - - await ipcCheckUpdates(serverInfoMock(version), store.dispatch, {}) + await ipcCheckUpdates(serverInfoMock(version), store.dispatch) const actionTypes = store.getActions().map((action) => action.type) expect(actionTypes).not.toContain(openWhatsNew.type) @@ -96,11 +78,7 @@ describe('ipcCheckUpdates', () => { .mockReturnValueOnce(false) .mockReturnValueOnce(version) - await ipcCheckUpdates( - serverInfoMock(version), - store.dispatch, - whatsNewOnFeatures, - ) + await ipcCheckUpdates(serverInfoMock(version), store.dispatch) expect(store.getActions()).toContainEqual(openWhatsNew(version)) }) @@ -114,4 +92,24 @@ describe('ipcSendEvents', () => { expect(invokeMock).toBeCalled() }) + + it('should default the strategy to auto for a legacy download with no stored strategy', async () => { + invokeMock + .mockReturnValueOnce(true) // isUpdateDownloadedForTelemetry + .mockReturnValueOnce(false) // isUpdateAvailable + .mockReturnValueOnce('2.0.0') // newVer + .mockReturnValueOnce('1.0.0') // prevVer + .mockReturnValueOnce(undefined) // updateDownloadedStrategy - never written by a pre-feature build + + await ipcSendEvents(serverInfoMock('2.0.0')) + + expect(sendEventTelemetry).toHaveBeenCalledWith( + expect.objectContaining({ + event: TelemetryEvent.APPLICATION_UPDATED, + eventData: expect.objectContaining({ + strategy: AppUpdateStrategy.auto, + }), + }), + ) + }) }) diff --git a/redisinsight/ui/src/i18n/README.md b/redisinsight/ui/src/i18n/README.md index 563bb6c9df..40e6bb6f98 100644 --- a/redisinsight/ui/src/i18n/README.md +++ b/redisinsight/ui/src/i18n/README.md @@ -20,7 +20,7 @@ Add `myKey` to `locales/en.json` first; `t()` rejects unknown keys at compile ti ## Extraction -`yarn i18n:extract` (from repo root) scans `t()` usages and updates `locales/en.json` / `locales/bg.json` via `i18next-cli` (config: `i18next.config.mjs`). +`npm run i18n:extract` (from repo root) scans `t()` usages and updates `locales/en.json` / `locales/bg.json` via `i18next-cli` (config: `i18next.config.mjs`). ## Tests diff --git a/redisinsight/ui/src/i18n/locales/bg.json b/redisinsight/ui/src/i18n/locales/bg.json index 8a666402c8..1c6917553d 100644 --- a/redisinsight/ui/src/i18n/locales/bg.json +++ b/redisinsight/ui/src/i18n/locales/bg.json @@ -1,4 +1,128 @@ { + "addDatabase.button.addDatabase": "Добавяне на база данни", + "addDatabase.button.cancel": "Отказ", + "addDatabase.button.connectionSettings": "Настройки на връзката", + "addDatabase.button.testConnection": "Тест на връзката", + "addDatabase.cloud.addDatabases": "Добавяне на бази данни", + "addDatabase.cloud.freeBadge": "БЕЗПЛАТНО", + "addDatabase.cloud.newDatabase": "Създай си нова база данни", + "addDatabase.cloud.title": "Започнете с акаунт в Redis Cloud", + "addDatabase.connectionUrl.error": "Предоставеният формат на URL адреса за връзка не се поддържа.
Опитайте да промените настройките на връзката за свързване.", + "addDatabase.connectionUrl.label": "URL адрес за връзка", + "addDatabase.divider.or": "Или", + "addDatabase.modal.title": "Добавяне на база данни", + "addDatabase.moreOptions.title": "Още опции за свързване", + "addDatabase.option.azure": "Azure Managed Redis", + "addDatabase.option.import": "Импортиране от файл", + "addDatabase.option.sentinel": "Redis Sentinel", + "addDatabase.option.software": "Redis Software", + "analytics.clusterDetails.graphics.keys": "Ключове", + "analytics.clusterDetails.graphics.memory": "Памет", + "analytics.clusterDetails.header.defaultUsername": "По подразбиране", + "analytics.clusterDetails.header.type": "Тип", + "analytics.clusterDetails.header.uptime": "Време на работа", + "analytics.clusterDetails.header.user": "Потребител", + "analytics.clusterDetails.header.version": "Версия", + "analytics.clusterDetails.pageTitle": "{{dbName}} - Преглед", + "analytics.clusterDetails.table.clients": "Клиенти", + "analytics.clusterDetails.table.commandsPerSec": "Команди/сек", + "analytics.clusterDetails.table.emptyState": "Данните за първичните възли не са налични за тази клъстерна конфигурация.", + "analytics.clusterDetails.table.networkInput": "Входящ трафик", + "analytics.clusterDetails.table.networkOutput": "Изходящ трафик", + "analytics.clusterDetails.table.primaryNodes_one": "{{count}} първичен възел", + "analytics.clusterDetails.table.primaryNodes_other": "{{count}} първични възела", + "analytics.clusterDetails.table.totalKeys": "Общо ключове", + "analytics.clusterDetails.table.totalMemory": "Обща памет", + "analytics.databaseAnalysis.empty.encrypt.text": "Не може да се декриптира. Проверете системния ключодържател или изпълнете отново генерирането на отчета.", + "analytics.databaseAnalysis.empty.encrypt.title": "Криптирани данни", + "analytics.databaseAnalysis.empty.keys.text": "Използвайте ръководствата и уроците на Работна среда, за да заредите бързо данните.", + "analytics.databaseAnalysis.empty.keys.title": "Няма ключове за показване", + "analytics.databaseAnalysis.empty.reports.text": "Щракнете върху „Анализирай“, за да генерирате първия отчет.", + "analytics.databaseAnalysis.empty.reports.title": "Не са намерени отчети", + "analytics.databaseAnalysis.expiration.showNoExpiry": "Показване на „Без изтичане“", + "analytics.databaseAnalysis.expiration.title": "ПАМЕТ, КОЯТО ВЕРОЯТНО ЩЕ БЪДЕ ОСВОБОДЕНА С ВРЕМЕТО", + "analytics.databaseAnalysis.extrapolateResults": "Екстраполиране на резултатите", + "analytics.databaseAnalysis.header.newReport": "Нов отчет", + "analytics.databaseAnalysis.header.newReportAria": "Нови отчети", + "analytics.databaseAnalysis.header.reportGeneratedOn": "Отчетът е генериран на:", + "analytics.databaseAnalysis.header.scanned": "Сканирани {{percentage}}", + "analytics.databaseAnalysis.header.scannedKeys": "({{processed}}/{{total}} ключа)", + "analytics.databaseAnalysis.header.tooltipContent": "Анализирайте до 10 000 ключа, за да получите преглед на вашите данни и съвети как да спестите памет и да оптимизирате използването на базата данни.", + "analytics.databaseAnalysis.header.tooltipContentCluster": "Анализирайте до 10 000 ключа на шард, за да получите преглед на вашите данни и съвети как да спестите памет и да оптимизирате използването на базата данни.", + "analytics.databaseAnalysis.header.tooltipTitle": "Анализ на базата данни", + "analytics.databaseAnalysis.pageTitle": "{{dbName}} - Анализ на базата данни", + "analytics.databaseAnalysis.recommendations.empty.line1": "Няма съвети в момента,", + "analytics.databaseAnalysis.recommendations.empty.line2": "продължавайте в същия дух!", + "analytics.databaseAnalysis.recommendations.empty.title": "ОТЛИЧНА РАБОТА!", + "analytics.databaseAnalysis.recommendations.redisStackTooltip": "Redis Stack", + "analytics.databaseAnalysis.recommendations.tutorial": "Урок", + "analytics.databaseAnalysis.summaryPerData.keys": "Ключове", + "analytics.databaseAnalysis.summaryPerData.memory": "Памет", + "analytics.databaseAnalysis.summaryPerData.title": "ОБОБЩЕНИЕ ПО ТИП ДАННИ", + "analytics.databaseAnalysis.tabs.dataSummary": "Обобщение на данните", + "analytics.databaseAnalysis.tabs.tips": "Съвети", + "analytics.databaseAnalysis.topKeys.byLength": "по дължина", + "analytics.databaseAnalysis.topKeys.byMemory": "по памет", + "analytics.databaseAnalysis.topKeys.considerSplitting": "Обмислете разделянето му на няколко ключа", + "analytics.databaseAnalysis.topKeys.keyName": "Име на ключа", + "analytics.databaseAnalysis.topKeys.keySize": "Размер на ключа", + "analytics.databaseAnalysis.topKeys.keyType": "Тип на ключа", + "analytics.databaseAnalysis.topKeys.length": "Дължина", + "analytics.databaseAnalysis.topKeys.noLimit": "Без ограничение", + "analytics.databaseAnalysis.topKeys.timeToLive": "Време на живот", + "analytics.databaseAnalysis.topKeys.title": "НАЙ-ГОЛЕМИ КЛЮЧОВЕ", + "analytics.databaseAnalysis.topKeys.titleMax": "НАЙ-ГОЛЕМИ {{max}} КЛЮЧА", + "analytics.databaseAnalysis.topKeys.ttl": "TTL", + "analytics.databaseAnalysis.topNamespaces.byMemory": "по памет", + "analytics.databaseAnalysis.topNamespaces.byNumberOfKeys": "по брой ключове", + "analytics.databaseAnalysis.topNamespaces.dataType": "Тип данни", + "analytics.databaseAnalysis.topNamespaces.empty.text": "Конфигурирайте разделителя в Дървовиден изглед, за да персонализирате показваните именни пространства.", + "analytics.databaseAnalysis.topNamespaces.empty.title": "Няма именни пространства за показване", + "analytics.databaseAnalysis.topNamespaces.keyPattern": "Шаблон на ключа", + "analytics.databaseAnalysis.topNamespaces.title": "НАЙ-ГОЛЕМИ ИМЕННИ ПРОСТРАНСТВА", + "analytics.databaseAnalysis.topNamespaces.totalKeys": "Общо ключове", + "analytics.databaseAnalysis.topNamespaces.totalMemory": "Обща памет", + "analytics.nav.databaseAnalysis": "Анализ на базата данни", + "analytics.nav.overview": "Преглед", + "analytics.nav.slowLog": "Бавни команди", + "analytics.slowLog.actions.clear": "Изчистване на бавни команди", + "analytics.slowLog.actions.configure": "Конфигуриране", + "analytics.slowLog.actions.tooltip.body": "Бавните команди са списък с бавни операции за вашата Redis инстанция. Те могат да се използват за отстраняване на проблеми с производителността.Всеки запис в списъка показва командата, продължителността и времевия печат. Всяка транзакция, която надвишава slowlog-log-slower-than {{unit}}, се записва до максимум slowlog-max-len, след което по-старите записи се премахват.", + "analytics.slowLog.actions.tooltip.title": "Бавни команди", + "analytics.slowLog.clearModal.button.cancel": "Отказ", + "analytics.slowLog.clearModal.button.clear": "Изчистване", + "analytics.slowLog.clearModal.message": "Бавните команди ще бъдат изчистени за {{name}}", + "analytics.slowLog.clearModal.note": "ЗАБЕЛЕЖКА: Това е конфигурация на сървъра", + "analytics.slowLog.clearModal.title": "Изчистване на бавни команди", + "analytics.slowLog.config.button.cancel": "Отказ", + "analytics.slowLog.config.button.default": "По подразбиране", + "analytics.slowLog.config.button.ok": "Ок", + "analytics.slowLog.config.button.save": "Запазване", + "analytics.slowLog.config.cluster": "Всеки възел може да има различна конфигурация на бавните команди в клъстерирана база данни.Използвайте CONFIG SET slowlog-log-slower-than или CONFIG SET slowlog-max-len за конкретен възел в redis-cli, за да я конфигурирате.", + "analytics.slowLog.config.maxLen.help": "Дължината на списъка с бавни команди. Когато се записва нова команда, най-старата
се премахва от опашката със записани команди.", + "analytics.slowLog.config.note": "ЗАБЕЛЕЖКА: Това е конфигурация на сървъра", + "analytics.slowLog.config.slowerThan.help": "Време за изпълнение, което да бъде надвишено, за да се запише командата.
-1 деактивира записването на бавни команди. 0 записва всяка команда.", + "analytics.slowLog.empty.description": "Или не са намерени команди, надвишаващи {{value}} {{unit}}, или записването на бавни команди е деактивирано на сървъра.", + "analytics.slowLog.empty.imageAlt": "Няма бавни команди", + "analytics.slowLog.empty.title": "Не са намерени бавни команди", + "analytics.slowLog.page.displayPerNode": "Показване на възел:", + "analytics.slowLog.page.displayUpTo": "Показване до:", + "analytics.slowLog.page.entriesFrom": "от", + "analytics.slowLog.page.entries_one": "{{count}} запис", + "analytics.slowLog.page.entries_other": "{{count}} записа", + "analytics.slowLog.page.executionInfo": "Време за изпълнение: {{time}} {{unit}}, Макс. дължина: {{maxLen}}", + "analytics.slowLog.page.maxAvailable": "Максимално налични", + "analytics.slowLog.page.pageTitle": "{{dbName}} - Бавни команди", + "analytics.slowLog.page.title": "Бавни команди", + "analytics.slowLog.table.command": "Команда", + "analytics.slowLog.table.duration": "Продължителност, {{unit}}", + "analytics.slowLog.table.timestamp": "Времеви печат", + "analytics.units.bytes": "Б", + "analytics.units.kbps": "кб/с", + "analytics.units.microseconds": "мкс", + "analytics.units.milliseconds": "мс", + "analytics.units.msec": "мсек", + "analytics.units.percent": "%", "api.agreement.analytics.description": "Помогнете за подобряването на Redis Insight, като споделяте анонимни данни за употреба. Това ни помага да разберем използването на функциите и да направим приложението по-добро. Активирайки това, се съгласявате с нашата ", "api.agreement.analytics.label": "Данни за употреба", "api.agreement.notifications.description": "Изберете, за да се показват известия. В противен случай известията се показват в Центъра за известия.", @@ -57,6 +181,12 @@ "api.error.code.11024.button.signIn": "Вход в Azure", "api.error.code.11024.message": "Azure Entra ID токенът Ви изтече. Влезте отново в Azure, за да продължите.", "api.error.code.11024.title": "Azure сесията изтече", + "api.error.code.11025.message": "Въведете кода от приложението си за удостоверяване, за да завършите входа в Redis Cloud.", + "api.error.code.11025.title": "Изисква се код за потвърждение", + "api.error.code.11026.message": "Твърде много опити за удостоверяване. Изчакайте няколко минути и влезте отново.", + "api.error.code.11026.title": "Твърде много опити", + "api.error.code.11027.message": "Невалиден или изтекъл код. Опитайте отново.", + "api.error.code.11027.title": "Неуспешно потвърждение", "api.error.code.11100.message": "Възникна неочаквана грешка.\n{{detail}}", "api.error.code.11100.title": "Неочаквана грешка", "api.error.code.11101.message": "Отдалеченото задание беше прекратено.", @@ -191,6 +321,290 @@ "api.error.code.12404.title": "Ресурсът не е намерен", "api.error.code.12409.title": "Конфликт", "api.error.code.12500.title": "Сървърна грешка", + "autodiscover.azure.button.addDatabase": "Добавяне на база данни", + "autodiscover.azure.button.cancel": "Отказ", + "autodiscover.azure.button.manualConnection": "Ръчно свързване", + "autodiscover.azure.column.databaseName": "Име на база данни", + "autodiscover.azure.column.number": "#", + "autodiscover.azure.column.region": "Регион", + "autodiscover.azure.column.state": "Състояние", + "autodiscover.azure.column.status": "Статус", + "autodiscover.azure.column.subscriptionId": "ID на абонамент", + "autodiscover.azure.column.subscriptionName": "Име на абонамент", + "autodiscover.azure.column.type": "Тип", + "autodiscover.azure.databaseType.enterprise.description": "Azure Cache for Redis Enterprise със специализирана инфраструктура, по-висока производителност и поддръжка на Redis модули.", + "autodiscover.azure.databaseType.enterprise.label": "Enterprise", + "autodiscover.azure.databaseType.standard.description": "Azure Cache for Redis с нива Basic, Standard или Premium. Подходящо за повечето сценарии на кеширане.", + "autodiscover.azure.databaseType.standard.label": "Standard", + "autodiscover.azure.databases.addButtonEmpty": "Добавяне на бази данни", + "autodiscover.azure.databases.addButton_one": "Добавяне ({{count}}) база данни", + "autodiscover.azure.databases.addButton_other": "Добавяне ({{count}}) бази данни", + "autodiscover.azure.databases.addFailedDefault": "Неуспешно добавяне на база данни", + "autodiscover.azure.databases.addFailedTitle_one": "Неуспешно добавяне на {{count}} база данни", + "autodiscover.azure.databases.addFailedTitle_other": "Неуспешно добавяне на {{count}} бази данни", + "autodiscover.azure.databases.addedMultiple": "{{count}} бази данни", + "autodiscover.azure.databases.auth": "Удостоверяване:", + "autodiscover.azure.databases.authAccessKey": "Ключ за достъп", + "autodiscover.azure.databases.authEntraId": "Microsoft Entra ID (Препоръчително)", + "autodiscover.azure.databases.backButton": "Абонаменти", + "autodiscover.azure.databases.defaultDatabaseName": "База данни", + "autodiscover.azure.databases.empty": "Не са намерени Redis бази данни в този абонамент.", + "autodiscover.azure.databases.maxSelection": "Максимум {{max}} бази данни могат да бъдат добавени наведнъж.", + "autodiscover.azure.databases.pageTitle": "Azure бази данни", + "autodiscover.azure.databases.refreshAria": "Обновяване на бази данни", + "autodiscover.azure.databases.subscription": "Абонамент:", + "autodiscover.azure.databases.title": "Azure Redis бази данни", + "autodiscover.azure.databases.unknownDatabase": "база данни", + "autodiscover.azure.manual.aliasLabel": "Псевдоним на база данни", + "autodiscover.azure.manual.aliasPlaceholder": "Въведете псевдоним на база данни", + "autodiscover.azure.manual.aliasRequired": "Псевдонимът на базата данни е задължителен", + "autodiscover.azure.manual.backButton": "Бази данни", + "autodiscover.azure.manual.entraCredentialsInfo": "Удостоверяването ще използва вашите идентификационни данни за Azure Entra ID", + "autodiscover.azure.manual.hostLabel": "Хост", + "autodiscover.azure.manual.hostPlaceholder": "Въведете име на хост / IP адрес / частна крайна точка", + "autodiscover.azure.manual.hostRequired": "Хостът е задължителен", + "autodiscover.azure.manual.pageTitle": "Ръчно свързване с Azure", + "autodiscover.azure.manual.portLabel": "Порт", + "autodiscover.azure.manual.portPlaceholder": "Въведете порт", + "autodiscover.azure.manual.portRequired": "Портът е задължителен", + "autodiscover.azure.manual.serverNameLabel": "Име на сървър", + "autodiscover.azure.manual.serverNameRequired": "Името на сървъра е задължително, когато SNI е активиран", + "autodiscover.azure.manual.sniInfo": "Активирайте SNI, когато се свързвате чрез Private Link с помощта на IP адрес. Въведете оригиналното Redis име на хост като Име на сървър.", + "autodiscover.azure.manual.timeoutLabel": "Таймаут (с)", + "autodiscover.azure.manual.timeoutPlaceholder": "Въведете таймаут (в секунди)", + "autodiscover.azure.manual.title": "Ръчно свързване с Azure", + "autodiscover.azure.manual.tlsAlwaysEnabled": "TLS е винаги активиран за връзки с Azure Cache for Redis.", + "autodiscover.azure.manual.tlsSettings": "TLS настройки", + "autodiscover.azure.manual.useSni": "Използване на SNI", + "autodiscover.azure.manual.usernameLabel": "Потребителско име", + "autodiscover.azure.manual.usernamePlaceholder": "Въведете потребителско име", + "autodiscover.azure.manual.verifyServerCert": "Проверка на сертификата на сървъра", + "autodiscover.azure.manual.verifyServerCertInfo": "Препоръчително за продукция. Проверява дали сертификатът на сървъра съответства на името на хоста.", + "autodiscover.azure.provisioningState.configuringAad.description": "Удостоверяването с Entra ID (Azure AD) се конфигурира.", + "autodiscover.azure.provisioningState.configuringAad.label": "ConfiguringAAD", + "autodiscover.azure.provisioningState.creating.description": "Базата данни се създава и все още не е налична.", + "autodiscover.azure.provisioningState.creating.label": "Creating", + "autodiscover.azure.provisioningState.deleting.description": "Базата данни се изтрива.", + "autodiscover.azure.provisioningState.deleting.label": "Deleting", + "autodiscover.azure.provisioningState.exporting.description": "Данните се експортират от базата данни.", + "autodiscover.azure.provisioningState.exporting.label": "Exporting", + "autodiscover.azure.provisioningState.failed.description": "Осигуряването е неуспешно. Базата данни не може да се използва.", + "autodiscover.azure.provisioningState.failed.label": "Failed", + "autodiscover.azure.provisioningState.importing.description": "Данните се импортират в базата данни.", + "autodiscover.azure.provisioningState.importing.label": "Importing", + "autodiscover.azure.provisioningState.linking.description": "Базата данни се свързва за гео-репликация.", + "autodiscover.azure.provisioningState.linking.label": "Linking", + "autodiscover.azure.provisioningState.provisioning.description": "Базата данни се осигурява.", + "autodiscover.azure.provisioningState.provisioning.label": "Provisioning", + "autodiscover.azure.provisioningState.recovering.description": "Базата данни се възстановява след неуспех.", + "autodiscover.azure.provisioningState.recovering.label": "Recovering", + "autodiscover.azure.provisioningState.scaling.description": "Базата данни се мащабира.", + "autodiscover.azure.provisioningState.scaling.label": "Scaling", + "autodiscover.azure.provisioningState.succeeded.description": "Базата данни е напълно осигурена и готова за използване.", + "autodiscover.azure.provisioningState.succeeded.label": "Succeeded", + "autodiscover.azure.provisioningState.unlinking.description": "Базата данни се разкача от гео-репликация.", + "autodiscover.azure.provisioningState.unlinking.label": "Unlinking", + "autodiscover.azure.provisioningState.updating.description": "Конфигурацията на базата данни се актуализира.", + "autodiscover.azure.provisioningState.updating.label": "Updating", + "autodiscover.azure.signIn.description": "Влезте с вашия Microsoft акаунт, за да откриете и добавите Azure Managed Redis бази данни.", + "autodiscover.azure.signIn.signInButton": "Вход с Microsoft", + "autodiscover.azure.signIn.tenantError": "Въведете валиден GUID или домейн на наемател.", + "autodiscover.azure.signIn.tenantHint": "Необходимо е само ако вашите ресурси и вашият акаунт са в различни наематели.", + "autodiscover.azure.signIn.tenantInfo": "Оставете празно, за да използвате наемателя по подразбиране (домашния) на вашия акаунт. Ако вашите Azure Managed Redis ресурси са в различен наемател от вашия акаунт, въведете наемателя, който притежава ресурсите (нужен ви е гостуващ достъп до него) — а не вашия собствен домашен наемател.", + "autodiscover.azure.signIn.tenantLabel": "ID на наемател (по избор)", + "autodiscover.azure.signIn.tenantPlaceholder": "your-tenant.onmicrosoft.com или GUID", + "autodiscover.azure.signIn.title": "Свързване с Azure Managed Redis", + "autodiscover.azure.subscriptionState.deleted.description": "Абонаментът е изтрит и не може да бъде възстановен.", + "autodiscover.azure.subscriptionState.deleted.label": "Deleted", + "autodiscover.azure.subscriptionState.disabled.description": "Абонаментът е спрян. Ресурсите не са достъпни, докато абонаментът не бъде повторно активиран.", + "autodiscover.azure.subscriptionState.disabled.label": "Disabled", + "autodiscover.azure.subscriptionState.enabled.description": "Абонаментът е активен и напълно функционален.", + "autodiscover.azure.subscriptionState.enabled.label": "Enabled", + "autodiscover.azure.subscriptionState.pastDue.description": "Плащането е просрочено. Услугите може да са ограничени.", + "autodiscover.azure.subscriptionState.pastDue.label": "PastDue", + "autodiscover.azure.subscriptionState.warned.description": "Абонаментът има проблеми с плащането, но все още е операционен по време на гратисен период.", + "autodiscover.azure.subscriptionState.warned.label": "Warned", + "autodiscover.azure.subscriptions.empty": "Не са намерени Azure абонаменти за този акаунт.", + "autodiscover.azure.subscriptions.refreshAria": "Обновяване на абонаменти", + "autodiscover.azure.subscriptions.showDatabases": "Показване на бази данни", + "autodiscover.azure.subscriptions.signedInAs": "Влезли сте като", + "autodiscover.azure.subscriptions.switchAccount": "Смяна на акаунт или тенант", + "autodiscover.azure.subscriptions.tenant": "Тенант", + "autodiscover.azure.subscriptions.title": "Azure абонаменти", + "autodiscover.cloud.account.accountId": "ID на акаунт:", + "autodiscover.cloud.account.name": "Име:", + "autodiscover.cloud.account.ownerEmail": "Имейл на собственик:", + "autodiscover.cloud.account.ownerName": "Име на собственик:", + "autodiscover.cloud.alert.aria": "предупреждение за абонамент", + "autodiscover.cloud.alert.errorFetching": "Грешка при извличане на детайли за абонамента", + "autodiscover.cloud.alert.noDatabases": "Абонаментът няма никакви бази данни", + "autodiscover.cloud.alert.statusNotActive": "Статусът на абонамента не е Активен", + "autodiscover.cloud.alert.title": "Този абонамент не е наличен по една от следните причини:", + "autodiscover.cloud.cancel.button": "Отказ", + "autodiscover.cloud.cancel.confirm": "Промените ви не са запазени. Искате ли да продължите към списъка с бази данни?", + "autodiscover.cloud.cancel.proceed": "Продължи", + "autodiscover.cloud.cell.copyEndpointAria": "Копиране на публичната крайна точка", + "autodiscover.cloud.cell.error": "Грешка", + "autodiscover.cloud.column.capabilities": "Възможности", + "autodiscover.cloud.column.database": "База данни", + "autodiscover.cloud.column.endpoint": "Крайна точка", + "autodiscover.cloud.column.id": "ID", + "autodiscover.cloud.column.numberOfDatabases": "# бази данни", + "autodiscover.cloud.column.options": "Опции", + "autodiscover.cloud.column.provider": "Облачен доставчик", + "autodiscover.cloud.column.region": "Регион", + "autodiscover.cloud.column.result": "Резултат", + "autodiscover.cloud.column.status": "Статус", + "autodiscover.cloud.column.subscription": "Абонамент", + "autodiscover.cloud.column.subscriptionId": "ID на абонамент", + "autodiscover.cloud.column.type": "Тип", + "autodiscover.cloud.databases.addSelected": "Добавяне на избраните бази данни", + "autodiscover.cloud.databases.noResults": "Вашият Redis Enterprise Cloud няма налични бази данни", + "autodiscover.cloud.databases.subtitle_one": "Това е база данни във вашия Redis Cloud. Изберете базата данни, която искате да добавите.", + "autodiscover.cloud.databases.subtitle_other": "Това са бази данни във вашия Redis Cloud. Изберете базите данни, които искате да добавите.", + "autodiscover.cloud.databases.title": "Redis Cloud бази данни", + "autodiscover.cloud.loading": "зареждане...", + "autodiscover.cloud.notFound": "Не е намерено", + "autodiscover.cloud.result.title": "Добавени Redis Enterprise бази данни", + "autodiscover.cloud.result.viewDatabases": "Преглед на бази данни", + "autodiscover.cloud.subscriptions.noResults": "Вашият Redis Cloud няма налични абонаменти.", + "autodiscover.cloud.subscriptions.showDatabases": "Показване на бази данни", + "autodiscover.cloud.subscriptions.title": "Redis Cloud абонаменти", + "autodiscover.cloud.summary.databasesFail_one": "Неуспешно добавяне на {{count}} база данни", + "autodiscover.cloud.summary.databasesFail_other": "Неуспешно добавяне на {{count}} бази данни", + "autodiscover.cloud.summary.databasesSuccess_one": "Успешно добавена {{count}} база данни", + "autodiscover.cloud.summary.databasesSuccess_other": "Успешно добавени {{count}} бази данни", + "autodiscover.cloud.summary.prefix": "Резюме: ", + "autodiscover.cloud.summary.subscriptionsFail_one": "Неуспешно откриване на бази данни в {{count}} абонамент", + "autodiscover.cloud.summary.subscriptionsFail_other": "Неуспешно откриване на бази данни в {{count}} абонамента", + "autodiscover.cloud.summary.subscriptionsSuccess_one": "Успешно открити бази данни в {{count}} абонамент", + "autodiscover.cloud.summary.subscriptionsSuccess_other": "Успешно открити бази данни в {{count}} абонамента", + "autodiscover.sentinel.aliasRequiredContent": "Псевдоним на база данни", + "autodiscover.sentinel.button.addPrimaryGroup": "Добавяне на първична група", + "autodiscover.sentinel.cancel.button": "Отказ", + "autodiscover.sentinel.cancel.confirm": "Промените ви не са запазени. Искате ли да продължите към списъка с бази данни?", + "autodiscover.sentinel.cancel.proceed": "Продължи", + "autodiscover.sentinel.cell.aliasPlaceholder": "Въведете псевдоним на база данни", + "autodiscover.sentinel.cell.aliasResultPlaceholder": "База данни", + "autodiscover.sentinel.cell.copyAddressAria": "Копиране на адреса", + "autodiscover.sentinel.cell.copyPublicEndpointAria": "Копиране на публичната крайна точка", + "autodiscover.sentinel.cell.dbIndexTooltip": "Изберете логическата база данни на Redis, с която да работите в Browser и Workbench.", + "autodiscover.sentinel.cell.error": "Грешка", + "autodiscover.sentinel.cell.indexPlaceholder": "Въведете индекс", + "autodiscover.sentinel.cell.notAssigned": "не е зададено", + "autodiscover.sentinel.cell.passwordPlaceholder": "Въведете парола", + "autodiscover.sentinel.cell.usernameDefault": "По подразбиране", + "autodiscover.sentinel.cell.usernamePlaceholder": "Въведете потребителско име", + "autodiscover.sentinel.column.address": "Адрес", + "autodiscover.sentinel.column.alias": "Псевдоним на база данни*", + "autodiscover.sentinel.column.databaseIndex": "Индекс на база данни", + "autodiscover.sentinel.column.numberOfReplicas": "# реплики", + "autodiscover.sentinel.column.password": "Парола", + "autodiscover.sentinel.column.primaryGroup": "Първична група", + "autodiscover.sentinel.column.result": "Резултат", + "autodiscover.sentinel.column.username": "Потребителско име", + "autodiscover.sentinel.databases.noMasters": "Вашият Redis Sentinel няма налични първични групи.", + "autodiscover.sentinel.databases.subtitle": "Открита е инстанция на Redis Sentinel. Ето списък с първичните групи, които вашата Sentinel инстанция управлява.
Изберете първичните групи, които искате да добавите:", + "autodiscover.sentinel.databases.title": "Автоматично откриване на първични групи на Redis Sentinel", + "autodiscover.sentinel.loading": "зареждане...", + "autodiscover.sentinel.notFound": "Не е намерено.", + "autodiscover.sentinel.result.pageTitle": "Добавени първични групи на Redis Sentinel", + "autodiscover.sentinel.result.viewDatabases": "Преглед на бази данни", + "autodiscover.sentinel.summary.fail_one": "Неуспешно добавяне на {{count}} първична група", + "autodiscover.sentinel.summary.fail_other": "Неуспешно добавяне на {{count}} първични групи", + "autodiscover.sentinel.summary.prefix": "Резюме: ", + "autodiscover.sentinel.summary.success_one": "Успешно добавена {{count}} първична група", + "autodiscover.sentinel.summary.success_other": "Успешно добавени {{count}} първични групи", + "browser.actions.addKey": "Добави ключ", + "browser.actions.bulkActions": "Групови действия", + "browser.actions.bulkActionsAria": "групови действия", + "browser.addKey.array.mode.contiguous": "Съседни (последователни индекси)", + "browser.addKey.array.mode.sparse": "Разредени (явни индекси)", + "browser.addKey.array.moreItems_one": "… и още {{count}}", + "browser.addKey.array.moreItems_other": "… и още {{count}}", + "browser.addKey.array.populate.manual.description": "Дефинирайте свой ключ, индекси и стойности от нулата.", + "browser.addKey.array.populate.manual.label": "Създай ръчно", + "browser.addKey.array.populate.sample.description": "Разгледайте масиви с един от вградените примерни набори от данни.", + "browser.addKey.array.populate.sample.label": "Зареди примерни данни", + "browser.addKey.array.populateLabel": "Как искате да попълните този масив?", + "browser.addKey.array.prodWarning": "Зареждането на примерни данни е деактивирано за вашата продукционна база данни, за да се избегнат случайни промени на данните.", + "browser.addKey.array.summary.elements": "Елементи", + "browser.addKey.array.summary.highestIndex": "Най-голям индекс", + "browser.addKey.array.summary.key": "Ключ", + "browser.addKey.array.summary.layout": "Оформление", + "browser.addKey.button.cancel": "Отказ", + "browser.addKey.button.save": "Запази", + "browser.addKey.button.submit": "Добави ключ", + "browser.addKey.close.aria": "Затвори ключа", + "browser.addKey.close.tooltip": "Затвори", + "browser.addKey.form.count.label": "Брой", + "browser.addKey.form.count.placeholder": "Въведете брой", + "browser.addKey.form.element.label": "Елемент", + "browser.addKey.form.element.placeholder": "Въведете елемент", + "browser.addKey.form.entryId.label": "ID на запис", + "browser.addKey.form.entryId.placeholder": "Въведете ID на запис", + "browser.addKey.form.field.label": "Поле", + "browser.addKey.form.field.placeholder": "Въведете поле", + "browser.addKey.form.index.label": "Индекс", + "browser.addKey.form.index.placeholder": "Въведете индекс", + "browser.addKey.form.json.placeholder": "Въведете JSON", + "browser.addKey.form.keyName.label": "Име на ключ", + "browser.addKey.form.keyName.placeholder": "Въведете име на ключ", + "browser.addKey.form.keyTTL.label": "TTL", + "browser.addKey.form.keyTTL.placeholder": "Без лимит", + "browser.addKey.form.member.label": "Член", + "browser.addKey.form.member.placeholder": "Въведете член", + "browser.addKey.form.score.label": "Оценка", + "browser.addKey.form.score.placeholder": "Въведете оценка", + "browser.addKey.form.startIndex.label": "Начален индекс", + "browser.addKey.form.startIndex.placeholder": "Въведете начален индекс", + "browser.addKey.form.value.label": "Стойност", + "browser.addKey.form.value.placeholder": "Въведете стойност", + "browser.addKey.hash.ttlPlaceholder": "Въведете TTL", + "browser.addKey.keyType": "Тип ключ", + "browser.addKey.requiresVersion": "Изисква Redis {{version}}+", + "browser.addKey.selectKeyType": "Изберете тип ключ", + "browser.addKey.stream.entryIdError": "Форматът на ID на записа е неправилен", + "browser.addKey.title": "Добави нов ключ", + "browser.addKey.upload.aria": "Изберете файл", + "browser.addKey.upload.label": "Качване", + "browser.addKey.vectorSet.populate.manual.description": "Дефинирайте свой ключ, елементи и вектори от нулата.", + "browser.addKey.vectorSet.populate.manual.label": "Създай ръчно", + "browser.addKey.vectorSet.populate.sample.description": "Разгледайте векторни множества с предварително заредени вграждания на думи", + "browser.addKey.vectorSet.populate.sample.label": "Зареди примерен набор от данни", + "browser.addKey.vectorSet.populateLabel": "Как искате да попълните това векторно множество?", + "browser.addKey.vectorSet.sample.dataset": "Набор от данни", + "browser.addKey.vectorSet.sample.embedding": "Вграждане", + "browser.addKey.vectorSet.sample.size": "Размер", + "browser.addKey.vectorSet.sample.vectorSize": "Размер на вектора", + "browser.addMultipleFields.addAria": "Добави нов елемент", + "browser.addMultipleFields.addTooltip": "Добави", + "browser.addMultipleFields.removeAria": "Премахни елемент", + "browser.addMultipleFields.removeTooltip": "Премахни", + "browser.array.add.addButton": "Добавяне", + "browser.array.add.cancelButton": "Отказ", + "browser.array.add.confirmButton": "Добавяне", + "browser.array.add.confirmMessage": "На път сте да добавите елемент към ключ в продукционна база данни.", + "browser.array.add.confirmTitle": "Добавяне на елемент в продукционна база данни?", + "browser.array.add.indexHint": "Оставете празно, за да добавите стойността в края на масива. Въведете индекс, за да зададете стойността на точно тази позиция (презаписвайки съществуваща стойност там).", + "browser.array.add.indexLabel": "Индекс", + "browser.array.add.indexPlaceholder": "Оставете празно, за да добавите в края", + "browser.array.add.invalidIndex": "Индексът трябва да е целочислен низ между 0 и 18446744073709551614", + "browser.array.add.moveToElementHint": "Когато е включено, изгледът се придвижва, за да покаже елемента, който току-що добавихте. Това е полезно при добавяне в края или нов индекс, който попада извън текущия диапазон и иначе би останал скрит.", + "browser.array.add.moveToElementLabel": "Придвижване до добавения елемент", + "browser.array.add.valueLabel": "Стойност", + "browser.array.add.valuePlaceholder": "Въведете стойност", + "browser.array.addElements": "Добавяне на елементи", + "browser.array.aggregate.operationLabel": "Операция", + "browser.array.aggregate.resetAria": "Нулиране на формата за агрегиране в масив", + "browser.array.aggregate.resultLabel": "Резултат", + "browser.array.aggregate.tooLarge": "Диапазонът е твърде голям - агрегирайте най-много 1 000 000 индекса на заявка", + "browser.array.aggregate.valueLabel": "Стойност", + "browser.array.aggregate.valuePlaceholder": "стойност за съвпадение", + "browser.array.column.index": "Индекс", + "browser.array.column.value": "Стойност", + "browser.array.context.hint": "При разгъване на съвпадение показва и ±N съседни елемента.", + "browser.array.context.label": "Контекст", "browser.array.delete.bulk.aria": "Изтриване на избраните елементи", "browser.array.delete.bulk.button": "Премахни", "browser.array.delete.bulk.message": "Избраните елементи ({{count}}) ще бъдат премахнати за постоянно от масива.", @@ -201,26 +615,755 @@ "browser.array.delete.range.trigger": "Изтриване на диапазон", "browser.array.delete.row.message": "Този елемент ще бъде премахнат за постоянно от масива.", "browser.array.delete.row.title": "Изтриване на елемент", + "browser.array.drawer.cancel": "Отказ", + "browser.array.drawer.save": "Запазване", + "browser.array.drawer.saveAria": "Запазване на стойността за индекс {{index}}", + "browser.array.drawer.title": "Редактиране на стойността", + "browser.array.editFieldAria": "Редактиране на полето", + "browser.array.emptyValue": "Празно", + "browser.array.expandEditorAria": "Разгъване на редактора на стойността", + "browser.array.form.endIndex": "Краен индекс", + "browser.array.form.invalidIndex": "Индексът трябва да е валидно 64-битово цяло число без знак", + "browser.array.form.resetTooltip": "Нулиране до стойностите по подразбиране", + "browser.array.form.run": "Изпълни", + "browser.array.form.startIndex": "Начален индекс", + "browser.array.range.resetAria": "Нулиране на формата за диапазон в масив", + "browser.array.range.showEmpty": "Показване на празните индекси", + "browser.array.range.tooLarge": "Диапазонът е твърде голям - заявявайте най-много 1 000 000 индекса на заявка", + "browser.array.search.addPredicateAria": "Добавяне на предикат", + "browser.array.search.and": "И", + "browser.array.search.appliesToAll": "важи за всички", + "browser.array.search.combinatorAria": "Комбиниране на предикати с И или ИЛИ", + "browser.array.search.invalidLimit": "Ограничението трябва да е цяло число между 1 и 1 000 000", + "browser.array.search.limitHint": "Ограничава броя на върнатите съвпадения.", + "browser.array.search.matchByHint": "Добавете един или повече предиката. Всеки съпоставя стойностите на масива чрез EXACT, MATCH (подниз), GLOB или RE (регулярен израз). При два или повече предиката превключвателят И / ИЛИ ги комбинира по един и същи начин.", + "browser.array.search.matchByLabel": "Съвпадение по", + "browser.array.search.nocaseHint": "Съпоставяне без чувствителност към регистъра.", + "browser.array.search.optionsHint": "Прецизирайте кои елементи се търсят и как се показват съвпаденията.", + "browser.array.search.optionsLabel": "Опции", + "browser.array.search.or": "ИЛИ", + "browser.array.search.rangeHint": "Ограничава прозореца от индекси, в който се търси (празно = целият масив).", + "browser.array.search.rangeLabel": "Диапазон", + "browser.array.search.rangeToLabel": "до", + "browser.array.search.removePredicateAria": "Премахване на предикат", + "browser.array.search.resetAria": "Нулиране на формата за търсене в масив", + "browser.array.search.valuePlaceholder": "шаблон", + "browser.array.search.withValuesHint": "Връща стойността на всяко съвпадение, не само индекса му.", + "browser.array.tab.aggregate": "Агрегиране", + "browser.array.tab.search": "Търсене", + "browser.array.tab.view": "Изглед", + "browser.array.table.empty": "Няма елементи в диапазона", + "browser.array.table.loading": "Моля изчакайте…", + "browser.bulkActions.button.cancel": "Отказ", + "browser.bulkActions.button.close": "Затвори", + "browser.bulkActions.button.delete": "Изтрий", + "browser.bulkActions.button.startNew": "Започни отначало", + "browser.bulkActions.button.stop": "Спри", + "browser.bulkActions.button.upload": "Качи", + "browser.bulkActions.close.aria": "Затваряне на панела", + "browser.bulkActions.close.tooltip": "Затвори", + "browser.bulkActions.confirmTitle": "Сигурни ли сте, че искате да извършите това действие?", + "browser.bulkActions.delete.confirmMessage": "Това ще изтрие всички ключове, съответстващи на избрания тип и шаблон.", + "browser.bulkActions.delete.confirmWarning": "Груповото изтриване може да повлияе на производителността и да причини пикове в паметта. Избягвайте да го изпълнявате в продукция.", + "browser.bulkActions.delete.downloadReport": "Изтегляне на отчет", + "browser.bulkActions.delete.downloadReportTooltip": "Изтеглете подробен отчет за изтритите ключове.", + "browser.bulkActions.delete.errorList": "Списък с грешки", + "browser.bulkActions.delete.expectedAmountNa": "Очаквано количество: Н/Д", + "browser.bulkActions.delete.expectedAmountTooltip": "Очакваното количество се изчислява въз основа на броя сканирани ключове и процента на сканиране. Крайният брой може да е различен.", + "browser.bulkActions.delete.expectedAmount_one": "Очаквано количество: {{amount}} ключ", + "browser.bulkActions.delete.expectedAmount_other": "Очаквано количество: {{amount}} ключа", + "browser.bulkActions.delete.lastErrors": "показани са последните {{count}} грешки", + "browser.bulkActions.delete.scanned_one": "Сканирани {{percentage}} ({{scanned}}/{{total}}) и намерени {{found}} ключ", + "browser.bulkActions.delete.scanned_other": "Сканирани {{percentage}} ({{scanned}}/{{total}}) и намерени {{found}} ключа", + "browser.bulkActions.delete.typeToConfirmDescription": "Това ще изтрие всички ключове, съответстващи на избрания тип и шаблон. Груповото изтриване може да повлияе на производителността и да причини пикове в паметта.", + "browser.bulkActions.delete.typeToConfirmTitle": "Изтриване на всички съответстващи ключове", + "browser.bulkActions.info.keyType": "Тип ключ:", + "browser.bulkActions.info.pattern": "Шаблон:", + "browser.bulkActions.info.title": "Изтриване на ключове с", + "browser.bulkActions.placeholder.description": "За да извършите групово действие, задайте шаблон или изберете тип ключ", + "browser.bulkActions.placeholder.title": "Няма зададен шаблон или тип ключ", + "browser.bulkActions.status.completed": "Действието е завършено", + "browser.bulkActions.status.disconnected": "Връзката е загубена: {{percentage}}", + "browser.bulkActions.status.failed": "Действието е неуспешно", + "browser.bulkActions.status.inProgress": "В ход:", + "browser.bulkActions.status.stopped": "Спряно: {{percentage}}", + "browser.bulkActions.summary.commandsProcessed": "Обработени команди", + "browser.bulkActions.summary.errors": "Грешки", + "browser.bulkActions.summary.keysProcessed": "Обработени ключове", + "browser.bulkActions.summary.results": "Резултати", + "browser.bulkActions.summary.success": "Успешни", + "browser.bulkActions.summary.timeTaken": "Изминало време", + "browser.bulkActions.tab.deleteKeys": "Изтриване на ключове", + "browser.bulkActions.tab.uploadData": "Качване на данни", + "browser.bulkActions.title": "Групови действия", + "browser.bulkActions.upload.confirmMessage": "Всички команди от файла ще бъдат изпълнени срещу вашата база данни.", + "browser.bulkActions.upload.executedTitle": "Команди, изпълнени от файл", + "browser.bulkActions.upload.fileSizeError": "Файлът не трябва да надвишава {{max}} MB", + "browser.bulkActions.upload.instruction": "Качете текстов файл със списък с Redis команди", + "browser.bulkActions.upload.promptAria": "Изберете или плъзнете и пуснете файл", + "browser.bulkActions.upload.promptText": "Изберете или плъзнете и пуснете файл", + "browser.deletePopover.aria": "Изтриване на ключ", + "browser.deletePopover.button": "Изтрий", + "browser.deletePopover.message": "ще бъде изтрит.", + "browser.filter.allKeyTypes": "Всички типове ключове", + "browser.hash.add.cancel": "Отказ", + "browser.hash.add.confirmButton": "Добавяне на полета", + "browser.hash.add.confirmMessage_one": "На път сте да добавите {{count}} поле към хеш в продукционна база данни.", + "browser.hash.add.confirmMessage_other": "На път сте да добавите {{count}} полета към хеш в продукционна база данни.", + "browser.hash.add.confirmTitle": "Добавяне на полета в продукционна база данни?", + "browser.hash.add.save": "Запазване", + "browser.hash.addFields": "Добавяне на полета", + "browser.hash.column.field": "Поле", + "browser.hash.column.ttl": "TTL", + "browser.hash.column.value": "Стойност", + "browser.hash.fieldPlaceholder": "Въведете поле", + "browser.hash.searchFieldPrefix": "Поле:", + "browser.hash.showTtl": "Показване на TTL", + "browser.hash.ttlNoLimit": "Без лимит", + "browser.hash.ttlPlaceholder": "Въведете TTL", + "browser.hash.ttlTooltipTitle": "Време на живот", + "browser.hash.valuePlaceholder": "Въведете стойност", + "browser.keyDetails.close.aria": "Затвори ключа", + "browser.keyDetails.close.tooltip": "Затвори", + "browser.keyDetails.commandPreview.building": "Съставяне на командата…", + "browser.keyDetails.commandPreview.copyAria": "Копиране на командата", + "browser.keyDetails.compressedValueDisabled": "Не може да се редактира декомпресираната стойност", + "browser.keyDetails.count.full": "Брой: ", + "browser.keyDetails.count.short": "Бр.: ", + "browser.keyDetails.delete.aria": "Изтриване на ключ", + "browser.keyDetails.delete.button": "Изтрий", + "browser.keyDetails.delete.message": "ще бъде изтрит.", + "browser.keyDetails.editable.cancelButton": "Отказ", + "browser.keyDetails.editable.confirmButton": "Запазване", + "browser.keyDetails.editable.confirmMessage": "На път сте да промените стойност в продукционна база данни.", + "browser.keyDetails.editable.confirmTitle": "Промяна на стойност в продукционна база данни?", + "browser.keyDetails.editable.editAria": "Редактиране на полето", + "browser.keyDetails.editable.saveButton": "Запазване", + "browser.keyDetails.editable.valuePlaceholder": "Въведете стойност", + "browser.keyDetails.failedConvertFormatter": "Неуспешно преобразуване към {{format}}", + "browser.keyDetails.formatter.ascii": "ASCII", + "browser.keyDetails.formatter.binary": "Binary", + "browser.keyDetails.formatter.dateTime": "Дата и час", + "browser.keyDetails.formatter.hex": "HEX", + "browser.keyDetails.formatter.java": "Java сериализиран", + "browser.keyDetails.formatter.json": "JSON", + "browser.keyDetails.formatter.markdown": "Markdown", + "browser.keyDetails.formatter.msgpack": "Msgpack", + "browser.keyDetails.formatter.php": "PHP сериализиран", + "browser.keyDetails.formatter.pickle": "Pickle", + "browser.keyDetails.formatter.protobuf": "Protobuf", + "browser.keyDetails.formatter.unicode": "Unicode", + "browser.keyDetails.formatter.vector32": "32-битов вектор", + "browser.keyDetails.formatter.vector64": "64-битов вектор", + "browser.keyDetails.formatterEditingDisabled": "Не може да се редактира стойността в този формат", + "browser.keyDetails.invalidValue.text": "тъй като не е валидна в избрания формат.", + "browser.keyDetails.invalidValue.title": "Стойността ще бъде запазена като Unicode", + "browser.keyDetails.length.default": "Дължина", + "browser.keyDetails.length.entries": "Записи", + "browser.keyDetails.length.nodes": "Възли", + "browser.keyDetails.length.samples": "Проби", + "browser.keyDetails.length.topLevelValues": "Стойности от най-високо ниво", + "browser.keyDetails.modulesType.message": "Използвайте команди на Redis в инструмента Workbench, за да видите стойността.", + "browser.keyDetails.modulesType.title": "Това е ключ от тип {{moduleName}}.", + "browser.keyDetails.name.copyAria": "Копиране на името на ключа", + "browser.keyDetails.name.renameConfirm.button": "Преименувай", + "browser.keyDetails.name.renameConfirm.description": "На път сте да преименувате {{oldName}} на {{newName}} в продукционна база данни.", + "browser.keyDetails.name.renameConfirm.title": "Преименуване на ключ в продукционна база данни?", + "browser.keyDetails.name.tooltipTitle": "Име на ключ", + "browser.keyDetails.noKeySelected.closeAria": "Затваряне на панела", + "browser.keyDetails.noKeySelected.closeTooltip": "Затваряне", + "browser.keyDetails.noKeySelected.message": "Изберете ключ от списъка вляво, за да видите подробностите за ключа.", + "browser.keyDetails.preview.commandLabel": "Преглед на командата", + "browser.keyDetails.preview.hideTooltip": "Скриване на прегледа на командата", + "browser.keyDetails.preview.label": "Преглед", + "browser.keyDetails.preview.showTooltip": "Показване на командата на Redis, която ще се изпълни", + "browser.keyDetails.preview.toggleAria": "Превключване на прегледа на командата", + "browser.keyDetails.quantType.full": "Тип квантуване: ", + "browser.keyDetails.quantType.short": "Кв.: ", + "browser.keyDetails.removeLastElement": "Премахването на последния елемент изтрива целия ключ.", + "browser.keyDetails.size.label": "Размер на ключ: ", + "browser.keyDetails.size.tooLarge": "Размерът на ключа е твърде голям, за да се изпълни командата MEMORY USAGE, тъй като може да доведе до проблеми с производителността.", + "browser.keyDetails.size.tooltipTitle": "Размер на ключ", + "browser.keyDetails.stringFormattingDisabled": "Заредете цялата стойност, за да изберете формат", + "browser.keyDetails.textWrapper.closeAria": "Затваряне на ключа", + "browser.keyDetails.textWrapper.closeTooltip": "Затваряне", + "browser.keyDetails.tooLongName.message": "Подробностите не могат да бъдат показани.", + "browser.keyDetails.tooLongName.title": "Името на ключа е твърде дълго", + "browser.keyDetails.truncatedActionDisabled": "Това действие е деактивирано, защото ключът или стойността са твърде големи за обработка в Redis Insight.", + "browser.keyDetails.ttl.changeConfirm.button": "Промяна на TTL", + "browser.keyDetails.ttl.changeConfirm.description": "На път сте да промените TTL на {{name}} на {{ttl}} в продукционна база данни.", + "browser.keyDetails.ttl.changeConfirm.title": "Промяна на TTL в продукционна база данни?", + "browser.keyDetails.ttl.noLimit": "Без лимит", + "browser.keyDetails.ttl.placeholder": "Без лимит", + "browser.keyDetails.unprintable.content": "Използвайте Workbench или CLI, за да редактирате без загуба на данни.", + "browser.keyDetails.unprintable.title": "Открити са непечатаеми символи", + "browser.keyDetails.unsupportedType.message": "Вижте нашето хранилище за списъка с поддържаните типове ключове.", + "browser.keyDetails.unsupportedType.title": "Този тип ключ в момента не се поддържа.", + "browser.keyDetails.vectorDim.full": "Векторно измерение: ", + "browser.keyDetails.vectorDim.short": "Изм.: ", + "browser.keyList.column.key": "Ключ", + "browser.keyList.column.size": "Размер", + "browser.keyList.column.ttl": "TTL", + "browser.keyList.column.type": "Тип", + "browser.keyList.name.tooltipTitle": "Име на ключ", + "browser.keyList.size.tooltipTitle": "Размер на ключ", + "browser.keyList.ttl.noLimit": "Без лимит", + "browser.keyList.ttl.tooltipTitle": "Време на живот", + "browser.keysBrowser.addKeyAria": "Добави ключ", + "browser.keysBrowser.refreshDisabledMessage": "Изберете индекс, за да опресните ключовете.", + "browser.keysBrowser.results": "Резултати: ", + "browser.keysBrowser.scannedPrefix": "Сканирани ", + "browser.keysBrowser.scanning": "Сканиране...", + "browser.keysBrowser.total": "Общо: ", + "browser.keysHeader.columns": "Колони", + "browser.keysHeader.columnsAria": "колони", + "browser.keysHeader.keySize": "Размер на ключ", + "browser.keysHeader.keySizeTooltip": "Скриване на размера на ключа, за да се избегнат проблеми с производителността при работа с големи ключове.", + "browser.keysHeader.sortAsc": "Сортиране на {{column}} възходящо", + "browser.keysHeader.sortBy": "Сортиране по:", + "browser.keysHeader.sortDesc": "Сортиране на {{column}} низходящо", + "browser.keysHeader.ttl": "TTL", + "browser.keysHeader.view.listAria": "Бутон за изглед като списък", + "browser.keysHeader.view.listTooltip": "Изглед като списък", + "browser.keysHeader.view.treeAria": "Бутон за дървовиден изглед", + "browser.keysHeader.view.treeDisabledTooltip": "Дървовидният изглед не е наличен, когато е избран HEX формат на името на ключа.", + "browser.keysHeader.view.treeTooltip": "Дървовиден изглед", + "browser.list.add.cancel": "Отказ", + "browser.list.add.confirmButton": "Добавяне на елементи", + "browser.list.add.confirmMessage_one": "На път сте да добавите {{count}} елемент към списък в продукционна база данни.", + "browser.list.add.confirmMessage_other": "На път сте да добавите {{count}} елемента към списък в продукционна база данни.", + "browser.list.add.confirmTitle": "Добавяне на елементи в продукционна база данни?", + "browser.list.add.save": "Запазване", + "browser.list.addElements": "Добавяне на елементи", + "browser.list.column.element": "Елемент", + "browser.list.column.index": "Индекс", + "browser.list.destination.head": "Добави в началото", + "browser.list.destination.tail": "Добави в края", + "browser.list.remove.button": "Премахване", + "browser.list.remove.cancel": "Отказ", + "browser.list.remove.deleteWarning": "Ако премахнете всички елементи, целият ключ ще бъде изтрит.", + "browser.list.remove.directionHead": "началото", + "browser.list.remove.directionTail": "опашката", + "browser.list.remove.elementsCount_one": "{{count}} елемент", + "browser.list.remove.elementsCount_other": "{{count}} елемента", + "browser.list.remove.fromHead": "Премахване от началото", + "browser.list.remove.fromTail": "Премахване от опашката", + "browser.list.remove.multipleNotSupported": "Премахването на няколко елемента е налично за бази данни Redis v. 6.2 или по-нови. Актуализирайте вашата Redis база данни или създайте нова безплатна и актуална Redis база данни.", + "browser.list.remove.willBeRemoved_one": "ще бъде премахнат от {{destination}} на {{keyName}}", + "browser.list.remove.willBeRemoved_other": "ще бъдат премахнати от {{destination}} на {{keyName}}", + "browser.list.removeElements": "Премахване на елементи", + "browser.list.searchIndexPrefix": "Индекс:", + "browser.loadSampleData.button": "Зареждане на примерни данни", + "browser.loadSampleData.confirm.execute": "Изпълни", + "browser.loadSampleData.confirm.message": "Всички команди от файла ще бъдат автоматично изпълнени срещу вашата база данни. Избягвайте да ги изпълнявате в продукционни бази данни.", + "browser.loadSampleData.confirm.title": "Изпълнение на команди групово", + "browser.loadSampleData.productionTooltip": "Бутонът е деактивиран за вашата продукционна база данни, за да се избегнат случайни промени на данните.", + "browser.makeSearchable.button.cancel": "Отказ", + "browser.makeSearchable.button.continue": "Продължи", + "browser.makeSearchable.button.trigger": "Индексирай за търсене", + "browser.makeSearchable.description.intro": "Ще ви отведем към работното пространство за търсене, за да настроите индекса.", + "browser.makeSearchable.description.outro": "Можете да прегледате и коригирате схемата, преди да създадете индекса.", + "browser.makeSearchable.description.prefix": "Всички ключове, започващи с '{{prefix}}', ще бъдат включени.", + "browser.makeSearchable.title": "Индексирайте тези данни за по-бързо търсене", + "browser.makeSearchable.tooltip": "Индексирайте данни с префикс \"{{prefix}}\", за да можете да ги заявявате чрез пълнотекстово, векторно, точно съвпадение и геопространствено търсене.", + "browser.noKeysFound.addKeyManually": "Добавяне на ключ ръчно", + "browser.noKeysFound.imageAlt": "няма резултати", + "browser.noKeysFound.title": "Нека започваме работа", + "browser.noResults.advices": "Проверете правописа.Проверете главните и малките букви.Използвайте звездичка (*) в заявката си за по-общи резултати.", + "browser.noResults.loading": "зареждане...", + "browser.noResults.scanMore": "Използвайте бутона „Сканирай още“, за да продължите, или филтрирайте по точно име на ключ за по-ефективно сканиране.", + "browser.noResults.selectIndex": "Изберете индекс и въведете заявка, за да търсите по стойности на ключове.", + "browser.noResults.title": "Няма намерени резултати.", + "browser.onboarding.button.skip": "Пропусни обиколката", + "browser.onboarding.button.start": "Покажи ми", + "browser.onboarding.content": "Здравейте! Redis Insight разполага с много инструменти, които могат да ви помогнат да оптимизирате процеса на разработка.Искате ли да ви ги покажем?", + "browser.onboarding.title": "Бърза обиколка на Redis Insight?", + "browser.popoverDelete.button": "Премахни", + "browser.popoverDelete.removeAria": "Премахване на поле", + "browser.redisearch.createIndex": "Създаване на индекс", + "browser.redisearch.refreshAria": "опресняване на списъка с индекси", + "browser.redisearch.refreshTooltip": "Опресняване на индекси", + "browser.redisearch.selectIndex": "Изберете индекс", + "browser.rejson.addFieldAria": "Добавяне на поле", + "browser.rejson.applyAria": "Прилагане", + "browser.rejson.cancelAddAria": "Отказ от добавянето", + "browser.rejson.cancelEditingAria": "Отказ от редактирането", + "browser.rejson.close": "Затваряне", + "browser.rejson.copyValueAria": "Копиране на стойността", + "browser.rejson.downloadTooltip": "Изтегляне", + "browser.rejson.downloadValueAria": "Изтегляне на стойността", + "browser.rejson.editConfirmMessage": "На път сте да промените JSON стойност в продукционна база данни.", + "browser.rejson.editFieldAria": "Редактиране на полето", + "browser.rejson.error.keyCorrectSyntax": "Ключът трябва да има правилен синтаксис.", + "browser.rejson.error.valueJSONFormat": "Стойността трябва да е във формат JSON.", + "browser.rejson.jsonKeyPlaceholder": "Въведете JSON ключ", + "browser.rejson.jsonValuePlaceholder": "Въведете JSON стойност", + "browser.rejson.overwrite.cancel": "Отказ", + "browser.rejson.overwrite.confirm": "Презаписване", + "browser.rejson.overwrite.message": "Вече имате същия JSON ключ. Ако продължите, стойността на съществуващия JSON ключ ще бъде презаписана.", + "browser.rejson.overwrite.title": "Открит е дублиран JSON ключ", + "browser.rejson.overwriteData": "Презаписване на данните", + "browser.scanMore.button": "Сканирай още", + "browser.scanMore.warning": "Сканирането на допълнителни ключове може да намали производителността и наличната памет.", + "browser.search.clearHistory": "Изчистване на историята", + "browser.search.input.aria": "Търсене", + "browser.search.mode.pattern.aria": "Бутон за филтриране по име или шаблон на ключ", + "browser.search.mode.pattern.tooltip": "Филтриране по име или шаблон на ключ", + "browser.search.mode.redisearch.aria": "Бутон за търсене по стойности на ключове", + "browser.search.mode.redisearch.tooltip": "Търсене по стойности на ключове", + "browser.search.placeholder.pattern": "Филтриране по име или шаблон на ключ", + "browser.search.placeholder.redisearch": "Търсене по стойности на ключове", + "browser.search.removeHistoryRecord": "Премахване на запис от историята", + "browser.search.resetFilters": "Нулиране на филтрите", + "browser.search.showHistory": "Показване на историята", + "browser.set.add.cancel": "Отказ", + "browser.set.add.confirmButton": "Добавяне на членове", + "browser.set.add.confirmMessage_one": "На път сте да добавите {{count}} член към множество в продукционна база данни.", + "browser.set.add.confirmMessage_other": "На път сте да добавите {{count}} члена към множество в продукционна база данни.", + "browser.set.add.confirmTitle": "Добавяне на членове в продукционна база данни?", + "browser.set.add.save": "Запазване", + "browser.set.addMembers": "Добавяне на членове", + "browser.set.column.member": "Член", + "browser.stream.ack.aria": "Потвърждаване на чакащо съобщение", + "browser.stream.ack.confirm": "Потвърждаване", + "browser.stream.ack.message": "ще бъде потвърден и премахнат от списъка с чакащи съобщения", + "browser.stream.addAction.newEntry": "Нов запис", + "browser.stream.addAction.newGroup": "Нова група", + "browser.stream.addEntry.cancel": "Отказ", + "browser.stream.addEntry.confirmButton": "Добавяне на запис", + "browser.stream.addEntry.confirmMessage": "На път сте да добавите нов запис към поток в продукционна база данни.", + "browser.stream.addEntry.confirmTitle": "Добавяне на запис в продукционна база данни?", + "browser.stream.addEntry.save": "Запазване", + "browser.stream.addGroup.cancel": "Отказ", + "browser.stream.addGroup.groupNamePlaceholder": "Въведете име на групата*", + "browser.stream.addGroup.save": "Запазване", + "browser.stream.claim.aria": "Присвояване на чакащо съобщение", + "browser.stream.claim.cancel": "Отказ", + "browser.stream.claim.confirm": "Присвояване", + "browser.stream.claim.consumerLabel": "Потребител", + "browser.stream.claim.forceClaimLabel": "Принудително присвояване", + "browser.stream.claim.forceLabel": "Принудително", + "browser.stream.claim.idleTimeLabel": "Време на бездействие", + "browser.stream.claim.minIdleTimeLabel": "Мин. време на бездействие", + "browser.stream.claim.noConsumerTooltip": "Няма потребител, на когото да се присвои съобщението.", + "browser.stream.claim.optionalParams": "Незадължителни параметри", + "browser.stream.claim.pendingCount": "чакащи: {{count}}", + "browser.stream.claim.relativeTime": "Относително време", + "browser.stream.claim.retryCountLabel": "Брой опити", + "browser.stream.claim.timeLabel": "Време", + "browser.stream.claim.timestamp": "Времеви печат", + "browser.stream.column.entryId": "ID на записа", + "browser.stream.consumers.deleteMessage": "ще бъде премахнат от потребителската група {{group}}", + "browser.stream.consumers.empty": "Вашата потребителска група няма налични потребители.", + "browser.stream.consumers.idleColumn": "Време на бездействие, мсек", + "browser.stream.consumers.nameColumn": "Име на потребителя", + "browser.stream.consumers.pendingColumn": "Чакащи", + "browser.stream.data.emptyStream": "Няма записи в потока.", + "browser.stream.data.noResults": "Няма намерени резултати.", + "browser.stream.entryFields.idFormatHint": "Времеви печат - пореден номер или *", + "browser.stream.entryFields.idTooltipTitle": "Въведете валиден ID или *", + "browser.stream.group.idFormatError": "Форматът на ID не е правилен", + "browser.stream.group.idFormatHint": "Времеви печат - пореден номер или $", + "browser.stream.group.idPlaceholder": "ID*", + "browser.stream.group.idTooltipTitle": "Въведете валиден ID, 0 или $", + "browser.stream.groups.consumersColumn": "Потребители", + "browser.stream.groups.deleteMessage": "и всички нейни потребители ще бъдат премахнати от {{key}}", + "browser.stream.groups.empty": "Вашият ключ няма налични потребителски групи.", + "browser.stream.groups.lastDeliveredColumn": "Последно доставен ID", + "browser.stream.groups.nameColumn": "Име на групата", + "browser.stream.groups.pendingColumn": "Чакащи", + "browser.stream.groups.pendingMessages": "{{count}} чакащи съобщения", + "browser.stream.messages.empty": "Вашият потребител няма чакащи съобщения.", + "browser.stream.messages.lastDeliveredColumn": "Последно доставено съобщение", + "browser.stream.messages.timesDeliveredColumn": "Брой доставяния на съобщението", + "browser.stream.tabs.data": "Данни на потока", + "browser.stream.tabs.groups": "Потребителски групи", + "browser.string.copyValueAria": "Копиране на стойността", + "browser.string.download": "Изтегляне", + "browser.string.editValue": "Редактиране на стойността", + "browser.string.empty": "Няма стойност", + "browser.string.loadAll": "Зареждане на всичко", + "browser.string.loadAllToEdit": "Заредете цялата стойност, за да я редактирате", + "browser.tree.folder.deleteAria": "Изтриване на ключовете в папката", + "browser.tree.folder.deleteDisabledMultipleDelimiters": "За да използвате групово изтриване, конфигурирайте дървовидния изглед с един разделител.", + "browser.tree.folder.deleteDisabledUnprintable": "Открити са непечатаеми символи. Груповото изтриване е деактивирано поради ненадеждно групиране на ключове.", + "browser.tree.folder.deleteTooltip": "Изтриване на всички ключове, съвпадащи с: {{pattern}}", + "browser.tree.folder.keyCount_one": "{{count}} ключ ({{percentage}}%)", + "browser.tree.folder.keyCount_other": "{{count}} ключа ({{percentage}}%)", + "browser.tree.settings.aria": "отваряне на настройките за дървовиден изглед", + "browser.tree.settings.button.apply": "Приложи", + "browser.tree.settings.button.cancel": "Отказ", + "browser.tree.settings.delimiter": "Разделител", + "browser.tree.settings.sortBy": "Сортиране по", + "browser.tree.settings.sortOption": "Име на ключ {{order}}", + "browser.vectorSet.addElements": "Добавяне на елементи", + "browser.vectorSet.attributeEditor.warning": "Атрибути, които не са във формат JSON, не се поддържат като филтърни изрази в заявките за търсене по сходство.", + "browser.vectorSet.clearResults": "Изчистване на резултатите", + "browser.vectorSet.columns": "Колони", + "browser.vectorSet.elementDetails.attributesDescription": "Структурирани метаданни, свързани с този елемент, използвани за филтриране, показване и хибридни заявки за търсене.", + "browser.vectorSet.elementDetails.attributesLabel": "Атрибути", + "browser.vectorSet.elementDetails.copyVectorAria": "Копиране на вектора", + "browser.vectorSet.elementDetails.downloadTooltip": "Изтегляне", + "browser.vectorSet.elementDetails.downloadVectorAria": "Изтегляне на вектора", + "browser.vectorSet.elementDetails.editAttributesAria": "Редактиране на атрибутите", + "browser.vectorSet.elementDetails.vectorDescription": "Численото представяне (embedding) на този елемент във векторното пространство, използвано за търсене по сходство и класиране.", + "browser.vectorSet.elementDetails.vectorLabel": "Вектор", + "browser.vectorSet.filterHelp.aria": "Помощ за синтаксиса на филтъра", + "browser.vectorSet.filterHelp.close": "Затваряне", + "browser.vectorSet.filterHelp.examplesLabel": "Примери", + "browser.vectorSet.filterHelp.intro": "Филтрите използват малък изразен език, който се изчислява спрямо атрибутите на всеки елемент.", + "browser.vectorSet.filterHelp.op.comparison": "== / != / < / <= / > / >=", + "browser.vectorSet.filterHelp.op.inList": "in [ ... ]", + "browser.vectorSet.filterHelp.op.logical": "and / or / not", + "browser.vectorSet.filterHelp.op.selectAttribute": ". – избор на атрибут (напр. .price)", + "browser.vectorSet.filterHelp.op.stringLiterals": "\"...\" за низови литерали", + "browser.vectorSet.filterHelp.operatorsLabel": "Оператори", + "browser.vectorSet.filterHelp.title": "Синтаксис на филтъра", + "browser.vectorSet.form.addAttributes": "Добавяне на атрибути", + "browser.vectorSet.form.detectedFp32": "Разпознат FP32 вектор ({{dim}} размерности).", + "browser.vectorSet.form.detectedNumeric": "Разпознат числов вектор ({{dim}} размерности).", + "browser.vectorSet.form.dimensionMismatch": "Несъответствие в размерността. Очаквани {{expected}} стойности, но получени {{received}}", + "browser.vectorSet.form.elementNamePlaceholder": "Въведете име на елемента", + "browser.vectorSet.form.invalidFp32": "Невалиден FP32 байтов низ", + "browser.vectorSet.form.invalidFp32Length": "Дължината на FP32 байтовете трябва да е кратна на 4", + "browser.vectorSet.form.invalidNumeric": "Невалиден числов формат във вектора", + "browser.vectorSet.form.nameHelp": "Уникален идентификатор за този вектор.", + "browser.vectorSet.form.optional": "(Незадължително)", + "browser.vectorSet.form.vectorHelp": "Форматът се разпознава автоматично. Първият вектор определя необходимата размерност за този набор.", + "browser.vectorSet.form.vectorPlaceholder": "Въведете вектор", + "browser.vectorSet.form.vectorPlaceholderDim": "Въведете вектор ({{count}} размерности)", + "browser.vectorSet.list.elementColumn": "Елемент", + "browser.vectorSet.list.empty": "Няма намерени резултати.", + "browser.vectorSet.list.findSimilar": "Намиране на подобни елементи", + "browser.vectorSet.list.loading": "Зареждане...", + "browser.vectorSet.list.viewAction": "Преглед", + "browser.vectorSet.results.elementColumn": "Елемент", + "browser.vectorSet.results.empty": "Няма намерени съвпадащи елементи.", + "browser.vectorSet.results.emptyAttr": "Празно", + "browser.vectorSet.results.rankColumn": "Ранг", + "browser.vectorSet.results.similarityColumn": "Сходство", + "browser.vectorSet.search.elementMode": "Елемент", + "browser.vectorSet.search.elementModeTooltip": "Търсене по съществуващ елемент.", + "browser.vectorSet.search.elementPlaceholder": "Име на съществуващ елемент", + "browser.vectorSet.search.filterLabel": "Филтърен израз", + "browser.vectorSet.search.queryNotReadyTooltip": "Въведете вектор или елемент за търсене", + "browser.vectorSet.search.resetAria": "Нулиране на формата за търсене по сходство", + "browser.vectorSet.search.resetTooltip": "Нулиране на формата", + "browser.vectorSet.search.resultCount": "Брой резултати", + "browser.vectorSet.search.submit": "Намиране на подобни елементи", + "browser.vectorSet.search.suggestionsHint": "Списъкът се базира на частично сканиране на данните.", + "browser.vectorSet.search.vectorMode": "Вектор", + "browser.vectorSet.search.vectorModeTooltip": "Търсене по необработени стойности на вектора", + "browser.vectorSet.search.vectorPlaceholder": "Въведете вектор, за да намерите елементи с най-сходни вектори.", + "browser.vectorSet.subheader.previewingFull": "Преглед на {{count}} от {{total}}", + "browser.vectorSet.subheader.previewingShort": "{{count}} от {{total}}", + "browser.viewIndex.label": "Преглед на индекс", + "browser.zset.add.cancel": "Отказ", + "browser.zset.add.confirmButton": "Добавяне на членове", + "browser.zset.add.confirmMessage_one": "На път сте да добавите {{count}} член към сортирано множество в продукционна база данни.", + "browser.zset.add.confirmMessage_other": "На път сте да добавите {{count}} члена към сортирано множество в продукционна база данни.", + "browser.zset.add.confirmTitle": "Добавяне на членове в продукционна база данни?", + "browser.zset.add.save": "Запазване", + "browser.zset.addMembers": "Добавяне на членове", + "browser.zset.column.member": "Член", + "browser.zset.column.score": "Резултат", + "browser.zset.scoreEditDisabledTooltip": "Използвайте CLI или Workbench, за да редактирате резултата", + "browser.zset.scorePlaceholder": "Въведете резултат", + "browser.zset.searchMemberPrefix": "Член:", + "cluster.cancel.button": "Отказ", + "cluster.cancel.confirm": "Промените ви не са запазени. Искате ли да продължите към списъка с бази данни?", + "cluster.cancel.proceed": "Продължаване", + "cluster.column.capabilities": "Възможности", + "cluster.column.database": "База данни", + "cluster.column.endpoint": "Крайна точка", + "cluster.column.options": "Опции", + "cluster.column.result": "Резултат", + "cluster.column.status": "Статус", + "cluster.databases.addButton": "Добавяне на избраните бази данни", + "cluster.databases.noResults": "Вашият Redis Enterprise клъстер няма налични бази данни.", + "cluster.databases.subtitle_one": "Това е базата данни във вашия Redis Enterprise клъстер. Изберете базата данни, която искате да добавите.", + "cluster.databases.subtitle_other": "Това са базите данни във вашия Redis Enterprise клъстер. Изберете базите данни, които искате да добавите.", + "cluster.databases.title": "Автоматично откриване на бази данни на Redis Enterprise", + "cluster.endpoint.copyAriaLabel": "Копиране на публичната крайна точка", + "cluster.loadingMsg": "Моля изчакайте...", + "cluster.notFound": "Не успяхме да намерим нищо", + "cluster.result.error": "Грешка", + "cluster.result.pageTitle": "Добавени бази данни на Redis Enterprise", + "cluster.result.title_one": "Добавена база данни на Redis Enterprise", + "cluster.result.title_other": "Добавени бази данни на Redis Enterprise", + "cluster.result.viewButton": "Преглед на базите данни", + "cluster.summary.fail_one": "Неуспешно добавяне на {{count}} база данни.", + "cluster.summary.fail_other": "Неуспешно добавяне на {{count}} бази данни.", + "cluster.summary.label": "Обобщение: ", + "cluster.summary.success_one": "Успешно добавена {{count}} база данни", + "cluster.summary.success_other": "Успешно добавени {{count}} бази данни", + "common.connectionInfo.autofill": "Поставянето на URL адрес за връзка автоматично попълва детайлите на базата данни.", + "common.connectionInfo.supportedUrls": "Поддържат се следните URL адреси за връзка:", + "common.fullScreen.enter": "Цял екран", + "common.fullScreen.exit": "Изход от цял екран", + "common.fullScreen.openAria": "Отвори на цял екран", + "common.keyType.array": "Масив", + "common.keyType.graph": "Граф", + "common.keyType.hash": "Хеш", + "common.keyType.json": "JSON", + "common.keyType.list": "Списък", + "common.keyType.set": "Множество", + "common.keyType.sortedSet": "Сортирано множество", + "common.keyType.stream": "Поток", + "common.keyType.string": "Низ от символи", + "common.keyType.timeSeries": "Времеви редове", + "common.keyType.vectorSet": "Векторно множество", "common.privacyPolicy": "Политика за поверителност", + "common.uploadWarning": "Използвайте само файлове от доверени автори, за да избегнете автоматично изпълнение на зловреден код.", + "home.databaseList.bulkActions.delete.subtitle_one": "Избраният {{count}} елемент ще бъде изтрит от RedisInsight:", + "home.databaseList.bulkActions.delete.subtitle_other": "Избраните {{count}} елемента ще бъдат изтрити от RedisInsight:", + "home.databaseList.bulkActions.export.subtitle_one": "Избраният {{count}} елемент ще бъде експортиран от RedisInsight:", + "home.databaseList.bulkActions.export.subtitle_other": "Избраните {{count}} елемента ще бъдат експортирани от RedisInsight:", + "home.databaseList.cellHost.ariaLabel.copyHostPort": "Копиране на хост:порт", + "home.databaseList.cellName.tooltip.databaseAlias": "Псевдоним на базата данни", + "home.databaseList.controls.ariaLabel.controlsIcon": "Икона за управление", + "home.databaseList.controls.ariaLabel.editInstance": "Редактиране на инстанция", + "home.databaseList.controls.ariaLabel.manageInstanceTags": "Управление на тагове на инстанция", + "home.databaseList.controls.button.editDatabase": "Редактиране на база данни", + "home.databaseList.controls.button.removeDatabase": "Премахване на база данни", + "home.databaseList.controls.deleteConfirm.text": "ще бъде премахната от Redis Insight.", + "home.databaseList.controls.tooltip.goToCloud": "Отиди в Redis Cloud", + "home.databaseList.controls.tooltip.manageTags": "Управление на тагове", + "home.databaseList.dbStatus.checkCloudDatabase.autoDelete": "Безплатните бази данни в Redis Cloud се изтриват автоматично след {{days}} дни неактивност.", + "home.databaseList.dbStatus.checkCloudDatabase.capabilities": "Включва вградена поддръжка за JSON, Redis Search и още.", + "home.databaseList.dbStatus.checkCloudDatabase.recreate": "Но не се притеснявайте, можете винаги да я пресъздадете, за да тествате идеите си.", + "home.databaseList.dbStatus.checkCloudDatabase.title": "Изградете приложението си с Redis Cloud", + "home.databaseList.dbStatus.tooltip.new": "Ново", + "home.databaseList.dbStatus.warningWithCapability.body": "Здравейте, помните ли интереса си към {{capability}}?
Използвайте безплатната си база данни в Redis Cloud, за да я изпробвате.", + "home.databaseList.dbStatus.warningWithCapability.note": "Забележка: Безплатните бази данни в Cloud се изтриват автоматично след {{days}} дни неактивност.", + "home.databaseList.dbStatus.warningWithCapability.title": "Изградете приложението си с {{capability}}", + "home.databaseList.dbStatus.warningWithoutCapability.body": "Тествайте идеи и изграждайте прототипи.
Включва вградена поддръжка за JSON, Redis Search и още.", + "home.databaseList.dbStatus.warningWithoutCapability.note": "Забележка: Безплатните бази данни в Redis Cloud се изтриват автоматично след {{days}} дни неактивност.", + "home.databaseList.dbStatus.warningWithoutCapability.title": "Безплатната ви база данни в Redis Cloud ви очаква.", + "home.databaseList.empty.button.addDatabase": "Добавяне на Redis база данни", + "home.databaseList.empty.link.createCloudDb": "Създаване на безплатна база данни в Redis Cloud", + "home.databaseList.empty.noInstances": "Няма добавени инстанции", + "home.databaseList.empty.noResults": "Няма намерени резултати", + "home.databaseList.empty.title": "Все още нямате бази данни, нека добавим една!", + "home.databaseList.loading": "Моля изчакайте...", + "home.databaseList.manageTags.button.addTag": "Добавяне на допълнителен таг", + "home.databaseList.manageTags.button.cancel": "Отказ", + "home.databaseList.manageTags.button.save": "Запазване на тагове", + "home.databaseList.manageTags.description": "Таговете са двойки ключ-стойност, които ви позволяват да категоризирате базите данни.", + "home.databaseList.manageTags.error.invalidField": "Тагът може да съдържа само букви, цифри, интервали и следните специални символи: „- _ . + @ :“", + "home.databaseList.manageTags.error.maxKeyLength": "Ключът трябва да е под {{max}} символа", + "home.databaseList.manageTags.error.maxValueLength": "Стойността трябва да е под {{max}} символа", + "home.databaseList.manageTags.error.uniqueKey": "Ключът трябва да е уникален", + "home.databaseList.manageTags.header.key": "Ключ", + "home.databaseList.manageTags.header.value": "Стойност", + "home.databaseList.manageTags.placeholder.key": "Изберете ключ или въведете свой", + "home.databaseList.manageTags.placeholder.value": "Изберете стойност или въведете своя", + "home.databaseList.manageTags.suggestions.newTag": "{{term}} (нов таг)", + "home.databaseList.manageTags.suggestions.newValue": "{{term}} (нова стойност)", + "home.databaseList.manageTags.suggestions.title": "Предложения", + "home.databaseList.manageTags.title": "Управление на тагове за {{name}}", + "home.databaseList.manageTags.warning": "Промените в таговете в Redis Insight се прилагат локално и не се синхронизират с Redis {{product}}.", + "home.databaseList.search.ariaLabel": "Търсене в списъка с бази данни", + "home.databaseList.search.placeholder": "Търсене в списъка с бази данни", + "home.databaseList.tags.filter.placeholder": "Въведете ключ или стойност на тага", + "home.form.ariaLabel.back": "назад", + "home.form.button.addDatabase": "Добавяне на Redis база данни", + "home.form.button.cloneDatabase": "Клониране на база данни", + "home.form.button.editDatabase": "Прилагане на промените", + "home.form.cloud.button.cancel": "Отказ", + "home.form.cloud.button.submit": "Изпращане", + "home.form.cloud.field.accessKey": "Въведете API ключ за акаунта", + "home.form.cloud.field.secretKey": "Въведете потребителски API ключ", + "home.form.cloud.label.accessKey": "API ключ за акаунта", + "home.form.cloud.label.connectWith": "Свързване с", + "home.form.cloud.label.secretKey": "Потребителски API ключ", + "home.form.cloud.modalTitle": "Откриване на бази данни в Cloud", + "home.form.cloud.option.account": "Акаунт в Redis Cloud", + "home.form.cloud.option.apiKeys": "API ключове на Redis Cloud", + "home.form.cluster.button.cancel": "Отказ", + "home.form.cluster.button.submit": "Изпращане", + "home.form.cluster.field.host": "Хост на клъстера", + "home.form.cluster.field.password": "Парола на администратор", + "home.form.cluster.field.port": "Порт на клъстера", + "home.form.cluster.field.username": "Потребителско име на администратор", + "home.form.cluster.modalTitle": "Redis Software", + "home.form.cluster.placeholder.host": "Въведете хост на клъстера", + "home.form.cluster.placeholder.password": "Въведете парола", + "home.form.cluster.placeholder.port": "Въведете порт на клъстера", + "home.form.cluster.placeholder.username": "Въведете потребителско име на администратор", + "home.form.compressor.enable": "Активиране на автоматична декомпресия на данни", + "home.form.compressor.field.format": "Формат за декомпресия", + "home.form.compressor.option.none": "Без декомпресия", + "home.form.database.connectionFamily.auto": "Автоматично (IPv4 и IPv6)", + "home.form.database.connectionFamily.tooltip": "Изберете кой IP протокол да се използва при свързване. Използвайте IPv4 или IPv6, ако хостът не се разпознава правилно чрез другия протокол.", + "home.form.database.field.alias": "Псевдоним на базата данни", + "home.form.database.field.host": "Хост", + "home.form.database.field.ipProtocol": "IP протокол", + "home.form.database.field.password": "Парола", + "home.form.database.field.port": "Порт", + "home.form.database.field.timeout": "Таймаут (сек.)", + "home.form.database.field.username": "Потребителско име", + "home.form.database.placeholder.alias": "Въведете псевдоним на базата данни", + "home.form.database.placeholder.host": "Въведете име на хост / IP адрес / URL адрес за връзка", + "home.form.database.placeholder.password": "Въведете парола", + "home.form.database.placeholder.port": "Въведете порт", + "home.form.database.placeholder.timeout": "Въведете таймаут (в секунди)", + "home.form.database.placeholder.username": "Въведете потребителско име", + "home.form.dbIndex.field.databaseIndex": "Индекс на базата данни", + "home.form.dbIndex.placeholder.databaseIndex": "Въведете индекс на базата данни", + "home.form.dbIndex.selectLogicalDb": "Избор на логическа база данни", + "home.form.dbInfo.field.capabilities": "Възможности:", + "home.form.dbInfo.field.connectionType": "Тип на връзката:", + "home.form.dbInfo.field.databaseIndex": "Индекс на базата данни:", + "home.form.dbInfo.field.host": "Хост:", + "home.form.dbInfo.field.nameFromProvider": "Име на базата данни от доставчика:", + "home.form.dbInfo.field.port": "Порт:", + "home.form.dbInfo.tooltip.hostPort": "Хост:порт", + "home.form.dbInfoSentinel.ariaLabel.copyHostPort": "Копиране на хост:порт", + "home.form.dbInfoSentinel.field.hostAndPort": "Хост и порт на Sentinel:", + "home.form.dbInfoSentinel.field.primaryGroupName": "Име на основната група:", + "home.form.dbInfoSentinel.field.primaryGroupNameLabel": "Име на основна група", + "home.form.dbInfoSentinel.placeholder.primaryGroupName": "Въведете име на основната група", + "home.form.environment.development": "Разработка", + "home.form.environment.label": "Среда", + "home.form.environment.production": "Продукционна", + "home.form.environment.tooltip.description": "Класифицирайте тази база данни, за да приложите правилното поведение за безопасност.", + "home.form.environment.tooltip.development": "Разработка — Пропуска стандартните диалози за потвърждение при промяна на данни, за по-бърза работа с бази данни за разработка и тестване.", + "home.form.environment.tooltip.production": "Продукционна — Добавя допълнителен слой защита за предотвратяване на нежелани промени. Включва допълнителни диалози за потвърждение преди промяна на данни и по-силно съпротивление преди изпълнение на опасни команди.", + "home.form.environment.tooltip.unspecified": "Неопределено — Стандартно поведение на Redis Insight. Стойността по подразбиране за нови и съществуващи връзки.", + "home.form.environment.unspecified": "Неопределено", + "home.form.field.alias": "Псевдоним на базата данни", + "home.form.field.host": "Хост", + "home.form.field.newCaCert": "CA сертификат", + "home.form.field.newCaCertName": "Име на CA сертификата", + "home.form.field.newTlsCertPairName": "Име на клиентския сертификат", + "home.form.field.newTlsClientCert": "Клиентски сертификат", + "home.form.field.newTlsClientKey": "Частен ключ", + "home.form.field.port": "Порт", + "home.form.field.selectedCaCertName": "CA сертификат", + "home.form.field.sentinelMasterName": "Име на основната група", + "home.form.field.servername": "Име на сървър", + "home.form.field.sshHost": "SSH хост", + "home.form.field.sshPort": "SSH порт", + "home.form.field.sshPrivateKey": "SSH частен ключ", + "home.form.field.sshUsername": "SSH потребителско име", + "home.form.footer.button.cancel": "Отказ", + "home.form.footer.button.testConnection": "Тест на връзката", + "home.form.forceStandalone.label": "Принудителна самостоятелна връзка", + "home.form.forceStandalone.tooltip": "Заменя стандартната логика на връзка и се свързва към зададената крайна точка като самостоятелна база данни.", + "home.form.keyFormat.label": "Формат на името на ключа", + "home.form.manual.ariaLabel.cloneDatabase": "Клониране на база данни", + "home.form.manual.button.cloneConnection": "Клониране на връзка", + "home.form.manual.editSentinel.field.databaseAlias": "Псевдоним на базата данни", + "home.form.manual.editSentinel.placeholder.databaseAlias": "Въведете псевдоним на базата данни", + "home.form.manual.editSentinel.title.database": "База данни", + "home.form.manual.editSentinel.title.sentinel": "Sentinel", + "home.form.manual.tab.decompression": "Декомпресия и форматиращи инструменти", + "home.form.manual.tab.general": "Общи", + "home.form.manual.tab.security": "Сигурност", + "home.form.manual.title.cloneDatabase": "Клониране на база данни", + "home.form.manual.title.connectionSettings": "Настройки на връзката", + "home.form.manual.title.editDatabase": "Редактиране на база данни", + "home.form.message.cloudApiKeys": "Въведете API ключове на Redis Cloud, за да откриете и добавите бази данни. API ключовете могат да се активират, като следвате стъпките, описани в документацията.", + "home.form.message.enterpriseSoftware": "Вашите бази данни в Redis Software могат да се добавят автоматично. Въведете данните за връзка на вашия Redis Software клъстер, за да откриете автоматично базите си данни и да ги добавите към {{appName}}. Научете повече тук.", + "home.form.message.sentinel": "Можете автоматично да откриете и добавите основни групи от вашия Redis Sentinel. Въведете хост и порт на вашия Redis Sentinel, за да откриете автоматично основните си групи и да ги добавите към {{appName}}. Научете повече тук.", + "home.form.sentinel.button.cancel": "Отказ", + "home.form.sentinel.button.discover": "Откриване на база данни", + "home.form.sentinel.modalTitle": "Redis Sentinel", + "home.form.ssh.field.host": "Хост", + "home.form.ssh.field.passphrase": "Парола на ключа", + "home.form.ssh.field.password": "Парола", + "home.form.ssh.field.port": "Порт", + "home.form.ssh.field.privateKey": "Частен ключ", + "home.form.ssh.field.username": "Потребителско име", + "home.form.ssh.passType.password": "Парола", + "home.form.ssh.passType.privateKey": "Частен ключ", + "home.form.ssh.placeholder.host": "Въведете SSH хост", + "home.form.ssh.placeholder.passphrase": "Въведете парола на частния ключ", + "home.form.ssh.placeholder.password": "Въведете SSH парола", + "home.form.ssh.placeholder.port": "Въведете SSH порт", + "home.form.ssh.placeholder.privateKey": "Въведете SSH частен ключ във формат PEM", + "home.form.ssh.placeholder.username": "Въведете SSH потребителско име", + "home.form.ssh.useTunnel": "Използване на SSH тунел", + "home.form.tls.deleteConfirm.text": "ще бъде премахнат от RedisInsight.", + "home.form.tls.field.caCertificate": "CA сертификат", + "home.form.tls.field.certificate": "Сертификат", + "home.form.tls.field.certificateName": "Име", + "home.form.tls.field.clientCertificate": "Клиентски сертификат", + "home.form.tls.field.privateKey": "Частен ключ", + "home.form.tls.field.serverName": "Име на сървър", + "home.form.tls.option.addNewCaCert": "Добавяне на нов CA сертификат", + "home.form.tls.option.addNewCert": "Добавяне на нов сертификат", + "home.form.tls.option.noCaCert": "Без CA сертификат", + "home.form.tls.placeholder.caCert": "Въведете CA сертификат", + "home.form.tls.placeholder.caCertName": "Въведете име на CA сертификата", + "home.form.tls.placeholder.clientCert": "Въведете клиентски сертификат", + "home.form.tls.placeholder.clientCertName": "Въведете име на клиентския сертификат", + "home.form.tls.placeholder.privateKey": "Въведете частен ключ", + "home.form.tls.placeholder.selectCaCert": "Изберете CA сертификат", + "home.form.tls.placeholder.selectCert": "Изберете сертификат", + "home.form.tls.placeholder.serverName": "Въведете име на сървър", + "home.form.tls.requiresClientAuth": "Изисква TLS клиентска автентикация", + "home.form.tls.useSni": "Използване на SNI", + "home.form.tls.useTls": "Използване на TLS", + "home.form.tls.verifyCertificate": "Проверка на TLS сертификата", + "home.header.button.connectExistingDb": "Свързване към съществуваща база данни", + "home.header.button.createCloudDb": "Създаване на безплатна база данни в Cloud", + "home.importDatabase.button.cancel": "Отказ", + "home.importDatabase.button.ok": "OK", + "home.importDatabase.button.retry": "Опитай отново", + "home.importDatabase.button.submit": "Изпращане", + "home.importDatabase.description": "Използвайте JSON файл, за да импортирате връзките към базите данни. Уверете се, че използвате файлове само от доверени източници, за да избегнете риска от автоматично изпълнение на зловреден код.", + "home.importDatabase.error.failed": "Неуспешно добавяне на връзки към бази данни", + "home.importDatabase.error.maxFileSize": "Файлът не трябва да надвишава {{max}} MB", + "home.importDatabase.filePicker.ariaLabel": "Избор или пускане на файл с влачене", + "home.importDatabase.filePicker.prompt": "Изберете или пуснете файл с влачене", + "home.importDatabase.resultsLog.title.fail": "Неуспешно импортирани", + "home.importDatabase.resultsLog.title.partial": "Частично импортирани", + "home.importDatabase.resultsLog.title.success": "Напълно импортирани", + "home.importDatabase.table.successful": "Успешно", + "home.importDatabase.title": "Импортиране от файл", + "home.importDatabase.tooltip.uploadFile": "Качете файл", + "home.importDatabase.uploading": "Качване...", + "home.title": "Redis бази данни", + "notFound.button.databases": "Страница с бази данни", + "notFound.description": "Претърсихме всеки шард,
Но не открихме страницата, която търсите.", + "notFound.title": "Упс!
Тази страница не съществува", + "notification.error.appUpdateFailed.message": "Актуализацията не можа да бъде изтеглена. Моля, опитайте отново по-късно.", + "notification.error.appUpdateFailed.title": "Неуспешна актуализация", "notification.error.arrayBulkDeleteLimit.message": "Можете да изтриете най-много {{max}} елемента наведнъж. Изчистете част от селекцията и опитайте отново.", "notification.error.arrayBulkDeleteLimit.title": "Избрани са твърде много елементи", "notification.error.button.copied": "Копирано", "notification.error.button.copy": "Копирай", "notification.error.button.downloadFullLog": "Изтегли пълния лог", + "notification.error.createArray.message": "Моля, опитайте отново.", + "notification.error.createArray.title": "Неуспешно създаване на масив", + "notification.error.createVectorSet.message": "Моля, опитайте отново.", + "notification.error.createVectorSet.title": "Неуспешно създаване на векторно множество", "notification.error.default": "Надяваме се, че проблемът ще бъде решен бързо. Моля, опитайте отново по-късно.", "notification.error.encryption.button.cancel": "Отказ", "notification.error.encryption.button.disable": "Изключи криптирането", "notification.error.encryption.checkKeychain": "Проверете системния ключодържател или изключете криптирането, за да продължите.", "notification.error.encryption.disableWarning": "Изключването на криптирането ще доведе до съхранение на чувствителна информация локално в чист текст. Въведете отново данните за връзка с базата данни, за да работите с нея.", "notification.error.encryption.title": "Неуспешно декриптиране", + "notification.error.queryLibraryCleanupFailed.message": "Възникна грешка при премахване на запазените заявки за изтрития индекс.", + "notification.error.queryLibraryCleanupFailed.title": "Неуспешно почистване на библиотеката със заявки", + "notification.error.queryLibrarySaveFailed.message": "Възникна грешка при запазване на заявката. Моля, опитайте отново.", + "notification.error.queryLibrarySaveFailed.title": "Неуспешно запазване на заявката", "notification.error.reportIssue": "Ако проблемът продължава, ", "notification.error.reportIssueLink": "докладвайте ни.", "notification.error.title.default": "Опа, нещо се обърка...", "notification.error.tryAgainLater": "Опитайте отново по-късно.", + "notification.error.vectorSearchCreateIndexFailed.message": "Възникна грешка при създаването на индекса. Моля, опитайте отново.", + "notification.error.vectorSearchCreateIndexFailed.title": "Неуспешно създаване на индекс", "notification.infinite.appUpdateAvailable.button.restart": "Рестартирай", - "notification.infinite.appUpdateAvailable.description": "С Redis Insight {{version}} получавате достъп до нови полезни функции и оптимизации.", - "notification.infinite.appUpdateAvailable.descriptionRestart": "Рестартирайте Redis Insight, за да инсталирате актуализациите.", - "notification.infinite.appUpdateAvailable.message": "Налична е нова версия", + "notification.infinite.appUpdateAvailable.description": "Redis Insight {{version}} е тук - вижте какво е новото и рестартирайте, за да инсталирате.", + "notification.infinite.appUpdateAvailable.message": "Актуализацията е готова за инсталиране", + "notification.infinite.appUpdateDownloading.message": "Изтегляне на актуализацията…", + "notification.infinite.appUpdateFound.button.skip": "Пропусни тази версия", + "notification.infinite.appUpdateFound.button.update": "Актуализирай", + "notification.infinite.appUpdateFound.description": "Вижте какво е новото в Redis Insight {{version}}.", + "notification.infinite.appUpdateFound.message": "Налична е нова версия", "notification.infinite.authenticating.description": "Това може да отнеме няколко секунди, но определено си заслужава!", "notification.infinite.authenticating.message": "Удостоверяване…", "notification.infinite.autoCreatingDatabase.description": "Това може да отнеме няколко минути, но определено си заслужава!", @@ -292,6 +1435,10 @@ "notification.success.messageAction.title": "Съобщението беше {{action}}", "notification.success.noClaimedMessages.message": "Няма съобщения, които надвишават минималното време на бездействие.", "notification.success.noClaimedMessages.title": "Няма заявени съобщения", + "notification.success.queryLibraryDeleted.title": "Заявката е изтрита.", + "notification.success.queryLibrarySaved.action": "Към библиотеката със заявки", + "notification.success.queryLibrarySaved.message": "Можете да я намерите по всяко време в библиотеката със заявки.", + "notification.success.queryLibrarySaved.title": "Заявката е запазена във вашата библиотека.", "notification.success.removedAllCapiKeys.message": "Всички API ключове бяха премахнати от Redis Insight.", "notification.success.removedAllCapiKeys.title": "API ключовете бяха премахнати", "notification.success.removedArrayRange.message": "{{total}} елемент(а) премахнати от {{name}}", @@ -310,6 +1457,10 @@ "notification.success.removedListElements.title": "Елементите бяха премахнати", "notification.success.resetPipeline.message": "", "notification.success.resetPipeline.title": "", + "notification.success.sampleArrayAdded.message": "Примерният масив „{{keyName}}“ беше успешно добавен.", + "notification.success.sampleArrayAdded.title": "Примерният масив е добавен", + "notification.success.sampleVectorSetAdded.message": "Примерното векторно множество „{{keyName}}“ беше успешно добавено.", + "notification.success.sampleVectorSetAdded.title": "Примерното векторно множество е добавено", "notification.success.tagsUpdated.title": "Таговете бяха обновени успешно.", "notification.success.testConnection.title": "Връзката е успешна", "notification.success.uploadDataBulk.commandsProcessed": "Обработени команди", @@ -318,6 +1469,251 @@ "notification.success.uploadDataBulk.success": "Успешни", "notification.success.uploadDataBulk.timeTaken": "Изразходвано време", "notification.success.uploadDataBulk.title": "Действието завърши", + "notification.success.vectorSearchIndexCreated.message": "Данните ви вече са достъпни за търсене. Можете да започнете да изпълнявате заявки.", + "notification.success.vectorSearchIndexCreated.title": "Индексът е създаден успешно.", + "notification.success.vectorSearchSampleDataCreated.message": "Започнете да пишете заявки или разгледайте примерни в Библиотеката.", + "notification.success.vectorSearchSampleDataCreated.title": "Примерните данни вече са достъпни за търсене.", + "notification.success.vectorSearchSampleDataExists.message": "Можете да започнете да пишете нови заявки или да разгледате съществуващи в Библиотеката.", + "notification.success.vectorSearchSampleDataExists.title": "Примерните данни вече са достъпни за търсене чрез съществуващ индекс.", + "notification.warning.keyExists.message": "Ключ с име „{{keyName}}“ вече съществува в тази база данни.", + "notification.warning.keyExists.title": "Ключът вече съществува", + "notification.warning.sampleArrayNoTtl.message": "Примерният масив „{{keyName}}“ беше създаден, но TTL не можа да бъде приложен.", + "notification.warning.sampleArrayNoTtl.title": "Примерният масив е добавен без TTL", + "oauth.mfa.cancel": "Отказ", + "oauth.mfa.codeLabel": "6-цифрен код", + "oauth.mfa.description": "Вашият Redis Cloud акаунт е защитен с многофакторно удостоверяване. Въведете кода от приложението си за удостоверяване, за да завършите входа.", + "oauth.mfa.invalidCode": "Невалиден или изтекъл код. Опитайте отново.", + "oauth.mfa.title": "Въведете кода за потвърждение", + "oauth.mfa.totpUnavailable": "Този акаунт не може да бъде потвърден с приложение за удостоверяване тук. Завършете входа от конзолата на Redis Cloud.", + "oauth.mfa.verify": "Потвърди", + "pubsub.empty.description": "Абонирайте се за канала, за да видите всички съобщения, публикувани във вашата база данни", + "pubsub.empty.imageAlt": "Pub/Sub", + "pubsub.empty.productionWarning": "Изпълнението в производствена среда може да намали производителността и наличната памет.", + "pubsub.empty.spublishWarning": "Съобщенията, публикувани със SPUBLISH, няма да се появят в този канал", + "pubsub.empty.title": "Не сте абонирани", + "pubsub.messageCell.copyAriaLabel": "Копиране на съобщението", + "pubsub.messageCell.title": "Съобщение", + "pubsub.messages.label": "Съобщения:", + "pubsub.pageTitle": "{{dbName}} - Pub/Sub", + "pubsub.patterns.all": "Всички", + "pubsub.patterns.label": "Шаблони: {{value}}", + "pubsub.publish.button": "Публикуване", + "pubsub.publish.channelLabel": "Име на канал", + "pubsub.publish.channelPlaceholder": "Въведете име на канал", + "pubsub.publish.messageLabel": "Съобщение", + "pubsub.publish.messagePlaceholder": "Въведете съобщение", + "pubsub.publish.published": "Публикувано", + "pubsub.publish.publishedWithClients": "Публикувано ({{clients}})", + "pubsub.status.label": "Статус:", + "pubsub.status.subscribed": "Абониран", + "pubsub.status.unsubscribed": "Неабониран", + "pubsub.subscribe.button.subscribe": "Абониране", + "pubsub.subscribe.button.unsubscribe": "Отписване", + "pubsub.subscribe.channelsAriaLabel": "имена на канали за филтриране", + "pubsub.subscribe.clearAriaLabel": "изчистване на pub sub", + "pubsub.subscribe.clearTooltip": "Изчистване на съобщенията", + "pubsub.subscribe.info.channels": "Абонирайте се за един или повече канали или шаблони, като ги въведете, разделени с интервали.", + "pubsub.subscribe.info.patterns": "Поддържаните glob-style шаблони са описани тук.", + "pubsub.subscribe.patternPlaceholder": "Въведете шаблон", + "pubsub.table.column.channel": "Канал", + "pubsub.table.column.message": "Съобщение", + "pubsub.table.column.timestamp": "Времеви печат", + "pubsub.table.empty": "Все още няма публикувани съобщения", + "query.actions.groupMode.label": "Групиране на резултатите", + "query.actions.groupMode.tooltip": "Групира резултатите от командите в един прозорец.Когато са групирани, резултатите могат да се визуализират само в текстов формат.", + "query.actions.rawMode.label": "Необработен режим", + "query.actions.rawMode.tooltip": "Активира режима на необработен изход", + "query.card.clearResult.tooltip": "Изчистване на резултата", + "query.card.copyQuery.aria": "Копиране на заявката", + "query.card.delete.aria": "Изтриване на командата", + "query.card.mode.group": "Групов режим", + "query.card.mode.raw": "Необработен режим", + "query.card.mode.silent": "Тих режим", + "query.card.processingTime": "Време за обработка", + "query.card.queryParameters.aria": "Параметри на заявката", + "query.card.rerun.aria": "Повторно изпълнение на командата", + "query.card.rerun.tooltip": "Изпълни отново", + "query.card.summary.commands_one": "{{count}} команда - {{success}} успешни", + "query.card.summary.commands_other": "{{count}} команди - {{success}} успешни", + "query.card.summary.errors_one": ", {{count}} грешка", + "query.card.summary.errors_other": ", {{count}} грешки", + "query.card.toggleCollapse.aria": "Превключи резултата", + "query.cliResult.copy": "Копиране на резултата", + "query.cliResult.tooBig": "Резултатът е твърде голям, за да бъде запазен. Ще бъде изтрит след затваряне на приложението.", + "query.editor.vectorEmbedding.copy": "Копиране", + "query.editor.vectorEmbedding.hover": "Векторно представяне — {{dimensions}} измерения ({{byteSize}} байта)", + "query.editor.vectorEmbedding.label": "вектор · {{dimensions}} изм.", + "query.executing": "Моля, изчакайте, докато командите се изпълняват…", + "query.liteActions.clear.aria": "Изчисти заявката", + "query.liteActions.clear.label": "Изчисти", + "query.liteActions.clear.tooltip": "Изчистване на заявката", + "query.results.clear": "Изчистване на резултатите", + "query.runButton.aria": "Изпълни заявката", + "query.runButton.label": "Изпълни", + "query.runShortcut.label": "Изпълнение на командите", + "query.runShortcut.labelNonMac": "Изпълнение", + "query.tutorials.title": "Ръководства:", + "rdi.home.bulkDelete.subtitle_one": "Избраният {{count}} елемент ще бъде изтрит от RedisInsight:", + "rdi.home.bulkDelete.subtitle_other": "Избраните {{count}} елемента ще бъдат изтрити от RedisInsight:", + "rdi.home.column.controls": "Контроли", + "rdi.home.column.lastConnection": "Последна връзка", + "rdi.home.column.name": "RDI псевдоним", + "rdi.home.column.url": "URL", + "rdi.home.column.version": "RDI версия", + "rdi.home.empty.button": "Нека се свържем с RDI", + "rdi.home.empty.description": "Redis Data Integration (RDI) предава данни към Redis Cloud, осигурявайки синхронизация в реално време, като спестява време и разходи. Премахва пропуските в кеша и опростява управлението на данни.", + "rdi.home.empty.title": "Създаване на конвейер за данни", + "rdi.home.form.addButton": "Добавяне на крайна точка", + "rdi.home.form.addTitle": "Добавяне на RDI крайна точка", + "rdi.home.form.applyButton": "Прилагане на промените", + "rdi.home.form.auth.info": "Удостоверяването на RDI REST API използва потребителското име и паролата на RDI Redis.", + "rdi.home.form.cancel": "Отказ", + "rdi.home.form.editTitle": "Редактиране на крайна точка", + "rdi.home.form.name.label": "RDI псевдоним", + "rdi.home.form.name.placeholder": "Въведете RDI псевдоним", + "rdi.home.form.password.label": "Парола", + "rdi.home.form.password.placeholder": "Въведете паролата за RDI Redis", + "rdi.home.form.url.info": "RDI машината обслужва REST API през порт 443. Уверете се, че Redis Insight има достъп до RDI хоста през порт 443.", + "rdi.home.form.url.label": "URL", + "rdi.home.form.url.placeholder": "Въведете IP на RDI хоста като: https://[IP-адрес]", + "rdi.home.form.username.label": "Потребителско име", + "rdi.home.form.username.placeholder": "Въведете потребителското име за RDI Redis", + "rdi.home.form.wrapperTitle": "Добавяне на крайна точка", + "rdi.home.header.addButton": "RDI инстанция", + "rdi.home.instanceCell.copyUrlAria": "Копиране на URL", + "rdi.home.instanceControls.controlsAria": "Икона за контроли", + "rdi.home.instanceControls.deleteText": "ще бъде премахната от RedisInsight.", + "rdi.home.instanceControls.editAria": "Редактиране на инстанция", + "rdi.home.instanceControls.removeButton": "Премахване на инстанция", + "rdi.home.list.empty.loading": "Моля изчакайте...", + "rdi.home.list.empty.noEndpoints": "Няма добавени крайни точки", + "rdi.home.list.empty.noResults": "Няма намерени резултати", + "rdi.home.pageTitle": "Redis Data Integration", + "rdi.home.search.ariaLabel": "Търсене в списъка с RDI инстанции", + "rdi.home.search.placeholder": "Търсене в списъка с крайни точки", + "rdi.instance.configMenu.downloadDeployed": "Изтегляне на внедрения конвейер", + "rdi.instance.configMenu.importZip": "Импортиране на конвейер от ZIP файл", + "rdi.instance.configMenu.saveZip": "Запазване на конвейера в ZIP файл", + "rdi.instance.deploy.button": "Внедряване", + "rdi.instance.deploy.confirmTitle": "Сигурни ли сте, че искате да внедрите конвейера?", + "rdi.instance.deploy.errorsWarning": "Вашият RDI конвейер съдържа грешки. Сигурни ли сте, че искате да продължите?", + "rdi.instance.deploy.flushText": "След внедряването обмислете изчистване на целевата Redis база данни и нулиране на конвейера, за да сте сигурни, че всички данни са обработени наново.", + "rdi.instance.deploy.overwriteText": "При внедряване тази локална конфигурация ще замени всеки съществуващ конвейер.", + "rdi.instance.deploy.resetInfo": "Конвейерът ще направи нов снапшот на данните и ще ги обработи, след което ще продължи да следи промените.", + "rdi.instance.deploy.resetLabel": "Нулиране", + "rdi.instance.reset.ariaLabel": "Бутон за нулиране на конвейера", + "rdi.instance.reset.button": "Нулиране", + "rdi.instance.reset.tooltipLine1": "Конвейерът ще направи нов снапшот на данните и ще ги обработи, след което ще продължи да следи промените.", + "rdi.instance.reset.tooltipLine2": "Преди да нулирате RDI конвейера, обмислете спиране на конвейера и изчистване на целевата Redis база данни.", + "rdi.instance.start.ariaLabel": "Стартиране на конвейера", + "rdi.instance.start.button": "Старт", + "rdi.instance.start.tooltip": "Стартирайте конвейера, за да възобновите обработката на нови постъпващи данни.", + "rdi.instance.status.creating": "Създаване", + "rdi.instance.status.deleting": "Изтриване", + "rdi.instance.status.error": "Грешка", + "rdi.instance.status.initialSync": "Първоначална синхронизация", + "rdi.instance.status.notReady": "Не е готов", + "rdi.instance.status.notRunning": "Не работи", + "rdi.instance.status.pending": "В изчакване", + "rdi.instance.status.ready": "Готов", + "rdi.instance.status.resetting": "Нулиране", + "rdi.instance.status.started": "Стартиран", + "rdi.instance.status.starting": "Стартиране", + "rdi.instance.status.stopped": "Спрян", + "rdi.instance.status.stopping": "Спиране", + "rdi.instance.status.streaming": "Стрийминг", + "rdi.instance.status.title": "Състояние на конвейера", + "rdi.instance.status.unknown": "Неизвестно", + "rdi.instance.status.updating": "Обновяване", + "rdi.instance.stop.ariaLabel": "Спиране на конвейера", + "rdi.instance.stop.button": "Стоп", + "rdi.instance.stop.tooltip": "Спрете конвейера, за да предотвратите обработката на нови постъпващи данни.", + "rdi.pipeline.config.description": "Конфигурирайте детайлите за връзка и настройките за прилагане на целевата инстанция.", + "rdi.pipeline.config.testButton": "Тест на връзката", + "rdi.pipeline.config.title": "Конфигурация на целевата база данни", + "rdi.pipeline.download.body": "При изтегляне на конфигурацията на конвейера от сървъра, тя ще замени съществуващата, показана в Redis Insight.", + "rdi.pipeline.download.cancel": "Отказ", + "rdi.pipeline.download.confirm": "Изтегляне от сървъра", + "rdi.pipeline.download.saveToFile": "Запазване във файл", + "rdi.pipeline.download.title": "Изтегляне на конвейер от сървъра", + "rdi.pipeline.dryRun.closeAria": "затваряне на панела за пробно изпълнение", + "rdi.pipeline.dryRun.fullscreenAria": "превключване на цял екран за панела за пробно изпълнение", + "rdi.pipeline.dryRun.inputHelp": "Добавете входни данни, за да тествате логиката на трансформация.", + "rdi.pipeline.dryRun.inputInvalid": "Входните данни трябва да са във формат JSON", + "rdi.pipeline.dryRun.inputTitle": "Вход", + "rdi.pipeline.dryRun.jobOutput": "Изход на задачата", + "rdi.pipeline.dryRun.jobOutputTooltip": "Показва списъка с Redis команди, които ще бъдат генерирани въз основа на детайлите на вашата задача.Не се записват данни в целевата база данни.", + "rdi.pipeline.dryRun.noCommands": "Сървърът не предостави Redis команди.", + "rdi.pipeline.dryRun.noTransformation": "Сървърът не предостави резултати от трансформация.", + "rdi.pipeline.dryRun.runButton": "Пробно изпълнение", + "rdi.pipeline.dryRun.title": "Тестване на логиката на трансформация", + "rdi.pipeline.dryRun.transformationOutput": "Изход на трансформацията", + "rdi.pipeline.dryRun.transformationTooltip": "Показва резултатите от трансформациите, които сте дефинирали. Данните са представени във формат JSON.Не се записват данни в целевата база данни.", + "rdi.pipeline.error.defaultMsg": "Неуспешно преобразуване на YAML в JSON структура", + "rdi.pipeline.error.defaultName": "Стойността", + "rdi.pipeline.invalidStructure": "{{name}} има невалидна структура.", + "rdi.pipeline.job.dedicatedEditorButton": "SQL и JMESPath редактор", + "rdi.pipeline.job.description": "Създайте задача за всяка таблица източник, за да филтрирате, трансформирате и съпоставите данни към Redis.", + "rdi.pipeline.job.dryRunButton": "Пробно изпълнение", + "rdi.pipeline.jobName.inUse": "Името на задачата вече се използва", + "rdi.pipeline.jobName.placeholder": "Въведете име на задача", + "rdi.pipeline.jobName.required": "Името на задачата е задължително", + "rdi.pipeline.loading": "Зареждане...", + "rdi.pipeline.nav.addJobAria": "добавяне на нов файл на задача", + "rdi.pipeline.nav.addJobTooltip": "Добавяне на файл на задача", + "rdi.pipeline.nav.configFile": "Конфигурационен файл", + "rdi.pipeline.nav.configTitle": "Конфигурация", + "rdi.pipeline.nav.deleteConfirm": "Изтриване", + "rdi.pipeline.nav.deleteJobAria": "изтриване на задача", + "rdi.pipeline.nav.deleteJobBody": "Промените няма да бъдат приложени, докато конвейерът не бъде внедрен.", + "rdi.pipeline.nav.deleteJobTitle": "Изтриване на {{name}}", + "rdi.pipeline.nav.deleteJobTooltip": "Изтриване на задача", + "rdi.pipeline.nav.editJobAria": "редактиране на името на файла на задачата", + "rdi.pipeline.nav.editJobTooltip": "Редактиране на името на файла на задачата", + "rdi.pipeline.nav.jobsTitle": "Трансформиране и валидиране", + "rdi.pipeline.nav.title": "Управление на конвейера", + "rdi.pipeline.nav.undeployedChanges": "Този файл съдържа невнедрени промени.", + "rdi.pipeline.pageTitle": "{{name}} - Управление на конвейера", + "rdi.pipeline.source.createNew": "Създаване на нов конвейер", + "rdi.pipeline.source.importZip": "Импортиране на конвейер от ZIP файл", + "rdi.pipeline.source.subtitle": "за да започнете с вашия конвейер", + "rdi.pipeline.source.title": "Изберете опция", + "rdi.pipeline.template.apply": "Прилагане", + "rdi.pipeline.template.cancel": "Отказ", + "rdi.pipeline.template.dbType": "Тип база данни", + "rdi.pipeline.template.editorOnly": "Шаблоните са достъпни само с празен редактор, за да се предотврати потенциална загуба на данни.", + "rdi.pipeline.template.insertAria": "Вмъкване на шаблон", + "rdi.pipeline.template.insertButton": "Вмъкване на шаблон", + "rdi.pipeline.template.noTemplateLabel": "Без шаблон", + "rdi.pipeline.template.noneAvailableLine1": "Няма наличен шаблон.", + "rdi.pipeline.template.noneAvailableLine2": "Затворете формата и опитайте отново.", + "rdi.pipeline.template.pipelineType": "Тип конвейер", + "rdi.pipeline.template.title": "Изберете шаблон", + "rdi.pipeline.testConn.closeAria": "затваряне на панела за тест на връзките", + "rdi.pipeline.testConn.colEndpoint": "Крайна точка", + "rdi.pipeline.testConn.colResults": "Резултати", + "rdi.pipeline.testConn.loading": "Зареждане на резултатите...", + "rdi.pipeline.testConn.noResults": "Няма намерени резултати. Моля, опитайте отново.", + "rdi.pipeline.testConn.source": "Връзки към източника", + "rdi.pipeline.testConn.successful": "Успешно", + "rdi.pipeline.testConn.target": "Връзки към целта", + "rdi.pipeline.testConn.title": "Тест на връзката", + "rdi.pipeline.upload.errorNoConfig": "config.yaml липсва", + "rdi.pipeline.upload.errorNoJobs": "Не е намерена папка jobs", + "rdi.pipeline.upload.errorZip": "Възникна проблем с .zip файла", + "rdi.pipeline.upload.resultFail": "Неуспешно качване на конвейера", + "rdi.pipeline.upload.resultSuccess": "Конвейерът е качен", + "rdi.pipeline.upload.submitButton": "Качване", + "rdi.pipeline.upload.submitResults": "Нов конвейер беше успешно качен.", + "rdi.pipeline.upload.titleArchive": "Качете архив с RDI конвейер", + "rdi.pipeline.upload.titleNew": "Качване на нов конвейер", + "rdi.pipeline.upload.warning": "Ако бъде качен нов конвейер, съществуващата конфигурация на конвейера и задачите за трансформация ще бъдат презаписани. Промените няма да бъдат приложени, докато конвейерът не бъде внедрен.", + "rdi.statistics.empty.addButton": "Добавяне на конвейер", + "rdi.statistics.empty.description": "Създайте първия си конвейер, за да започнете!", + "rdi.statistics.empty.title": "Все още няма разгърнат конвейер", + "rdi.statistics.error": "Неочаквана грешка във вашата RDI крайна точка, моля, презаредете страницата", + "rdi.statistics.pageTitle": "{{name}} - Състояние на конвейера", + "redisStack.title": "Redis Stack", "settings.advanced.keysToScan.label": "Ключове за сканиране:", "settings.advanced.keysToScan.summary": "Задава броя ключове, сканирани на една итерация. Филтрирането по шаблон при голям брой ключове може да намали производителността.", "settings.advanced.keysToScan.title": "Ключове за сканиране в изглед Списък", @@ -362,6 +1758,10 @@ "settings.general.theme.option.light": "Светла тема", "settings.general.theme.option.system": "Същата като системната", "settings.general.theme.title": "Цветова тема", + "settings.general.updates.label": "Изберете как да получавате нови версии:", + "settings.general.updates.option.auto": "Изтегляй и инсталирай автоматично", + "settings.general.updates.option.notify": "Питай ме преди да изтеглиш новата версия", + "settings.general.updates.title": "Актуализации", "settings.language.label": "Изберете езика, използван в Redis Insight:", "settings.language.title": "Език", "settings.privacy.description": "За да оптимизира работата Ви, Redis Insight използва инструменти на трети страни.", @@ -377,13 +1777,395 @@ "settings.workbench.pipeline.label": "Команди в pipeline:", "settings.workbench.pipeline.summary": "Задава размера на пакета от команди за pipeline режима в Работна среда. 0 или 1 изпраща всяка команда поотделно.", "settings.workbench.pipeline.title": "Pipeline режим", + "tips.badge.codeChanges": "Промени в кода", + "tips.badge.configurationChanges": "Промени в конфигурацията", + "tips.badge.upgrade": "Надстройка", + "tips.content.RTS.title": "Опитайте да използвате вградената структура от данни на Redis за времеви редове и възможностите за заявки", + "tips.content.avoidLogicalDatabases.title": "Избягвайте използването на логически бази данни", + "tips.content.bigAmountOfConnectedClients.title": "Не отваряйте нова връзка за всяка заявка / всяка команда", + "tips.content.bigHashes.title": "Разделете големите хешове на по-малки хешове", + "tips.content.bigSets.title": "Обмислете използването на вероятностни структури от данни, като Bloom Filter или HyperLogLog", + "tips.content.bigStrings.title": "Избягвайте големи низове", + "tips.content.combineSmallStringsToHashes.title": "Обединете малките низове в хешове", + "tips.content.compressHashFieldNames.title": "Компресирайте имената на полетата в хеша", + "tips.content.compressionForList.title": "Активирайте компресията за списъка", + "tips.content.functionsWithKeyspace.title": "Обмислете използването на тригери и функции, за да реагирате в реално време на промени в базата данни", + "tips.content.functionsWithStreams.title": "Обмислете използването на тригери и функции, за да реагирате в реално време на записи в поток", + "tips.content.hashHashtableToZiplist.title": "Преобразувайте hashtable в ziplist за хешове", + "tips.content.increaseSetMaxIntsetEntries.title": "Увеличете set-max-intset-entries", + "tips.content.luaScript.title": "Избягвайте динамични Lua скриптове", + "tips.content.luaToFunctions.title": "Обмислете използването на тригери и функции", + "tips.content.redisSearch.title": "Оптимизирайте изживяването си при заявки и търсене", + "tips.content.redisVersion.title": "Надстройте вашата Redis база данни до версия 8 или по-нова", + "tips.content.searchHash.title": "Опитайте да индексирате вашите хеш документи, за да заявявате и извличате данни", + "tips.content.searchIndexes.title": "Опитайте индексирането, заявките и пълнотекстовото търсене, разработени от Redis", + "tips.content.searchJSON.title": "Опитайте да индексирате вашите JSON документи за по-ефективно извличане на данни", + "tips.content.searchVisualization.title": "Опитайте Работна среда, усъвършенстваният команден интерфейс", + "tips.content.setPassword.title": "Задайте парола", + "tips.content.stringToJson.title": "Опитайте вграденото ни хранилище за JSON документи", + "tips.content.tryRDI.title": "Синхронизирайте Redis с данни в реално време от друга база данни", + "tips.content.useSmallerKeys.title": "Използвайте по-къси имена на ключове", + "tips.content.zSetHashtableToZiplist.title": "Преобразувайте hashtable в ziplist за сортирани множества", + "tips.copyKey.copyAria": "копиране на името на ключа", + "tips.copyKey.label": "Пример за ключ, който може да е релевантен:", + "tips.eagerForMoreTips": "Искате още съвети? Стартирайте Анализ на базата данни, за да започнете.", + "tips.newTipsInfo": "Нови съвети се появяват, докато работите с базата данни, включително как да подобрите производителността и да оптимизирате използването на паметта.", + "tips.panel.checkboxShowHiddenAria": "чекбокс за показване на скритите", + "tips.panel.footer": "Стартирайте Анализ на базата данни, за да получите повече съвети", + "tips.panel.githubRepoAria": "хранилище на redis insight в github", + "tips.panel.infoTooltip": "Съветите ще ви помогнат да подобрите базата данни.", + "tips.panel.showHidden": "Показване на скритите", + "tips.panel.title": "Нашите съвети", + "tips.recommendation.hide.content": "Този съвет ще бъде премахнат от списъка и няма да се показва отново.", + "tips.recommendation.hide.title": "Скриване на съвета", + "tips.recommendation.redisStackTooltip": "Redis Stack", + "tips.recommendation.show.content": "Този съвет ще се показва в списъка.", + "tips.recommendation.show.title": "Показване на съвета", + "tips.recommendation.snooze.aria": "отлагане на съвет", + "tips.recommendation.snooze.content": "Този съвет ще бъде премахнат от списъка и ще се появи отново, когато е релевантен.", + "tips.recommendation.snooze.title": "Отлагане на съвета", + "tips.recommendation.startTutorial": "Стартиране на урок", + "tips.recommendation.toggleHideAria": "скриване/показване на съвет", + "tips.recommendation.workbench": "Работна среда", + "tips.runAnalysis.approveButton": "Анализирай", + "tips.runAnalysis.popoverTitle": "Анализ на базата данни", + "tips.runAnalysis.tooltip": "Анализирайте до 10 000 ключа, за да получите преглед на вашите данни и съвети как да спестите памет и да оптимизирате използването на базата данни.", + "tips.runAnalysis.tooltipCluster": "Анализирайте до 10 000 ключа на шард, за да получите преглед на вашите данни и съвети как да спестите памет и да оптимизирате използването на базата данни.", + "tips.unknownFormat": "*Непознат формат*", + "tips.voting.closePopoverAria": "затваряне на изскачащия прозорец", + "tips.voting.disabledTooltip": "Активирайте Analytics в страницата с настройки, за да гласувате за съвет", + "tips.voting.dislikeFollowUp": "Кажете ни какво можем да подобрим.", + "tips.voting.githubLink": "Към GitHub", + "tips.voting.githubRepoAria": "проблеми на redis insight в github", + "tips.voting.likeFollowUp": "Споделете идеите си с нас.", + "tips.voting.notUseful": "Не е полезно", + "tips.voting.question": "Полезно ли е това?", + "tips.voting.thanks": "Благодарим ви за обратната връзка.", + "tips.voting.useful": "Полезно", + "tips.voting.voteUsefulAria": "гласувай полезно", + "tips.welcome.analyzeButton": "Анализирай база данни", + "tips.welcome.connectPrompt": "Искате съвети? Свържете се с база данни, за да започнете.", + "tips.welcome.product": "Съвети!", + "tips.welcome.subtitle": "Тук ви помагаме да подобрите базата данни.", + "tips.welcome.title": "Добре дошли в", + "vectorSearch.commandView.copied": "Копирано", + "vectorSearch.commandView.copyAria": "Копирай командата", + "vectorSearch.createIndex.confirmKeyChange.body": "Вече сте направили промени по типовете на индекса. Избирането на друг ключ ще отхвърли промените ви и ще зареди полета от новия ключ.", + "vectorSearch.createIndex.confirmKeyChange.discardAndLoad": "Отхвърли и зареди", + "vectorSearch.createIndex.confirmKeyChange.keepEditing": "Продължи редактирането", + "vectorSearch.createIndex.confirmKeyChange.title": "Незапазени промени", + "vectorSearch.createIndex.content.emptyState": "Схемата на индексиране ще се появи тук, след като\nизберете ключ от браузъра вляво.", + "vectorSearch.createIndex.content.emptyStateManual": "Изградете своя индекс за търсене, като ръчно добавите полетата, които искате да индексирате.\nЩе трябва да зададете име на индекса и префикс, за да определите кои ключове да бъдат включени.", + "vectorSearch.createIndex.createDisabledReason": "Изберете ключ и поне едно поле за индексиране.", + "vectorSearch.createIndex.createDisabledReasonManual": "Добавете поне едно поле за индексиране.", + "vectorSearch.createIndex.displayNameFallback": "съществуващи данни", + "vectorSearch.createIndex.footer.cancel": "Отказ", + "vectorSearch.createIndex.footer.createIndex": "Създай индекс", + "vectorSearch.createIndex.footer.skippedFields_one": "Полето \"{{name}}\" беше премахнато — вложени обекти и масиви не могат да бъдат индексирани директно.", + "vectorSearch.createIndex.footer.skippedFields_other": "{{count}} полета бяха премахнати ({{list}}) — вложени обекти и масиви не могат да бъдат индексирани директно.", + "vectorSearch.createIndex.header.defineTitle": "Дефиниране на индекс за търсене:", + "vectorSearch.createIndex.header.infoTooltip": "Изберете ключ от левия панел, за да ви предложим автоматично схема на индексиране.", + "vectorSearch.createIndex.header.sampleTitle": "Преглед на индекс за примерни данни: {{name}}", + "vectorSearch.createIndex.indexName.cancelEditing": "Отказ от редактиране", + "vectorSearch.createIndex.indexName.confirmName": "Потвърди името на индекса", + "vectorSearch.createIndex.indexName.editName": "Редактирай името на индекса", + "vectorSearch.createIndex.toolbar.addField": "+ Добави поле", + "vectorSearch.createIndex.toolbar.commandView": "Изглед за напреднали", + "vectorSearch.createIndex.toolbar.indexPrefix": "Префикс на индекса:", + "vectorSearch.createIndex.toolbar.keyType": "Тип на ключа:", + "vectorSearch.createIndex.toolbar.tableView": "Табличен изглед", + "vectorSearch.fallback.getStarted": "Започнете безплатно", + "vectorSearch.fallback.learnMore": "Научете повече", + "vectorSearch.fieldType.desc.geo": "Използвайте GEO за географски координати (ширина и дължина).", + "vectorSearch.fieldType.desc.numeric": "Използвайте NUMERIC за съхранение и заявки към числа.", + "vectorSearch.fieldType.desc.tag": "Използвайте TAG за филтриране по точно съвпадение на стойности.", + "vectorSearch.fieldType.desc.text": "Използвайте TEXT за пълнотекстово търсене и индексиране на свободен текст.", + "vectorSearch.fieldType.desc.vector": "Използвайте VECTOR за семантично търсене чрез векторни представяния.", + "vectorSearch.fieldType.list.geo": "Заявки за географско разстояние и радиус", + "vectorSearch.fieldType.list.intro": "Определя как Redis търси в това поле и как то се държи по време на заявка. Налични типове индексиране:", + "vectorSearch.fieldType.list.numeric": "Заявки за диапазон и сортиране", + "vectorSearch.fieldType.list.optionalSettings": "Незадължителните настройки може да повлияят на производителността, съхранението или класирането.", + "vectorSearch.fieldType.list.tag": "Точно съвпадение и филтриране", + "vectorSearch.fieldType.list.text": "Пълнотекстово търсене и оценяване на релевантност", + "vectorSearch.fieldType.list.vector": "Търсене по сходство и семантика", + "vectorSearch.fieldType.modal.add": "Добави", + "vectorSearch.fieldType.modal.addTitle": "Добавяне на поле", + "vectorSearch.fieldType.modal.cancel": "Отказ", + "vectorSearch.fieldType.modal.changeTypeBody": "Можете да промените типа на това поле. Имайте предвид, че промяната на типа на полето ще повлияе на начина, по който полето се индексира и към него се правят заявки.", + "vectorSearch.fieldType.modal.editTitle": "Редактиране на поле", + "vectorSearch.fieldType.modal.fieldName": "Име на поле", + "vectorSearch.fieldType.modal.fieldNameLabel": "Име на поле:", + "vectorSearch.fieldType.modal.fieldNamePlaceholder": "Въведете име на поле", + "vectorSearch.fieldType.modal.fieldSampleValue": "Примерна стойност на поле:", + "vectorSearch.fieldType.modal.save": "Запази", + "vectorSearch.fieldType.phonetic.en": "Английски (dm:en)", + "vectorSearch.fieldType.phonetic.es": "Испански (dm:es)", + "vectorSearch.fieldType.phonetic.fr": "Френски (dm:fr)", + "vectorSearch.fieldType.phonetic.none": "Няма", + "vectorSearch.fieldType.phonetic.pt": "Португалски (dm:pt)", + "vectorSearch.fieldType.sectionOptions": "{{type}} опции", + "vectorSearch.fieldType.text.phoneticMatcher": "Фонетично съответствие", + "vectorSearch.fieldType.text.phoneticMatcherTooltip": "Извършва фонетично съответствие при търсения.", + "vectorSearch.fieldType.text.weight": "Тегло", + "vectorSearch.fieldType.text.weightTooltip": "Определя важността на този атрибут при изчисляване на точността на резултатите.", + "vectorSearch.fieldType.validation.candidateLimitRange": "Ограничението на кандидатите трябва да е между {{min}} и {{max}}.", + "vectorSearch.fieldType.validation.dimensionsRange": "Размерностите трябва да са между {{min}} и {{max}}.", + "vectorSearch.fieldType.validation.dimensionsRequired": "Стойността за размерности е задължителна.", + "vectorSearch.fieldType.validation.epsilonMin": "Epsilon трябва да е {{min}} или по-голямо.", + "vectorSearch.fieldType.validation.fieldNameDuplicate": "Поле с това име вече съществува.", + "vectorSearch.fieldType.validation.fieldNameRequired": "Името на полето е задължително.", + "vectorSearch.fieldType.validation.maxEdgesRange": "Максималният брой ребра трябва да е между {{min}} и {{max}}.", + "vectorSearch.fieldType.validation.maxNeighborsRange": "Максималният брой съседи трябва да е между {{min}} и {{max}}.", + "vectorSearch.fieldType.validation.weightMin": "Теглото трябва да е по-голямо от 0.", + "vectorSearch.fieldType.vector.algorithm": "Алгоритъм", + "vectorSearch.fieldType.vector.algorithmTooltip": "Използвайте FLAT за малки набори от данни или когато е важна точната точност. Използвайте HNSW за по-големи набори от данни или когато бързото търсене е важно.", + "vectorSearch.fieldType.vector.candidateLimit": "Ограничение на кандидатите", + "vectorSearch.fieldType.vector.candidateLimitTooltip": "Максимален брой водещи кандидати, разглеждани по време на KNN търсене. По-високите стойности подобряват точността, но увеличават латентността.", + "vectorSearch.fieldType.vector.dimensions": "Размерности", + "vectorSearch.fieldType.vector.dimensionsTooltip": "Брой размерности във всеки вектор. Векторите на заявката трябва да съвпадат с този размер.", + "vectorSearch.fieldType.vector.distanceMetric": "Метрика за разстояние", + "vectorSearch.fieldType.vector.distanceMetricTooltip": "Метрика за разстояние при сравнение на вектори.", + "vectorSearch.fieldType.vector.epsilon": "Epsilon", + "vectorSearch.fieldType.vector.epsilonTooltip": "Относителен фактор за границите на заявка за диапазон. По-високите стойности разширяват търсенето.", + "vectorSearch.fieldType.vector.maxEdges": "Максимален брой ребра", + "vectorSearch.fieldType.vector.maxEdgesTooltip": "Максимален брой изходящи ребра на възел. По-високите стойности подобряват точността, но увеличават използваната памет.", + "vectorSearch.fieldType.vector.maxNeighbors": "Максимален брой съседи", + "vectorSearch.fieldType.vector.maxNeighborsTooltip": "Максимален брой съседи, разглеждани при изграждане на графа. По-високите стойности подобряват точността, но забавят индексирането.", + "vectorSearch.fieldType.vector.vectorType": "Тип вектор", + "vectorSearch.indexDetails.editFieldAria": "Редактиране на поле", + "vectorSearch.indexDetails.editFieldType": "Редактиране на типа на полето", + "vectorSearch.indexDetails.fieldName": "Име на поле", + "vectorSearch.indexDetails.fieldNameTooltip.description": "Представлява атрибут за търсене във вашите данни. Само избраните полета ще бъдат достъпни за търсене.", + "vectorSearch.indexDetails.fieldNameTooltip.title": "Име на поле", + "vectorSearch.indexDetails.fieldSampleValue": "Примерна стойност на поле", + "vectorSearch.indexDetails.fieldTypeTooltip.title": "Тип на индексиране и опции", + "vectorSearch.indexDetails.fieldValueTooltip.description": "Примерна стойност от данните, които ще бъдат индексирани. Използвайте я, за да проверите типа на полето и избора на индексиране.", + "vectorSearch.indexDetails.fieldValueTooltip.title": "Примерна стойност на поле", + "vectorSearch.indexDetails.indexingType": "Тип на индексиране", + "vectorSearch.indexDetails.suggestedIndexingType": "Предложен тип на индексиране", + "vectorSearch.indexInfo.closePanel": "Затваряне на панела", + "vectorSearch.indexInfo.column.attribute": "Атрибут", + "vectorSearch.indexInfo.column.identifier": "Идентификатор", + "vectorSearch.indexInfo.column.type": "Тип", + "vectorSearch.indexInfo.column.weight": "Тегло", + "vectorSearch.indexInfo.documents": "документи.", + "vectorSearch.indexInfo.documentsPrefixed": "документи с префикс {{prefixes}}.", + "vectorSearch.indexInfo.indexing": "Индексиране", + "vectorSearch.indexInfo.noOptionsFound": "няма намерени опции", + "vectorSearch.indexInfo.optionFilter": "филтър: {{value}}", + "vectorSearch.indexInfo.optionLanguage": "език: {{value}}", + "vectorSearch.indexInfo.options": "Опции: {{options}}", + "vectorSearch.indexInfo.summary": "Брой документи: {{numDocs}} (макс. {{maxDocId}}) | Брой записи: {{numRecords}} | Брой термини: {{numTerms}}", + "vectorSearch.keysBrowser.results": "Резултати: {{count}} ключа", + "vectorSearch.keysBrowser.scanned": "Сканирани {{scanned}}/{{total}}", + "vectorSearch.keysBrowser.scanning": "Сканиране...", + "vectorSearch.keysBrowser.selectKey": "Изберете ключ", + "vectorSearch.keysBrowser.supportedTypesInfo": "Само типовете ключове HASH и JSON се поддържат при създаване на индекс.", + "vectorSearch.keysBrowser.total": "Общо: {{total}}", + "vectorSearch.list.action.browseDataset": "Преглед на данните", + "vectorSearch.list.action.delete": "Изтрий", + "vectorSearch.list.action.query": "Заявка", + "vectorSearch.list.action.viewIndex": "Преглед на индекс", + "vectorSearch.list.column.docs": "Документи", + "vectorSearch.list.column.fields": "Полета", + "vectorSearch.list.column.name": "Име на индекс", + "vectorSearch.list.column.prefix": "Префикс на индекс", + "vectorSearch.list.column.records": "Записи", + "vectorSearch.list.column.terms": "Термини", + "vectorSearch.list.column.types": "Типове на индекс", + "vectorSearch.list.createMenu.checkingKeys": "Проверка за съществуващи ключове…", + "vectorSearch.list.createMenu.create": "+ Създай индекс за търсене", + "vectorSearch.list.createMenu.existingData": "Използвай съществуващи данни", + "vectorSearch.list.createMenu.noKeys": "Няма намерени Hash или JSON ключове във вашата база данни", + "vectorSearch.list.createMenu.sampleData": "Използвай примерни данни", + "vectorSearch.list.delete.cancel": "Запази индекса", + "vectorSearch.list.delete.confirm": "Изтрий индекса", + "vectorSearch.list.delete.message": "Изтриването на индекса ще го премахне от страницата за Търсене, но няма да изтрие основните ви данни.", + "vectorSearch.list.delete.question": "Сигурни ли сте, че искате да изтриете този индекс?", + "vectorSearch.list.delete.title": "Изтриване на индекс", + "vectorSearch.list.empty.loading": "Зареждане...", + "vectorSearch.list.empty.noIndexes": "Няма намерени индекси", + "vectorSearch.list.empty.noResults": "Няма намерени резултати", + "vectorSearch.list.header.description": "Индексът за търсене организира данните ви, за да позволи бързо векторно, пълнотекстово, хибридно и числово търсене в Redis.", + "vectorSearch.list.header.learnMore": "Научете повече", + "vectorSearch.list.header.title": "Индекси за търсене", + "vectorSearch.list.search.placeholder": "Търсене на индекс", + "vectorSearch.list.tooltip.docs": "Брой на текущо индексираните документи.", + "vectorSearch.list.tooltip.fields": "Общ брой полета, дефинирани в схемата на индекса.", + "vectorSearch.list.tooltip.prefix": "Ключовете, съвпадащи с този префикс, се индексират автоматично.", + "vectorSearch.list.tooltip.records": "Общ брой индексирани двойки поле-стойност във всички документи. Един документ с 5 полета = 5 записа.", + "vectorSearch.list.tooltip.terms": "Уникални думи, извлечени от TEXT полета за пълнотекстово търсене.", + "vectorSearch.noResults.imageAlt": "Няма резултати от търсенето", + "vectorSearch.noResults.text": "Резултатите от вашата заявка ще се покажат тук, след като изпълните заявка.", + "vectorSearch.notAvailable.ctaText": "Използвайте безплатна база данни в Redis Cloud „всичко в едно“, за да започнете да изпозвате тези фунционалности", + "vectorSearch.notAvailable.description": "Тези функции позволяват заявки по няколко полета, агрегиране, точно съвпадение на фрази, числово филтриране, гео филтриране и семантично търсене по векторно сходство върху текстови заявки.", + "vectorSearch.notAvailable.feature.fullTextSearch": "Пълнотекстово търсене", + "vectorSearch.notAvailable.feature.query": "Заявки", + "vectorSearch.notAvailable.feature.secondaryIndex": "Вторичен индекс", + "vectorSearch.notAvailable.subtitle": "Redis Search позволява:", + "vectorSearch.notAvailable.title": "Redis Search не е наличен за тази база данни", + "vectorSearch.onboarding.back": "Назад", + "vectorSearch.onboarding.close": "Затвори", + "vectorSearch.onboarding.commandView.body": "Това е командата FT.CREATE, която Redis ще изпълни. След изпълнение данните ви стават достъпни за търсене.", + "vectorSearch.onboarding.commandView.title": "Команда за създаване на индекс", + "vectorSearch.onboarding.defineIndex.body1": "Индексът определя как Redis търси и прави заявки към данните ви. Схемата контролира кои полета се индексират, техните типове и други конфигурационни опции.", + "vectorSearch.onboarding.defineIndex.body2": "Прегледайте предложеното име на индекса. Ще го използвате при изграждане на заявки.", + "vectorSearch.onboarding.defineIndex.body3": "Съвет: Индексирайте само полета, които планирате да търсите или филтрирате.", + "vectorSearch.onboarding.defineIndex.title": "Прегледайте и коригирайте схемата на индексиране", + "vectorSearch.onboarding.fieldName.body": "Представлява атрибут за търсене във вашите данни. Само избраните полета ще бъдат достъпни за търсене.", + "vectorSearch.onboarding.fieldName.title": "Име на поле", + "vectorSearch.onboarding.gotIt": "Разбрах", + "vectorSearch.onboarding.indexPrefix.body1": "Контролира кои ключове са включени в индекса. Всички ключове, започващи с този префикс, ще бъдат индексирани.", + "vectorSearch.onboarding.indexPrefix.body2": "Пример: bike: ще индексира bike:1, bike:road:3.", + "vectorSearch.onboarding.indexPrefix.title": "Префикс на индекса", + "vectorSearch.onboarding.indexingType.title": "Тип индексиране и опции", + "vectorSearch.onboarding.next": "Напред", + "vectorSearch.onboarding.sampleValue.body": "Примерна стойност от данните за индексиране. Използвайте я, за да проверите типа на полето и избора на индексиране.", + "vectorSearch.onboarding.sampleValue.title": "Примерна стойност", + "vectorSearch.onboarding.skipTour": "Пропусни обиколката", + "vectorSearch.onboarding.stepCounter": "{{current}}/{{total}}", + "vectorSearch.query.breadcrumb.ariaLabel": "Навигационна пътека", + "vectorSearch.query.breadcrumb.indexes": "Индекси", + "vectorSearch.query.editor.action.explain": "Обясни", + "vectorSearch.query.editor.action.explainAria": "Обясни командата", + "vectorSearch.query.editor.action.profile": "Профилирай", + "vectorSearch.query.editor.action.profileAria": "Профилирай командата", + "vectorSearch.query.editor.action.save": "Запази", + "vectorSearch.query.editor.action.saveAria": "Запази заявката", + "vectorSearch.query.editor.onboarding.detail.ftAggregate": "Групиране и обобщаване на резултатите", + "vectorSearch.query.editor.onboarding.detail.ftExplain": "Преглед на плана за изпълнение", + "vectorSearch.query.editor.onboarding.detail.ftList": "Преглед на схемата и статистиките на индекса", + "vectorSearch.query.editor.onboarding.detail.ftProfile": "Анализ на производителността", + "vectorSearch.query.editor.onboarding.detail.ftSearch": "Намиране на документи по текст или филтри", + "vectorSearch.query.editor.onboarding.detail.ftSpellcheck": "Предлагане на корекции за печатни грешки", + "vectorSearch.query.editor.onboarding.detail.ftSugget": "Извличане на предложения за автоматично довършване", + "vectorSearch.query.editor.onboarding.documentation": "Документация", + "vectorSearch.query.editor.placeholder": "Започнете да въвеждате FT., за да достигнете командите за търсене, или превключете към Библиотека със заявки за достъп до запазените команди.", + "vectorSearch.query.editor.tab.editor": "Редактор на заявки", + "vectorSearch.query.editor.tab.library": "Библиотека със заявки", + "vectorSearch.query.editor.tooltip.disabledLoading": "Деактивирано: заявката се изпълнява.", + "vectorSearch.query.editor.tooltip.disabledNoQuery": "Деактивирано: не е разпозната заявка.", + "vectorSearch.query.editor.tooltip.explain": "Показва как ще се изпълни заявката (план за изпълнение), за да разберете какво се използва.", + "vectorSearch.query.editor.tooltip.profile": "Профилира заявката, за да покаже къде се изразходва време и да открие проблемните частти.", + "vectorSearch.query.error.executeCommand": "Неуспешно изпълнение на командата", + "vectorSearch.query.error.loadCommandDetails": "Неуспешно зареждане на детайлите на командата", + "vectorSearch.query.groupCommandLabel_one": "{{count}} - команда", + "vectorSearch.query.groupCommandLabel_other": "{{count}} - команди", + "vectorSearch.query.onboarding.description": "Създавайте заявки в редактора на заявки или ги запазвайте за по-късно в библиотеката със заявки.", + "vectorSearch.query.onboarding.dismiss": "Разбрах", + "vectorSearch.query.onboarding.editorDescription": "пишете заявки за търсене директно с помощта на команди на Redis.", + "vectorSearch.query.onboarding.editorTitle": "Редактор на заявки", + "vectorSearch.query.onboarding.libraryDescription": "използвайте повторно запазени заявки или готови примери за примерните данни.", + "vectorSearch.query.onboarding.libraryTitle": "Библиотека със заявки", + "vectorSearch.query.onboarding.title": "Започнете да разглеждате данните си", + "vectorSearch.query.viewIndexButton": "Преглед на индекс", + "vectorSearch.queryLibrary.badge.sample": "Примерна заявка", + "vectorSearch.queryLibrary.badge.saved": "Запазена заявка", + "vectorSearch.queryLibrary.delete.cancel": "Задръж заявката", + "vectorSearch.queryLibrary.delete.confirm": "Изтрий заявката", + "vectorSearch.queryLibrary.delete.message": "Това действие ще премахне запазената заявка, но няма да засегне вашия индекс или данни.", + "vectorSearch.queryLibrary.delete.question": "Сигурни ли сте, че искате да изтриете тази заявка?", + "vectorSearch.queryLibrary.delete.title": "Изтриване на заявка", + "vectorSearch.queryLibrary.empty.noMatch": "Няма заявки, отговарящи на търсенето ви", + "vectorSearch.queryLibrary.empty.noQueries": "Все още няма запазени заявки. Създайте заявка в редактора и щракнете върху Запази, за да я добавите тук.", + "vectorSearch.queryLibrary.error.load": "Неуспешно зареждане на библиотеката със заявки", + "vectorSearch.queryLibrary.item.copyNameAria": "Копирай името на заявката", + "vectorSearch.queryLibrary.item.deleteAria": "Изтрий заявката", + "vectorSearch.queryLibrary.item.load": "Зареди", + "vectorSearch.queryLibrary.item.loadAria": "Зареди заявката", + "vectorSearch.queryLibrary.item.run": "Изпълни", + "vectorSearch.queryLibrary.item.runAria": "Изпълни заявката", + "vectorSearch.queryLibrary.save.cancel": "Отказ", + "vectorSearch.queryLibrary.save.confirm": "Запази заявката", + "vectorSearch.queryLibrary.save.description": "Задайте име на заявката, за да я добавите към списъка със запазени заявки за бързо повторно използване.", + "vectorSearch.queryLibrary.save.placeholder": "Въведете име на командата", + "vectorSearch.queryLibrary.save.title": "Запазване на заявка", + "vectorSearch.queryLibrary.searchPlaceholder": "Търсене на заявка", + "vectorSearch.sampleData.bikes.displayName": "Eлектронна търговия", + "vectorSearch.sampleData.bikes.query1.description": "Извършва просто векторно търсене по метода на K най-близки съседи (KNN), за да намери 3-те велосипеда, най-семантично близки до „Удобен велосипед за ежедневно придвижване“. Връща оценката за сходство заедно с полетата марка, тип и описание.", + "vectorSearch.sampleData.bikes.query1.name": "Основно семантично търсене", + "vectorSearch.sampleData.bikes.query2.description": "Търси велосипеди, съответстващи на заявката на естествен език „Велосипед за ежедневно придвижване за хора над 60“. Демонстрира как векторното търсене може да разбира намерението и контекста отвъд съвпадението на ключови думи, намирайки велосипеди, подходящи за по-възрастни колоездачи, които приоритизират комфорта и лесната употреба.", + "vectorSearch.sampleData.bikes.query2.name": "Семантично търсене, насочено по възраст", + "vectorSearch.sampleData.bikes.query3.description": "Намира планински велосипеди, семантично близки до „Планински велосипед специално за жени“. Показва как вгражданията могат да улавят продуктови характеристики като геометрия, размери и дизайн, специфични за пола, без да изискват точно съвпадение на ключови думи.", + "vectorSearch.sampleData.bikes.query3.name": "Търсене на продукти според пола", + "vectorSearch.sampleData.bikes.query4.description": "Комбинира семантично векторно търсене с традиционно филтриране по атрибути. Търси „Планински велосипед специално за жени“, но ограничава резултатите до велосипеди от тип „Планински велосипеди“ с цени между $3000 и $3500. Демонстрира предварително филтриране преди KNN, за да се стесни наборът от кандидати.", + "vectorSearch.sampleData.bikes.query4.name": "Хибридно търсене (вектор + филтри)", + "vectorSearch.sampleData.cancel": "Отказ", + "vectorSearch.sampleData.content.description": "Откривайте съдържание по тема или сюжет.", + "vectorSearch.sampleData.content.label": "Препоръки за съдържание", + "vectorSearch.sampleData.ecommerce.description": "Откривайте продукти, които отговарят на очакванията ви, а не само на текста", + "vectorSearch.sampleData.ecommerce.label": "Откриване в електронната търговия", + "vectorSearch.sampleData.movies.displayName": "Препоръки за съдържание", + "vectorSearch.sampleData.movies.query1.description": "Извършва търсене по метода на K най-близки съседи, за да намери филми с вграждания на сюжета, най-близки до векторната заявка. Връща първите 3 съвпадения със заглавие, сюжет и оценка за сходство. Демонстрира чисто семантично търсене — „Играта на играчките“ се класира първо въз основа на смисъла, а не на съвпадение на ключови думи.", + "vectorSearch.sampleData.movies.query1.name": "Основно търсене по сходство на сюжета", + "vectorSearch.sampleData.movies.query2.description": "Комбинира филтър по жанров таг с векторно сходство, за да намери свързани с музика филми, съответстващи на „Позитивен филм за музика и студенти“. Предварително филтрира до жанра Музика, преди да изпълни KNN, показвайки как хибридното търсене подобрява релевантността чрез стесняване на кандидатите.", + "vectorSearch.sampleData.movies.query2.name": "Семантично търсене с филтър по жанр", + "vectorSearch.sampleData.movies.query3.description": "Извлича съхраненото векторно вграждане от съществуващ филмов документ (Inception). Този вектор след това може да се използва като вход за заявка от типа „подобни на този“, позволявайки препоръки въз основа на съдържанието, без да се регенерират вгражданията.", + "vectorSearch.sampleData.movies.query3.name": "Извличане на вграждане на документ", + "vectorSearch.sampleData.movies.query4.description": "Комбинира множество филтри по метаданни (жанр: Музика, година: 1970–1979) с векторно търсене по сходство. Намира класически музикални филми от 70-те, съответстващи на семантичното намерение на заявката, показвайки как числовите диапазони и филтрите по тагове работят безпроблемно с KNN.", + "vectorSearch.sampleData.movies.query4.name": "Хибридно търсене с множество филтри", + "vectorSearch.sampleData.movies.query5.description": "Филтрира резултатите до предпочитаните от потребителя жанрове (Анимация ИЛИ Sci-Fi), преди да изпълни векторно сходство. Демонстрира персонализация — стесняване на препоръките до категориите, които потребителят харесва, като същевременно се класира по семантична релевантност.", + "vectorSearch.sampleData.movies.query5.name": "Персонализирано търсене в множество жанрове", + "vectorSearch.sampleData.seeIndexDefinition": "Виж дефиницията на индекса", + "vectorSearch.sampleData.startQuerying": "Създай и започни да търсиш", + "vectorSearch.sampleData.subtitle1": "Изберете примерен набор от данни.", + "vectorSearch.sampleData.subtitle2": "Ще заредим данните и ще генерираме индекса, необходим за търсене.", + "vectorSearch.sampleData.title": "Подготовка на примерните ви данни за търсене", + "vectorSearch.selectKeyOnboarding.body1": "Ще използваме избрания ключ, за да генерираме предложена схема на индексиране. Redis ще индексира всички ключове със същия префикс, а не само този единствен ключ.", + "vectorSearch.selectKeyOnboarding.body2": "Индексирането е налично за структурите от данни Hash и JSON.", + "vectorSearch.selectKeyOnboarding.close": "Затвори", + "vectorSearch.selectKeyOnboarding.gotIt": "Разбрах", + "vectorSearch.selectKeyOnboarding.title": "Изберете ключ, за да започнете", + "vectorSearch.upgradeBanner.cta": "Безплатна Redis Cloud база данни", + "vectorSearch.upgradeBanner.message": "Надградете до Redis 7.2+, за да отключите бързо семантично AI търсене в реално време с векторно търсене", + "vectorSearch.versionNotSupported.ctaText": "Създайте безплатна база данни Redis Cloud, за да започнете да използвате тези функционалности.", + "vectorSearch.versionNotSupported.description": "Тази функционалност изисква Redis Search 2.0 или по-нова версия (включена в Redis 6+). По-старите версии на Redis Search не са съвместими с командите, използвани тук.", + "vectorSearch.versionNotSupported.title": "Изисква се Redis Search 2.0+", + "vectorSearch.welcome.checkingKeys": "Проверка за съществуващи ключове…", + "vectorSearch.welcome.feature.fullText.description": "Намирайте и филтрирайте данните си мигновено чрез мощни заявки по ключови думи и полета.", + "vectorSearch.welcome.feature.fullText.title": "Пълнотекстово търсене", + "vectorSearch.welcome.feature.hybrid.description": "Комбинирайте векторно търсене и търсене по ключови думи за по-висока точност и по-добри резултати.", + "vectorSearch.welcome.feature.hybrid.title": "Хибридно търсене", + "vectorSearch.welcome.feature.performance.description": "Вградената квантизация и компресия осигуряват изключителна скорост и ефективност при всякакъв мащаб.", + "vectorSearch.welcome.feature.performance.title": "Висока производителност, малко усилия", + "vectorSearch.welcome.feature.vector.description": "Извличайте резултати по смисъл, а не само по думи. Идеално за AI, семантични и припоръчващи приложения.", + "vectorSearch.welcome.feature.vector.title": "Векторно търсене", + "vectorSearch.welcome.noKeysFound": "Не са намерени Hash или JSON ключове във вашата база данни", + "vectorSearch.welcome.subtitle": "Вижте как Redis позволява пълнотекстовото и векторното търсене. Бързо, лесно и ефективно.", + "vectorSearch.welcome.title": "Търсете със скоростта на светлината", + "vectorSearch.welcome.trySampleData": "Опитайте с примерни данни", + "vectorSearch.welcome.useMyDatabase": "Създай индекс", + "vectorSearch.welcome.useMyDatabaseLegacy": "Използвайте данни от моята база данни", "whatsNew.button.gotIt": "Разбрах", "whatsNew.card.comingSoon": "Очаквайте скоро", "whatsNew.card.locationLabel": "Къде да го намерите:", + "whatsNew.card.tooltip": "Функцията се въвежда поетапно.", "whatsNew.menuItem": "Какво ново?", "whatsNew.releaseDate": "Издадена на {{date}}", "whatsNew.releaseNotes.link": "Вижте пълните бележки по изданието за {{version}}", "whatsNew.title": "Какво ново", "whatsNew.version.option": "v{{version}}", - "whatsNew.version.optionLatest": "v{{version}} (най-нова)" + "whatsNew.version.optionLatest": "v{{version}} (най-нова)", + "workbench.noResults.button.explore": "Разгледайте", + "workbench.noResults.cliSubtitle": "за Redis команди.", + "workbench.noResults.cliTitle": "Това е нашият усъвършенстван CLI", + "workbench.noResults.hint": "Или щракнете върху иконата в горния десен ъгъл.", + "workbench.noResults.imageAlt": "няма резултати", + "workbench.noResults.summary": "Изпробвайте Работна среда с нашите интерактивни ръководства, за да научите как Redis може да реши вашите случаи на употреба.", + "workbench.noResults.title": "Все още няма резултати за показване", + "workbench.pageTitle": "{{name}} {{db}} - Работна среда", + "workbench.results.clear": "Изчистване на резултатите", + "workbench.runConfirm.body_one": "На път сте да изпълните {{commands}} на {{db}}. Тази команда е част от списъка с опасни команди. Тази операция може да повлияе на стабилността на сървъра.", + "workbench.runConfirm.body_other": "На път сте да изпълните {{commands}} на {{db}}. Тези команди са част от списъка с опасни команди. Тази операция може да повлияе на стабилността на сървъра.", + "workbench.runConfirm.button.run": "Изпълнение на командата", + "workbench.runConfirm.title": "Продължете внимателно в production среда", + "workbench.suggestions.noIndexes.detail": "Създайте индекс", + "workbench.suggestions.noIndexes.documentation": "Вижте [документацията]({{link}}) за подробни инструкции как да създадете индекс.", + "workbench.suggestions.noIndexes.label": "Няма индекси за показване", + "workbench.tutorials.basicUseCases": "Основни случаи на употреба", + "workbench.tutorials.introToSearch": "Въведение в търсенето", + "workbench.tutorials.introToVectorSearch": "Въведение във векторното търсене", + "workbench.viewType.explain": "Обяснение на командата", + "workbench.viewType.profile": "Профилиране на командата", + "workbench.viewType.text": "Текст" } diff --git a/redisinsight/ui/src/i18n/locales/en.json b/redisinsight/ui/src/i18n/locales/en.json index a29fcbd079..e30904c9e2 100644 --- a/redisinsight/ui/src/i18n/locales/en.json +++ b/redisinsight/ui/src/i18n/locales/en.json @@ -1,4 +1,128 @@ { + "addDatabase.button.addDatabase": "Add database", + "addDatabase.button.cancel": "Cancel", + "addDatabase.button.connectionSettings": "Connection settings", + "addDatabase.button.testConnection": "Test connection", + "addDatabase.cloud.addDatabases": "Add databases", + "addDatabase.cloud.freeBadge": "FREE", + "addDatabase.cloud.newDatabase": "New database", + "addDatabase.cloud.title": "Get started with Redis Cloud account", + "addDatabase.connectionUrl.error": "The connection URL format provided is not supported.
Try adding a database using a connection form.", + "addDatabase.connectionUrl.label": "Connection URL", + "addDatabase.divider.or": "Or", + "addDatabase.modal.title": "Add database", + "addDatabase.moreOptions.title": "More connectivity options", + "addDatabase.option.azure": "Azure Managed Redis", + "addDatabase.option.import": "Import from file", + "addDatabase.option.sentinel": "Redis Sentinel", + "addDatabase.option.software": "Redis Software", + "analytics.clusterDetails.graphics.keys": "Keys", + "analytics.clusterDetails.graphics.memory": "Memory", + "analytics.clusterDetails.header.defaultUsername": "Default", + "analytics.clusterDetails.header.type": "Type", + "analytics.clusterDetails.header.uptime": "Uptime", + "analytics.clusterDetails.header.user": "User", + "analytics.clusterDetails.header.version": "Version", + "analytics.clusterDetails.pageTitle": "{{dbName}} - Overview", + "analytics.clusterDetails.table.clients": "Clients", + "analytics.clusterDetails.table.commandsPerSec": "Commands/s", + "analytics.clusterDetails.table.emptyState": "Primary node details are not available for this cluster configuration.", + "analytics.clusterDetails.table.networkInput": "Network Input", + "analytics.clusterDetails.table.networkOutput": "Network Output", + "analytics.clusterDetails.table.primaryNodes_one": "{{count}} Primary node", + "analytics.clusterDetails.table.primaryNodes_other": "{{count}} Primary nodes", + "analytics.clusterDetails.table.totalKeys": "Total Keys", + "analytics.clusterDetails.table.totalMemory": "Total Memory", + "analytics.databaseAnalysis.empty.encrypt.text": "Unable to decrypt. Check the system keychain or re-run the report generation.", + "analytics.databaseAnalysis.empty.encrypt.title": "Encrypted data", + "analytics.databaseAnalysis.empty.keys.text": "Use Workbench Guides and Tutorials to quickly load the data.", + "analytics.databaseAnalysis.empty.keys.title": "No keys to display", + "analytics.databaseAnalysis.empty.reports.text": "Click \"Analyze\" to generate the first report.", + "analytics.databaseAnalysis.empty.reports.title": "No Reports found", + "analytics.databaseAnalysis.expiration.showNoExpiry": "Show \"No Expiry\"", + "analytics.databaseAnalysis.expiration.title": "MEMORY LIKELY TO BE FREED OVER TIME", + "analytics.databaseAnalysis.extrapolateResults": "Extrapolate results", + "analytics.databaseAnalysis.header.newReport": "New Report", + "analytics.databaseAnalysis.header.newReportAria": "New reports", + "analytics.databaseAnalysis.header.reportGeneratedOn": "Report generated on:", + "analytics.databaseAnalysis.header.scanned": "Scanned {{percentage}}", + "analytics.databaseAnalysis.header.scannedKeys": "({{processed}}/{{total}} keys)", + "analytics.databaseAnalysis.header.tooltipContent": "Analyze up to 10 000 keys to get an overview of your data and tips on how to save memory and optimize the usage of your database.", + "analytics.databaseAnalysis.header.tooltipContentCluster": "Analyze up to 10 000 keys per shard to get an overview of your data and tips on how to save memory and optimize the usage of your database.", + "analytics.databaseAnalysis.header.tooltipTitle": "Database Analysis", + "analytics.databaseAnalysis.pageTitle": "{{dbName}} - Database Analysis", + "analytics.databaseAnalysis.recommendations.empty.line1": "No Tips at the moment,", + "analytics.databaseAnalysis.recommendations.empty.line2": "keep up the good work!", + "analytics.databaseAnalysis.recommendations.empty.title": "AMAZING JOB!", + "analytics.databaseAnalysis.recommendations.redisStackTooltip": "Redis Stack", + "analytics.databaseAnalysis.recommendations.tutorial": "Tutorial", + "analytics.databaseAnalysis.summaryPerData.keys": "Keys", + "analytics.databaseAnalysis.summaryPerData.memory": "Memory", + "analytics.databaseAnalysis.summaryPerData.title": "SUMMARY PER DATA TYPE", + "analytics.databaseAnalysis.tabs.dataSummary": "Data Summary", + "analytics.databaseAnalysis.tabs.tips": "Tips", + "analytics.databaseAnalysis.topKeys.byLength": "by Length", + "analytics.databaseAnalysis.topKeys.byMemory": "by Memory", + "analytics.databaseAnalysis.topKeys.considerSplitting": "Consider splitting it into multiple keys", + "analytics.databaseAnalysis.topKeys.keyName": "Key Name", + "analytics.databaseAnalysis.topKeys.keySize": "Key Size", + "analytics.databaseAnalysis.topKeys.keyType": "Key Type", + "analytics.databaseAnalysis.topKeys.length": "Length", + "analytics.databaseAnalysis.topKeys.noLimit": "No limit", + "analytics.databaseAnalysis.topKeys.timeToLive": "Time to Live", + "analytics.databaseAnalysis.topKeys.title": "TOP KEYS", + "analytics.databaseAnalysis.topKeys.titleMax": "TOP {{max}} KEYS", + "analytics.databaseAnalysis.topKeys.ttl": "TTL", + "analytics.databaseAnalysis.topNamespaces.byMemory": "by Memory", + "analytics.databaseAnalysis.topNamespaces.byNumberOfKeys": "by Number of Keys", + "analytics.databaseAnalysis.topNamespaces.dataType": "Data Type", + "analytics.databaseAnalysis.topNamespaces.empty.text": "Configure the delimiter in Tree View to customize the namespaces displayed.", + "analytics.databaseAnalysis.topNamespaces.empty.title": "No namespaces to display", + "analytics.databaseAnalysis.topNamespaces.keyPattern": "Key Pattern", + "analytics.databaseAnalysis.topNamespaces.title": "TOP NAMESPACES", + "analytics.databaseAnalysis.topNamespaces.totalKeys": "Total Keys", + "analytics.databaseAnalysis.topNamespaces.totalMemory": "Total Memory", + "analytics.nav.databaseAnalysis": "Database Analysis", + "analytics.nav.overview": "Overview", + "analytics.nav.slowLog": "Slow Log", + "analytics.slowLog.actions.clear": "Clear Slow Log", + "analytics.slowLog.actions.configure": "Configure", + "analytics.slowLog.actions.tooltip.body": "Slow Log is a list of slow operations for your Redis instance. These can be used to troubleshoot performance issues.Each entry in the list displays the command, duration and timestamp. Any transaction that exceeds slowlog-log-slower-than {{unit}} are recorded up to a maximum of slowlog-max-len after which older entries are discarded.", + "analytics.slowLog.actions.tooltip.title": "Slow Log", + "analytics.slowLog.clearModal.button.cancel": "Cancel", + "analytics.slowLog.clearModal.button.clear": "Clear", + "analytics.slowLog.clearModal.message": "Slow Log will be cleared for {{name}}", + "analytics.slowLog.clearModal.note": "NOTE: This is server configuration", + "analytics.slowLog.clearModal.title": "Clear slow log", + "analytics.slowLog.config.button.cancel": "Cancel", + "analytics.slowLog.config.button.default": "Default", + "analytics.slowLog.config.button.ok": "Ok", + "analytics.slowLog.config.button.save": "Save", + "analytics.slowLog.config.cluster": "Each node can have different Slow Log configuration in a clustered database.Use CONFIG SET slowlog-log-slower-than or CONFIG SET slowlog-max-len for a specific node in redis-cli to configure it.", + "analytics.slowLog.config.maxLen.help": "The length of the Slow Log. When a new command is logged the oldest
one is removed from the queue of logged commands.", + "analytics.slowLog.config.note": "NOTE: This is server configuration", + "analytics.slowLog.config.slowerThan.help": "Execution time to exceed in order to log the command.
-1 disables Slow Log. 0 logs each command.", + "analytics.slowLog.empty.description": "Either no commands exceeding {{value}} {{unit}} were found or Slow Log is disabled on the server.", + "analytics.slowLog.empty.imageAlt": "No Slow Logs", + "analytics.slowLog.empty.title": "No Slow Logs found", + "analytics.slowLog.page.displayPerNode": "Display per node:", + "analytics.slowLog.page.displayUpTo": "Display up to:", + "analytics.slowLog.page.entriesFrom": "from", + "analytics.slowLog.page.entries_one": "{{count}} entry", + "analytics.slowLog.page.entries_other": "{{count}} entries", + "analytics.slowLog.page.executionInfo": "Execution time: {{time}} {{unit}}, Max length: {{maxLen}}", + "analytics.slowLog.page.maxAvailable": "Max available", + "analytics.slowLog.page.pageTitle": "{{dbName}} - Slow Log", + "analytics.slowLog.page.title": "Slow Log", + "analytics.slowLog.table.command": "Command", + "analytics.slowLog.table.duration": "Duration, {{unit}}", + "analytics.slowLog.table.timestamp": "Timestamp", + "analytics.units.bytes": "B", + "analytics.units.kbps": "kb/s", + "analytics.units.microseconds": "µs", + "analytics.units.milliseconds": "ms", + "analytics.units.msec": "msec", + "analytics.units.percent": "%", "api.agreement.analytics.description": "Help improve Redis Insight by sharing anonymous usage data. This helps us understand feature usage and make the app better. By enabling this, you agree to our ", "api.agreement.analytics.label": "Usage Data", "api.agreement.notifications.description": "Select to display notifications. Otherwise, notifications are shown in the Notification Center.", @@ -57,6 +181,12 @@ "api.error.code.11024.button.signIn": "Sign in to Azure", "api.error.code.11024.message": "Azure Entra ID token expired. Sign in to Azure again to continue.", "api.error.code.11024.title": "Azure session expired", + "api.error.code.11025.message": "Enter the code from your authenticator app to finish signing in to Redis Cloud.", + "api.error.code.11025.title": "Verification code required", + "api.error.code.11026.message": "Too many authentication attempts. Wait a few minutes and sign in again.", + "api.error.code.11026.title": "Too many attempts", + "api.error.code.11027.message": "Invalid or expired code. Please try again.", + "api.error.code.11027.title": "Verification failed", "api.error.code.11100.message": "An unexpected error occurred.\n{{detail}}", "api.error.code.11100.title": "Unexpected error", "api.error.code.11101.message": "The cloud job was aborted.", @@ -191,6 +321,290 @@ "api.error.code.12404.title": "Resource not found", "api.error.code.12409.title": "Conflict", "api.error.code.12500.title": "Server error", + "autodiscover.azure.button.addDatabase": "Add Database", + "autodiscover.azure.button.cancel": "Cancel", + "autodiscover.azure.button.manualConnection": "Manual Connection", + "autodiscover.azure.column.databaseName": "Database Name", + "autodiscover.azure.column.number": "#", + "autodiscover.azure.column.region": "Region", + "autodiscover.azure.column.state": "State", + "autodiscover.azure.column.status": "Status", + "autodiscover.azure.column.subscriptionId": "Subscription ID", + "autodiscover.azure.column.subscriptionName": "Subscription Name", + "autodiscover.azure.column.type": "Type", + "autodiscover.azure.databaseType.enterprise.description": "Azure Cache for Redis Enterprise with dedicated infrastructure, higher performance, and Redis modules support.", + "autodiscover.azure.databaseType.enterprise.label": "Enterprise", + "autodiscover.azure.databaseType.standard.description": "Azure Cache for Redis with Basic, Standard, or Premium tiers. Suitable for most caching scenarios.", + "autodiscover.azure.databaseType.standard.label": "Standard", + "autodiscover.azure.databases.addButtonEmpty": "Add Databases", + "autodiscover.azure.databases.addButton_one": "Add ({{count}}) Database", + "autodiscover.azure.databases.addButton_other": "Add ({{count}}) Databases", + "autodiscover.azure.databases.addFailedDefault": "Failed to add database", + "autodiscover.azure.databases.addFailedTitle_one": "Failed to add {{count}} database", + "autodiscover.azure.databases.addFailedTitle_other": "Failed to add {{count}} databases", + "autodiscover.azure.databases.addedMultiple": "{{count}} databases", + "autodiscover.azure.databases.auth": "Auth:", + "autodiscover.azure.databases.authAccessKey": "Access Key", + "autodiscover.azure.databases.authEntraId": "Microsoft Entra ID (Recommended)", + "autodiscover.azure.databases.backButton": "Subscriptions", + "autodiscover.azure.databases.defaultDatabaseName": "Database", + "autodiscover.azure.databases.empty": "No Redis databases found in this subscription.", + "autodiscover.azure.databases.maxSelection": "Maximum of {{max}} databases can be added at a time.", + "autodiscover.azure.databases.pageTitle": "Azure Databases", + "autodiscover.azure.databases.refreshAria": "Refresh databases", + "autodiscover.azure.databases.subscription": "Subscription:", + "autodiscover.azure.databases.title": "Azure Redis Databases", + "autodiscover.azure.databases.unknownDatabase": "database", + "autodiscover.azure.manual.aliasLabel": "Database alias", + "autodiscover.azure.manual.aliasPlaceholder": "Enter Database Alias", + "autodiscover.azure.manual.aliasRequired": "Database alias is required", + "autodiscover.azure.manual.backButton": "Databases", + "autodiscover.azure.manual.entraCredentialsInfo": "Authentication will use your Azure Entra ID credentials", + "autodiscover.azure.manual.hostLabel": "Host", + "autodiscover.azure.manual.hostPlaceholder": "Enter Hostname / IP address / Private Endpoint", + "autodiscover.azure.manual.hostRequired": "Host is required", + "autodiscover.azure.manual.pageTitle": "Azure Manual Connection", + "autodiscover.azure.manual.portLabel": "Port", + "autodiscover.azure.manual.portPlaceholder": "Enter Port", + "autodiscover.azure.manual.portRequired": "Port is required", + "autodiscover.azure.manual.serverNameLabel": "Server Name", + "autodiscover.azure.manual.serverNameRequired": "Server Name is required when SNI is enabled", + "autodiscover.azure.manual.sniInfo": "Enable SNI when connecting via Private Link using an IP address. Enter the original Redis hostname as the Server Name.", + "autodiscover.azure.manual.timeoutLabel": "Timeout (s)", + "autodiscover.azure.manual.timeoutPlaceholder": "Enter Timeout (in seconds)", + "autodiscover.azure.manual.title": "Manual Azure Connection", + "autodiscover.azure.manual.tlsAlwaysEnabled": "TLS is always enabled for Azure Cache for Redis connections.", + "autodiscover.azure.manual.tlsSettings": "TLS Settings", + "autodiscover.azure.manual.useSni": "Use SNI", + "autodiscover.azure.manual.usernameLabel": "Username", + "autodiscover.azure.manual.usernamePlaceholder": "Enter Username", + "autodiscover.azure.manual.verifyServerCert": "Verify server certificate", + "autodiscover.azure.manual.verifyServerCertInfo": "Recommended for production. Validates that the server certificate matches the hostname.", + "autodiscover.azure.provisioningState.configuringAad.description": "Entra ID (Azure AD) authentication is being configured.", + "autodiscover.azure.provisioningState.configuringAad.label": "ConfiguringAAD", + "autodiscover.azure.provisioningState.creating.description": "Database is being created and is not yet available.", + "autodiscover.azure.provisioningState.creating.label": "Creating", + "autodiscover.azure.provisioningState.deleting.description": "Database is being deleted.", + "autodiscover.azure.provisioningState.deleting.label": "Deleting", + "autodiscover.azure.provisioningState.exporting.description": "Data is being exported from the database.", + "autodiscover.azure.provisioningState.exporting.label": "Exporting", + "autodiscover.azure.provisioningState.failed.description": "Provisioning failed. The database is not usable.", + "autodiscover.azure.provisioningState.failed.label": "Failed", + "autodiscover.azure.provisioningState.importing.description": "Data is being imported into the database.", + "autodiscover.azure.provisioningState.importing.label": "Importing", + "autodiscover.azure.provisioningState.linking.description": "Database is being linked for geo-replication.", + "autodiscover.azure.provisioningState.linking.label": "Linking", + "autodiscover.azure.provisioningState.provisioning.description": "Database is being provisioned.", + "autodiscover.azure.provisioningState.provisioning.label": "Provisioning", + "autodiscover.azure.provisioningState.recovering.description": "Database is recovering from a failure.", + "autodiscover.azure.provisioningState.recovering.label": "Recovering", + "autodiscover.azure.provisioningState.scaling.description": "Database is being scaled.", + "autodiscover.azure.provisioningState.scaling.label": "Scaling", + "autodiscover.azure.provisioningState.succeeded.description": "Database is fully provisioned and ready to use.", + "autodiscover.azure.provisioningState.succeeded.label": "Succeeded", + "autodiscover.azure.provisioningState.unlinking.description": "Database is being unlinked from geo-replication.", + "autodiscover.azure.provisioningState.unlinking.label": "Unlinking", + "autodiscover.azure.provisioningState.updating.description": "Database configuration is being updated.", + "autodiscover.azure.provisioningState.updating.label": "Updating", + "autodiscover.azure.signIn.description": "Sign in with your Microsoft account to discover and add Azure Managed Redis databases.", + "autodiscover.azure.signIn.signInButton": "Sign in with Microsoft", + "autodiscover.azure.signIn.tenantError": "Enter a valid tenant GUID or domain.", + "autodiscover.azure.signIn.tenantHint": "Only needed if your resources and your account are in different tenants.", + "autodiscover.azure.signIn.tenantInfo": "Leave blank to use your account's default (home) tenant. If your Azure Managed Redis resources are in a different tenant than your account, enter the tenant that owns the resources (you need guest access to it) — not your own home tenant.", + "autodiscover.azure.signIn.tenantLabel": "Tenant ID (optional)", + "autodiscover.azure.signIn.tenantPlaceholder": "your-tenant.onmicrosoft.com or GUID", + "autodiscover.azure.signIn.title": "Connect to Azure Managed Redis", + "autodiscover.azure.subscriptionState.deleted.description": "Subscription has been deleted and cannot be recovered.", + "autodiscover.azure.subscriptionState.deleted.label": "Deleted", + "autodiscover.azure.subscriptionState.disabled.description": "Subscription is suspended. Resources are not accessible until the subscription is re-enabled.", + "autodiscover.azure.subscriptionState.disabled.label": "Disabled", + "autodiscover.azure.subscriptionState.enabled.description": "Subscription is active and fully functional.", + "autodiscover.azure.subscriptionState.enabled.label": "Enabled", + "autodiscover.azure.subscriptionState.pastDue.description": "Payment is overdue. Services may be limited.", + "autodiscover.azure.subscriptionState.pastDue.label": "PastDue", + "autodiscover.azure.subscriptionState.warned.description": "Subscription has payment issues but is still operational during a grace period.", + "autodiscover.azure.subscriptionState.warned.label": "Warned", + "autodiscover.azure.subscriptions.empty": "No Azure subscriptions found for this account.", + "autodiscover.azure.subscriptions.refreshAria": "Refresh subscriptions", + "autodiscover.azure.subscriptions.showDatabases": "Show Databases", + "autodiscover.azure.subscriptions.signedInAs": "Signed in as", + "autodiscover.azure.subscriptions.switchAccount": "Switch account or tenant", + "autodiscover.azure.subscriptions.tenant": "Tenant", + "autodiscover.azure.subscriptions.title": "Azure Subscriptions", + "autodiscover.cloud.account.accountId": "Account ID:", + "autodiscover.cloud.account.name": "Name:", + "autodiscover.cloud.account.ownerEmail": "Owner Email:", + "autodiscover.cloud.account.ownerName": "Owner Name:", + "autodiscover.cloud.alert.aria": "subscription alert", + "autodiscover.cloud.alert.errorFetching": "Error fetching subscription details", + "autodiscover.cloud.alert.noDatabases": "Subscription does not have any databases", + "autodiscover.cloud.alert.statusNotActive": "Subscription status is not Active", + "autodiscover.cloud.alert.title": "This subscription is not available for one of the following reasons:", + "autodiscover.cloud.cancel.button": "Cancel", + "autodiscover.cloud.cancel.confirm": "Your changes have not been saved. Do you want to proceed to the list of databases?", + "autodiscover.cloud.cancel.proceed": "Proceed", + "autodiscover.cloud.cell.copyEndpointAria": "Copy public endpoint", + "autodiscover.cloud.cell.error": "Error", + "autodiscover.cloud.column.capabilities": "Capabilities", + "autodiscover.cloud.column.database": "Database", + "autodiscover.cloud.column.endpoint": "Endpoint", + "autodiscover.cloud.column.id": "Id", + "autodiscover.cloud.column.numberOfDatabases": "# databases", + "autodiscover.cloud.column.options": "Options", + "autodiscover.cloud.column.provider": "Cloud provider", + "autodiscover.cloud.column.region": "Region", + "autodiscover.cloud.column.result": "Result", + "autodiscover.cloud.column.status": "Status", + "autodiscover.cloud.column.subscription": "Subscription", + "autodiscover.cloud.column.subscriptionId": "Subscription id", + "autodiscover.cloud.column.type": "Type", + "autodiscover.cloud.databases.addSelected": "Add selected Databases", + "autodiscover.cloud.databases.noResults": "Your Redis Enterprise Cloud has no databases available", + "autodiscover.cloud.databases.subtitle_one": "This is a database in your Redis Cloud. Select the database that you want to add.", + "autodiscover.cloud.databases.subtitle_other": "These are databases in your Redis Cloud. Select the databases that you want to add.", + "autodiscover.cloud.databases.title": "Redis Cloud Databases", + "autodiscover.cloud.loading": "loading...", + "autodiscover.cloud.notFound": "Not found", + "autodiscover.cloud.result.title": "Redis Enterprise Databases Added", + "autodiscover.cloud.result.viewDatabases": "View Databases", + "autodiscover.cloud.subscriptions.noResults": "Your Redis Cloud has no subscriptions available.", + "autodiscover.cloud.subscriptions.showDatabases": "Show databases", + "autodiscover.cloud.subscriptions.title": "Redis Cloud Subscriptions", + "autodiscover.cloud.summary.databasesFail_one": "Failed to add {{count}} database", + "autodiscover.cloud.summary.databasesFail_other": "Failed to add {{count}} databases", + "autodiscover.cloud.summary.databasesSuccess_one": "Successfully added {{count}} database", + "autodiscover.cloud.summary.databasesSuccess_other": "Successfully added {{count}} databases", + "autodiscover.cloud.summary.prefix": "Summary: ", + "autodiscover.cloud.summary.subscriptionsFail_one": "Failed to discover databases in {{count}} subscription", + "autodiscover.cloud.summary.subscriptionsFail_other": "Failed to discover databases in {{count}} subscriptions", + "autodiscover.cloud.summary.subscriptionsSuccess_one": "Successfully discovered databases in {{count}} subscription", + "autodiscover.cloud.summary.subscriptionsSuccess_other": "Successfully discovered databases in {{count}} subscriptions", + "autodiscover.sentinel.aliasRequiredContent": "Database Alias", + "autodiscover.sentinel.button.addPrimaryGroup": "Add Primary Group", + "autodiscover.sentinel.cancel.button": "Cancel", + "autodiscover.sentinel.cancel.confirm": "Your changes have not been saved. Do you want to proceed to the list of databases?", + "autodiscover.sentinel.cancel.proceed": "Proceed", + "autodiscover.sentinel.cell.aliasPlaceholder": "Enter Database Alias", + "autodiscover.sentinel.cell.aliasResultPlaceholder": "Database", + "autodiscover.sentinel.cell.copyAddressAria": "Copy address", + "autodiscover.sentinel.cell.copyPublicEndpointAria": "Copy public endpoint", + "autodiscover.sentinel.cell.dbIndexTooltip": "Select the Redis logical database to work with in Browser and Workbench.", + "autodiscover.sentinel.cell.error": "Error", + "autodiscover.sentinel.cell.indexPlaceholder": "Enter Index", + "autodiscover.sentinel.cell.notAssigned": "not assigned", + "autodiscover.sentinel.cell.passwordPlaceholder": "Enter Password", + "autodiscover.sentinel.cell.usernameDefault": "Default", + "autodiscover.sentinel.cell.usernamePlaceholder": "Enter Username", + "autodiscover.sentinel.column.address": "Address", + "autodiscover.sentinel.column.alias": "Database alias*", + "autodiscover.sentinel.column.databaseIndex": "Database index", + "autodiscover.sentinel.column.numberOfReplicas": "# of replicas", + "autodiscover.sentinel.column.password": "Password", + "autodiscover.sentinel.column.primaryGroup": "Primary group", + "autodiscover.sentinel.column.result": "Result", + "autodiscover.sentinel.column.username": "Username", + "autodiscover.sentinel.databases.noMasters": "Your Redis Sentinel has no primary groups available.", + "autodiscover.sentinel.databases.subtitle": "Redis Sentinel instance found. Here is a list of primary groups your Sentinel instance is managing.
Select the primary group(s) you want to add:", + "autodiscover.sentinel.databases.title": "Auto-Discover Redis Sentinel Primary Groups", + "autodiscover.sentinel.loading": "loading...", + "autodiscover.sentinel.notFound": "Not found.", + "autodiscover.sentinel.result.pageTitle": "Redis Sentinel Primary Groups Added", + "autodiscover.sentinel.result.viewDatabases": "View Databases", + "autodiscover.sentinel.summary.fail_one": "Failed to add {{count}} primary group", + "autodiscover.sentinel.summary.fail_other": "Failed to add {{count}} primary groups", + "autodiscover.sentinel.summary.prefix": "Summary: ", + "autodiscover.sentinel.summary.success_one": "Successfully added {{count}} primary group", + "autodiscover.sentinel.summary.success_other": "Successfully added {{count}} primary groups", + "browser.actions.addKey": "Add key", + "browser.actions.bulkActions": "Bulk actions", + "browser.actions.bulkActionsAria": "bulk actions", + "browser.addKey.array.mode.contiguous": "Contiguous (sequential indexes)", + "browser.addKey.array.mode.sparse": "Sparse (explicit indexes)", + "browser.addKey.array.moreItems_one": "… and {{count}} more", + "browser.addKey.array.moreItems_other": "… and {{count}} more", + "browser.addKey.array.populate.manual.description": "Define your own key, indexes, and values from scratch.", + "browser.addKey.array.populate.manual.label": "Create manually", + "browser.addKey.array.populate.sample.description": "Explore arrays with one of the bundled sample datasets.", + "browser.addKey.array.populate.sample.label": "Load sample data", + "browser.addKey.array.populateLabel": "How would you like to populate this array?", + "browser.addKey.array.prodWarning": "Loading sample data is disabled for your production database to avoid accidental data modifications.", + "browser.addKey.array.summary.elements": "Elements", + "browser.addKey.array.summary.highestIndex": "Highest index", + "browser.addKey.array.summary.key": "Key", + "browser.addKey.array.summary.layout": "Layout", + "browser.addKey.button.cancel": "Cancel", + "browser.addKey.button.save": "Save", + "browser.addKey.button.submit": "Add Key", + "browser.addKey.close.aria": "Close key", + "browser.addKey.close.tooltip": "Close", + "browser.addKey.form.count.label": "Count", + "browser.addKey.form.count.placeholder": "Enter Count", + "browser.addKey.form.element.label": "Element", + "browser.addKey.form.element.placeholder": "Enter Element", + "browser.addKey.form.entryId.label": "Entry ID", + "browser.addKey.form.entryId.placeholder": "Enter Entry ID", + "browser.addKey.form.field.label": "Field", + "browser.addKey.form.field.placeholder": "Enter Field", + "browser.addKey.form.index.label": "Index", + "browser.addKey.form.index.placeholder": "Enter Index", + "browser.addKey.form.json.placeholder": "Enter JSON", + "browser.addKey.form.keyName.label": "Key Name", + "browser.addKey.form.keyName.placeholder": "Enter Key Name", + "browser.addKey.form.keyTTL.label": "TTL", + "browser.addKey.form.keyTTL.placeholder": "No limit", + "browser.addKey.form.member.label": "Member", + "browser.addKey.form.member.placeholder": "Enter Member", + "browser.addKey.form.score.label": "Score", + "browser.addKey.form.score.placeholder": "Enter Score", + "browser.addKey.form.startIndex.label": "Start Index", + "browser.addKey.form.startIndex.placeholder": "Enter Start Index", + "browser.addKey.form.value.label": "Value", + "browser.addKey.form.value.placeholder": "Enter Value", + "browser.addKey.hash.ttlPlaceholder": "Enter TTL", + "browser.addKey.keyType": "Key Type", + "browser.addKey.requiresVersion": "Requires Redis {{version}}+", + "browser.addKey.selectKeyType": "Select key type", + "browser.addKey.stream.entryIdError": "Entry ID format is incorrect", + "browser.addKey.title": "New Key", + "browser.addKey.upload.aria": "Select file", + "browser.addKey.upload.label": "Upload", + "browser.addKey.vectorSet.populate.manual.description": "Define your own key, elements, and vectors from scratch.", + "browser.addKey.vectorSet.populate.manual.label": "Create manually", + "browser.addKey.vectorSet.populate.sample.description": "Explore vector sets with pre-loaded word embeddings", + "browser.addKey.vectorSet.populate.sample.label": "Load sample dataset", + "browser.addKey.vectorSet.populateLabel": "How would you like to populate this vector set?", + "browser.addKey.vectorSet.sample.dataset": "Dataset", + "browser.addKey.vectorSet.sample.embedding": "Embedding", + "browser.addKey.vectorSet.sample.size": "Size", + "browser.addKey.vectorSet.sample.vectorSize": "Vector size", + "browser.addMultipleFields.addAria": "Add new item", + "browser.addMultipleFields.addTooltip": "Add", + "browser.addMultipleFields.removeAria": "Remove Item", + "browser.addMultipleFields.removeTooltip": "Remove", + "browser.array.add.addButton": "Add", + "browser.array.add.cancelButton": "Cancel", + "browser.array.add.confirmButton": "Add", + "browser.array.add.confirmMessage": "You are about to add an element to a key on a production database.", + "browser.array.add.confirmTitle": "Add element to a production database?", + "browser.array.add.indexHint": "Leave empty to append the value to the end of the array. Enter an index to set the value at that exact position (overwriting any existing value there).", + "browser.array.add.indexLabel": "Index", + "browser.array.add.indexPlaceholder": "Leave empty to append to the end", + "browser.array.add.invalidIndex": "Index must be an integer string between 0 and 18446744073709551614", + "browser.array.add.moveToElementHint": "When enabled, the View moves to show the element you just added. This is useful for an append or a new index that lands outside the current range, which would otherwise stay hidden.", + "browser.array.add.moveToElementLabel": "Move to the added element", + "browser.array.add.valueLabel": "Value", + "browser.array.add.valuePlaceholder": "Enter value", + "browser.array.addElements": "Add Elements", + "browser.array.aggregate.operationLabel": "Operation", + "browser.array.aggregate.resetAria": "Reset array aggregate form", + "browser.array.aggregate.resultLabel": "Result", + "browser.array.aggregate.tooLarge": "Range too large — aggregate at most 1,000,000 indexes per query", + "browser.array.aggregate.valueLabel": "Value", + "browser.array.aggregate.valuePlaceholder": "value to match", + "browser.array.column.index": "Index", + "browser.array.column.value": "Value", + "browser.array.context.hint": "When expanding a match, also show ±N neighbouring elements.", + "browser.array.context.label": "Context", "browser.array.delete.bulk.aria": "Delete selected elements", "browser.array.delete.bulk.button": "Remove", "browser.array.delete.bulk.message": "{{count}} selected element(s) will be permanently removed from the array.", @@ -201,26 +615,755 @@ "browser.array.delete.range.trigger": "Delete range", "browser.array.delete.row.message": "This element will be permanently removed from the array.", "browser.array.delete.row.title": "Delete element", + "browser.array.drawer.cancel": "Cancel", + "browser.array.drawer.save": "Save", + "browser.array.drawer.saveAria": "Save value for index {{index}}", + "browser.array.drawer.title": "Edit value", + "browser.array.editFieldAria": "Edit field", + "browser.array.emptyValue": "Empty", + "browser.array.expandEditorAria": "Expand value editor", + "browser.array.form.endIndex": "End index", + "browser.array.form.invalidIndex": "Index must be a valid 64-bit unsigned integer", + "browser.array.form.resetTooltip": "Reset to defaults", + "browser.array.form.run": "Run", + "browser.array.form.startIndex": "Start index", + "browser.array.range.resetAria": "Reset array range form", + "browser.array.range.showEmpty": "Show empty indexes", + "browser.array.range.tooLarge": "Range too large — request at most 1,000,000 indexes per query", + "browser.array.search.addPredicateAria": "Add predicate", + "browser.array.search.and": "AND", + "browser.array.search.appliesToAll": "applies to all", + "browser.array.search.combinatorAria": "Combine predicates with AND or OR", + "browser.array.search.invalidLimit": "Limit must be a whole number between 1 and 1,000,000", + "browser.array.search.limitHint": "Cap the number of matches returned.", + "browser.array.search.matchByHint": "Add one or more predicates. Each matches array values by EXACT, MATCH (substring), GLOB, or RE (regex). With two or more predicates, the AND / OR toggle combines them all the same way.", + "browser.array.search.matchByLabel": "Match by", + "browser.array.search.nocaseHint": "Match case-insensitively.", + "browser.array.search.optionsHint": "Refine which elements are searched and how matches are shown.", + "browser.array.search.optionsLabel": "Options", + "browser.array.search.or": "OR", + "browser.array.search.rangeHint": "Limits the index window searched (blank = whole array).", + "browser.array.search.rangeLabel": "Range", + "browser.array.search.rangeToLabel": "to", + "browser.array.search.removePredicateAria": "Remove predicate", + "browser.array.search.resetAria": "Reset array search form", + "browser.array.search.valuePlaceholder": "pattern", + "browser.array.search.withValuesHint": "Return each match's value, not just its index.", + "browser.array.tab.aggregate": "Aggregate", + "browser.array.tab.search": "Search", + "browser.array.tab.view": "View", + "browser.array.table.empty": "No elements in range", + "browser.array.table.loading": "Loading…", + "browser.bulkActions.button.cancel": "Cancel", + "browser.bulkActions.button.close": "Close", + "browser.bulkActions.button.delete": "Delete", + "browser.bulkActions.button.startNew": "Start New", + "browser.bulkActions.button.stop": "Stop", + "browser.bulkActions.button.upload": "Upload", + "browser.bulkActions.close.aria": "Close panel", + "browser.bulkActions.close.tooltip": "Close", + "browser.bulkActions.confirmTitle": "Are you sure you want to perform this action?", + "browser.bulkActions.delete.confirmMessage": "This will delete all keys matching the selected type and pattern.", + "browser.bulkActions.delete.confirmWarning": "Bulk deletion may impact performance and cause memory spikes. Avoid running in production.", + "browser.bulkActions.delete.downloadReport": "Download report", + "browser.bulkActions.delete.downloadReportTooltip": "Download a detailed report of deleted keys.", + "browser.bulkActions.delete.errorList": "Error list", + "browser.bulkActions.delete.expectedAmountNa": "Expected amount: N/A", + "browser.bulkActions.delete.expectedAmountTooltip": "Expected amount is estimated based on the number of keys scanned and the scan percentage. The final number may be different.", + "browser.bulkActions.delete.expectedAmount_one": "Expected amount: {{amount}} key", + "browser.bulkActions.delete.expectedAmount_other": "Expected amount: {{amount}} keys", + "browser.bulkActions.delete.lastErrors": "last {{count}} errors are shown", + "browser.bulkActions.delete.scanned_one": "Scanned {{percentage}} ({{scanned}}/{{total}}) and found {{found}} key", + "browser.bulkActions.delete.scanned_other": "Scanned {{percentage}} ({{scanned}}/{{total}}) and found {{found}} keys", + "browser.bulkActions.delete.typeToConfirmDescription": "This will delete all keys matching the selected type and pattern. Bulk deletion may impact performance and cause memory spikes.", + "browser.bulkActions.delete.typeToConfirmTitle": "Delete all matching keys", + "browser.bulkActions.info.keyType": "Key type:", + "browser.bulkActions.info.pattern": "Pattern:", + "browser.bulkActions.info.title": "Delete Keys with", + "browser.bulkActions.placeholder.description": "To perform a bulk action, set the pattern or select the key type", + "browser.bulkActions.placeholder.title": "No pattern or key type set", + "browser.bulkActions.status.completed": "Action completed", + "browser.bulkActions.status.disconnected": "Connection Lost: {{percentage}}", + "browser.bulkActions.status.failed": "Action failed", + "browser.bulkActions.status.inProgress": "In progress:", + "browser.bulkActions.status.stopped": "Stopped: {{percentage}}", + "browser.bulkActions.summary.commandsProcessed": "Commands Processed", + "browser.bulkActions.summary.errors": "Errors", + "browser.bulkActions.summary.keysProcessed": "Keys Processed", + "browser.bulkActions.summary.results": "Results", + "browser.bulkActions.summary.success": "Success", + "browser.bulkActions.summary.timeTaken": "Time Taken", + "browser.bulkActions.tab.deleteKeys": "Delete Keys", + "browser.bulkActions.tab.uploadData": "Upload Data", + "browser.bulkActions.title": "Bulk Actions", + "browser.bulkActions.upload.confirmMessage": "All commands from the file will be executed against your database.", + "browser.bulkActions.upload.executedTitle": "Commands executed from file", + "browser.bulkActions.upload.fileSizeError": "File should not exceed {{max}} MB", + "browser.bulkActions.upload.instruction": "Upload the text file with the list of Redis commands", + "browser.bulkActions.upload.promptAria": "Select or drag and drop file", + "browser.bulkActions.upload.promptText": "Select or drag and drop a file", + "browser.deletePopover.aria": "Delete Key", + "browser.deletePopover.button": "Delete", + "browser.deletePopover.message": "will be deleted.", + "browser.filter.allKeyTypes": "All Key Types", + "browser.hash.add.cancel": "Cancel", + "browser.hash.add.confirmButton": "Add fields", + "browser.hash.add.confirmMessage_one": "You are about to add {{count}} field to a hash on a production database.", + "browser.hash.add.confirmMessage_other": "You are about to add {{count}} fields to a hash on a production database.", + "browser.hash.add.confirmTitle": "Add fields on production database?", + "browser.hash.add.save": "Save", + "browser.hash.addFields": "Add Fields", + "browser.hash.column.field": "Field", + "browser.hash.column.ttl": "TTL", + "browser.hash.column.value": "Value", + "browser.hash.fieldPlaceholder": "Enter Field", + "browser.hash.searchFieldPrefix": "Field:", + "browser.hash.showTtl": "Show TTL", + "browser.hash.ttlNoLimit": "No Limit", + "browser.hash.ttlPlaceholder": "Enter TTL", + "browser.hash.ttlTooltipTitle": "Time to Live", + "browser.hash.valuePlaceholder": "Enter Value", + "browser.keyDetails.close.aria": "Close key", + "browser.keyDetails.close.tooltip": "Close", + "browser.keyDetails.commandPreview.building": "Building command…", + "browser.keyDetails.commandPreview.copyAria": "Copy command", + "browser.keyDetails.compressedValueDisabled": "Cannot edit the decompressed value", + "browser.keyDetails.count.full": "Count: ", + "browser.keyDetails.count.short": "Cnt: ", + "browser.keyDetails.delete.aria": "Delete Key", + "browser.keyDetails.delete.button": "Delete", + "browser.keyDetails.delete.message": "will be deleted.", + "browser.keyDetails.editable.cancelButton": "Cancel", + "browser.keyDetails.editable.confirmButton": "Save", + "browser.keyDetails.editable.confirmMessage": "You are about to modify a value on a production database.", + "browser.keyDetails.editable.confirmTitle": "Edit value on production database?", + "browser.keyDetails.editable.editAria": "Edit field", + "browser.keyDetails.editable.saveButton": "Save", + "browser.keyDetails.editable.valuePlaceholder": "Enter Value", + "browser.keyDetails.failedConvertFormatter": "Failed to convert to {{format}}", + "browser.keyDetails.formatter.ascii": "ASCII", + "browser.keyDetails.formatter.binary": "Binary", + "browser.keyDetails.formatter.dateTime": "Timestamp to DateTime", + "browser.keyDetails.formatter.hex": "HEX", + "browser.keyDetails.formatter.java": "Java serialized", + "browser.keyDetails.formatter.json": "JSON", + "browser.keyDetails.formatter.markdown": "Markdown", + "browser.keyDetails.formatter.msgpack": "Msgpack", + "browser.keyDetails.formatter.php": "PHP serialized", + "browser.keyDetails.formatter.pickle": "Pickle", + "browser.keyDetails.formatter.protobuf": "Protobuf", + "browser.keyDetails.formatter.unicode": "Unicode", + "browser.keyDetails.formatter.vector32": "Vector 32-bit", + "browser.keyDetails.formatter.vector64": "Vector 64-bit", + "browser.keyDetails.formatterEditingDisabled": "Cannot edit the value in this format", + "browser.keyDetails.invalidValue.text": "as it is not valid in the selected format.", + "browser.keyDetails.invalidValue.title": "Value will be saved as Unicode", + "browser.keyDetails.length.default": "Length", + "browser.keyDetails.length.entries": "Entries", + "browser.keyDetails.length.nodes": "Nodes", + "browser.keyDetails.length.samples": "Samples", + "browser.keyDetails.length.topLevelValues": "Top-level values", + "browser.keyDetails.modulesType.message": "Use Redis commands in the Workbench tool to view the value.", + "browser.keyDetails.modulesType.title": "This is a {{moduleName}} key.", + "browser.keyDetails.name.copyAria": "Copy Key Name", + "browser.keyDetails.name.renameConfirm.button": "Rename", + "browser.keyDetails.name.renameConfirm.description": "You are about to rename {{oldName}} to {{newName}} on a production database.", + "browser.keyDetails.name.renameConfirm.title": "Rename key on production database?", + "browser.keyDetails.name.tooltipTitle": "Key Name", + "browser.keyDetails.noKeySelected.closeAria": "Close panel", + "browser.keyDetails.noKeySelected.closeTooltip": "Close", + "browser.keyDetails.noKeySelected.message": "Select the key from the list on the left to see the details of the key.", + "browser.keyDetails.preview.commandLabel": "Preview command", + "browser.keyDetails.preview.hideTooltip": "Hide the command preview", + "browser.keyDetails.preview.label": "Preview", + "browser.keyDetails.preview.showTooltip": "Show the Redis command that will run", + "browser.keyDetails.preview.toggleAria": "Toggle command preview", + "browser.keyDetails.quantType.full": "Quant type: ", + "browser.keyDetails.quantType.short": "Q: ", + "browser.keyDetails.removeLastElement": "Removing the last item deletes the entire key.", + "browser.keyDetails.size.label": "Key Size: ", + "browser.keyDetails.size.tooLarge": "The key size is too large to run the MEMORY USAGE command, as it may lead to performance issues.", + "browser.keyDetails.size.tooltipTitle": "Key Size", + "browser.keyDetails.stringFormattingDisabled": "Load the entire value to select a format", + "browser.keyDetails.textWrapper.closeAria": "Close key", + "browser.keyDetails.textWrapper.closeTooltip": "Close", + "browser.keyDetails.tooLongName.message": "Details cannot be displayed.", + "browser.keyDetails.tooLongName.title": "The key name is too long", + "browser.keyDetails.truncatedActionDisabled": "This action is disabled because the key or value is too large to process within Redis Insight.", + "browser.keyDetails.ttl.changeConfirm.button": "Change TTL", + "browser.keyDetails.ttl.changeConfirm.description": "You are about to change the TTL of {{name}} to {{ttl}} on a production database.", + "browser.keyDetails.ttl.changeConfirm.title": "Change TTL on production database?", + "browser.keyDetails.ttl.noLimit": "No limit", + "browser.keyDetails.ttl.placeholder": "No limit", + "browser.keyDetails.unprintable.content": "Use Workbench or CLI to edit without data loss.", + "browser.keyDetails.unprintable.title": "Non-printable characters have been detected", + "browser.keyDetails.unsupportedType.message": "See our repository for the list of supported key types.", + "browser.keyDetails.unsupportedType.title": "This key type is not currently supported.", + "browser.keyDetails.vectorDim.full": "Vector dim: ", + "browser.keyDetails.vectorDim.short": "Dim: ", + "browser.keyList.column.key": "Key", + "browser.keyList.column.size": "Size", + "browser.keyList.column.ttl": "TTL", + "browser.keyList.column.type": "Type", + "browser.keyList.name.tooltipTitle": "Key Name", + "browser.keyList.size.tooltipTitle": "Key Size", + "browser.keyList.ttl.noLimit": "No limit", + "browser.keyList.ttl.tooltipTitle": "Time to Live", + "browser.keysBrowser.addKeyAria": "Add key", + "browser.keysBrowser.refreshDisabledMessage": "Select an index to refresh keys.", + "browser.keysBrowser.results": "Results: ", + "browser.keysBrowser.scannedPrefix": "Scanned ", + "browser.keysBrowser.scanning": "Scanning...", + "browser.keysBrowser.total": "Total: ", + "browser.keysHeader.columns": "Columns", + "browser.keysHeader.columnsAria": "columns", + "browser.keysHeader.keySize": "Key size", + "browser.keysHeader.keySizeTooltip": "Hide the key size to avoid performance issues when working with large keys.", + "browser.keysHeader.sortAsc": "Sort {{column}} ascending", + "browser.keysHeader.sortBy": "Sort by:", + "browser.keysHeader.sortDesc": "Sort {{column}} descending", + "browser.keysHeader.ttl": "TTL", + "browser.keysHeader.view.listAria": "List view button", + "browser.keysHeader.view.listTooltip": "List View", + "browser.keysHeader.view.treeAria": "Tree view button", + "browser.keysHeader.view.treeDisabledTooltip": "Tree View is unavailable when the HEX key name format is selected.", + "browser.keysHeader.view.treeTooltip": "Tree View", + "browser.list.add.cancel": "Cancel", + "browser.list.add.confirmButton": "Add elements", + "browser.list.add.confirmMessage_one": "You are about to push {{count}} element to a list on a production database.", + "browser.list.add.confirmMessage_other": "You are about to push {{count}} elements to a list on a production database.", + "browser.list.add.confirmTitle": "Add elements on production database?", + "browser.list.add.save": "Save", + "browser.list.addElements": "Add Elements", + "browser.list.column.element": "Element", + "browser.list.column.index": "Index", + "browser.list.destination.head": "Push to head", + "browser.list.destination.tail": "Push to tail", + "browser.list.remove.button": "Remove", + "browser.list.remove.cancel": "Cancel", + "browser.list.remove.deleteWarning": "If you remove all Elements, the whole Key will be deleted.", + "browser.list.remove.directionHead": "head", + "browser.list.remove.directionTail": "tail", + "browser.list.remove.elementsCount_one": "{{count}} Element", + "browser.list.remove.elementsCount_other": "{{count}} Elements", + "browser.list.remove.fromHead": "Remove from head", + "browser.list.remove.fromTail": "Remove from tail", + "browser.list.remove.multipleNotSupported": "Removing multiple elements is available for Redis databases v. 6.2 or later. Update your Redis database or create a new free up-to-date Redis database.", + "browser.list.remove.willBeRemoved_one": "will be removed from the {{destination}} of {{keyName}}", + "browser.list.remove.willBeRemoved_other": "will be removed from the {{destination}} of {{keyName}}", + "browser.list.removeElements": "Remove Elements", + "browser.list.searchIndexPrefix": "Index:", + "browser.loadSampleData.button": "Load sample data", + "browser.loadSampleData.confirm.execute": "Execute", + "browser.loadSampleData.confirm.message": "All commands from the file will be automatically executed against your database. Avoid executing them in production databases.", + "browser.loadSampleData.confirm.title": "Execute commands in bulk", + "browser.loadSampleData.productionTooltip": "Button disabled for your production database to avoid accidental data modifications.", + "browser.makeSearchable.button.cancel": "Cancel", + "browser.makeSearchable.button.continue": "Continue", + "browser.makeSearchable.button.trigger": "Make searchable", + "browser.makeSearchable.description.intro": "We’ll take you to the Search workspace to set up the index.", + "browser.makeSearchable.description.outro": "You can review and adjust the schema before creating the index.", + "browser.makeSearchable.description.prefix": "All keys starting with '{{prefix}}' will be included.", + "browser.makeSearchable.title": "Make this data searchable", + "browser.makeSearchable.tooltip": "Index data with the \"{{prefix}}\" prefix so you can query it using full-text, vector, exact matching, and geospatial search.", + "browser.noKeysFound.addKeyManually": "Add key manually", + "browser.noKeysFound.imageAlt": "no results", + "browser.noKeysFound.title": "Let's start working", + "browser.noResults.advices": "Check the spelling.Check upper and lower cases.Use an asterisk (*) in your request for more generic results.", + "browser.noResults.loading": "loading...", + "browser.noResults.scanMore": "Use \"Scan more\" button to proceed or filter per exact Key Name to scan more efficiently.", + "browser.noResults.selectIndex": "Select an index and enter a query to search per values of keys.", + "browser.noResults.title": "No results found.", + "browser.onboarding.button.skip": "Skip tour", + "browser.onboarding.button.start": "Show me around", + "browser.onboarding.content": "Hi! Redis Insight has many tools that can help you to optimize the development process.Would you like us to show them to you?", + "browser.onboarding.title": "Take a quick tour of Redis Insight?", + "browser.popoverDelete.button": "Remove", + "browser.popoverDelete.removeAria": "Remove field", + "browser.redisearch.createIndex": "Create Index", + "browser.redisearch.refreshAria": "refresh indexes list", + "browser.redisearch.refreshTooltip": "Refresh Indexes", + "browser.redisearch.selectIndex": "Select Index", + "browser.rejson.addFieldAria": "Add field", + "browser.rejson.applyAria": "Apply", + "browser.rejson.cancelAddAria": "Cancel add", + "browser.rejson.cancelEditingAria": "Cancel editing", + "browser.rejson.close": "Close", + "browser.rejson.copyValueAria": "Copy value", + "browser.rejson.downloadTooltip": "Download", + "browser.rejson.downloadValueAria": "Download value", + "browser.rejson.editConfirmMessage": "You are about to modify a JSON value on a production database.", + "browser.rejson.editFieldAria": "Edit field", + "browser.rejson.error.keyCorrectSyntax": "Key should have correct syntax.", + "browser.rejson.error.valueJSONFormat": "Value should have JSON format.", + "browser.rejson.jsonKeyPlaceholder": "Enter JSON key", + "browser.rejson.jsonValuePlaceholder": "Enter JSON value", + "browser.rejson.overwrite.cancel": "Cancel", + "browser.rejson.overwrite.confirm": "Overwrite", + "browser.rejson.overwrite.message": "You already have the same JSON key. If you proceed, a value of the existing JSON key will be overwritten.", + "browser.rejson.overwrite.title": "Duplicate JSON key detected", + "browser.rejson.overwriteData": "Overwrite Data", + "browser.scanMore.button": "Scan more", + "browser.scanMore.warning": "Scanning additional keys may decrease performance and memory available.", + "browser.search.clearHistory": "Clear history", + "browser.search.input.aria": "Search", + "browser.search.mode.pattern.aria": "Filter by Key Name or Pattern button", + "browser.search.mode.pattern.tooltip": "Filter by Key Name or Pattern", + "browser.search.mode.redisearch.aria": "Search by Values of Keys button", + "browser.search.mode.redisearch.tooltip": "Search by Values of Keys", + "browser.search.placeholder.pattern": "Filter by Key Name or Pattern", + "browser.search.placeholder.redisearch": "Search per Values of Keys", + "browser.search.removeHistoryRecord": "Remove History Record", + "browser.search.resetFilters": "Reset Filters", + "browser.search.showHistory": "Show History", + "browser.set.add.cancel": "Cancel", + "browser.set.add.confirmButton": "Add members", + "browser.set.add.confirmMessage_one": "You are about to add {{count}} member to a set on a production database.", + "browser.set.add.confirmMessage_other": "You are about to add {{count}} members to a set on a production database.", + "browser.set.add.confirmTitle": "Add members on production database?", + "browser.set.add.save": "Save", + "browser.set.addMembers": "Add Members", + "browser.set.column.member": "Member", + "browser.stream.ack.aria": "Acknowledge pending message", + "browser.stream.ack.confirm": "Acknowledge", + "browser.stream.ack.message": "will be acknowledged and removed from the pending messages list", + "browser.stream.addAction.newEntry": "New Entry", + "browser.stream.addAction.newGroup": "New Group", + "browser.stream.addEntry.cancel": "Cancel", + "browser.stream.addEntry.confirmButton": "Add entry", + "browser.stream.addEntry.confirmMessage": "You are about to add a new entry to a stream on a production database.", + "browser.stream.addEntry.confirmTitle": "Add entry on production database?", + "browser.stream.addEntry.save": "Save", + "browser.stream.addGroup.cancel": "Cancel", + "browser.stream.addGroup.groupNamePlaceholder": "Enter Group Name*", + "browser.stream.addGroup.save": "Save", + "browser.stream.claim.aria": "Claim pending message", + "browser.stream.claim.cancel": "Cancel", + "browser.stream.claim.confirm": "Claim", + "browser.stream.claim.consumerLabel": "Consumer", + "browser.stream.claim.forceClaimLabel": "Force Claim", + "browser.stream.claim.forceLabel": "Force", + "browser.stream.claim.idleTimeLabel": "Idle Time", + "browser.stream.claim.minIdleTimeLabel": "Min Idle Time", + "browser.stream.claim.noConsumerTooltip": "There is no consumer to claim the message.", + "browser.stream.claim.optionalParams": "Optional Parameters", + "browser.stream.claim.pendingCount": "pending: {{count}}", + "browser.stream.claim.relativeTime": "Relative Time", + "browser.stream.claim.retryCountLabel": "Retry Count", + "browser.stream.claim.timeLabel": "Time", + "browser.stream.claim.timestamp": "Timestamp", + "browser.stream.column.entryId": "Entry ID", + "browser.stream.consumers.deleteMessage": "will be removed from Consumer Group {{group}}", + "browser.stream.consumers.empty": "Your Consumer Group has no Consumers available.", + "browser.stream.consumers.idleColumn": "Idle Time, msec", + "browser.stream.consumers.nameColumn": "Consumer Name", + "browser.stream.consumers.pendingColumn": "Pending", + "browser.stream.data.emptyStream": "There are no Entries in the Stream.", + "browser.stream.data.noResults": "No results found.", + "browser.stream.entryFields.idFormatHint": "Timestamp - Sequence Number or *", + "browser.stream.entryFields.idTooltipTitle": "Enter Valid ID or *", + "browser.stream.group.idFormatError": "ID format is not correct", + "browser.stream.group.idFormatHint": "Timestamp - Sequence Number or $", + "browser.stream.group.idPlaceholder": "ID*", + "browser.stream.group.idTooltipTitle": "Enter Valid ID, 0 or $", + "browser.stream.groups.consumersColumn": "Consumers", + "browser.stream.groups.deleteMessage": "and all its consumers will be removed from {{key}}", + "browser.stream.groups.empty": "Your Key has no Consumer Groups available.", + "browser.stream.groups.lastDeliveredColumn": "Last Delivered ID", + "browser.stream.groups.nameColumn": "Group Name", + "browser.stream.groups.pendingColumn": "Pending", + "browser.stream.groups.pendingMessages": "{{count}} Pending Messages", + "browser.stream.messages.empty": "Your Consumer has no pending messages.", + "browser.stream.messages.lastDeliveredColumn": "Last Message Delivered", + "browser.stream.messages.timesDeliveredColumn": "Times Message Delivered", + "browser.stream.tabs.data": "Stream Data", + "browser.stream.tabs.groups": "Consumer Groups", + "browser.string.copyValueAria": "Copy value", + "browser.string.download": "Download", + "browser.string.editValue": "Edit Value", + "browser.string.empty": "Empty", + "browser.string.loadAll": "Load all", + "browser.string.loadAllToEdit": "Load the entire value to edit it", + "browser.tree.folder.deleteAria": "Delete Folder Keys", + "browser.tree.folder.deleteDisabledMultipleDelimiters": "To use bulk delete, configure tree view with one delimiter.", + "browser.tree.folder.deleteDisabledUnprintable": "Non-printable characters detected. Bulk delete disabled due to unreliable key grouping.", + "browser.tree.folder.deleteTooltip": "Delete all keys matching: {{pattern}}", + "browser.tree.folder.keyCount_one": "{{count}} key ({{percentage}}%)", + "browser.tree.folder.keyCount_other": "{{count}} keys ({{percentage}}%)", + "browser.tree.settings.aria": "open tree view settings", + "browser.tree.settings.button.apply": "Apply", + "browser.tree.settings.button.cancel": "Cancel", + "browser.tree.settings.delimiter": "Delimiter", + "browser.tree.settings.sortBy": "Sort by", + "browser.tree.settings.sortOption": "Key name {{order}}", + "browser.vectorSet.addElements": "Add Elements", + "browser.vectorSet.attributeEditor.warning": "Non-JSON attributes are not supported as filter expressions in similarity search queries.", + "browser.vectorSet.clearResults": "Clear results", + "browser.vectorSet.columns": "Columns", + "browser.vectorSet.elementDetails.attributesDescription": "Structured metadata associated with this item, used for filtering, display, and hybrid search queries.", + "browser.vectorSet.elementDetails.attributesLabel": "Attributes", + "browser.vectorSet.elementDetails.copyVectorAria": "Copy vector", + "browser.vectorSet.elementDetails.downloadTooltip": "Download", + "browser.vectorSet.elementDetails.downloadVectorAria": "Download vector", + "browser.vectorSet.elementDetails.editAttributesAria": "Edit attributes", + "browser.vectorSet.elementDetails.vectorDescription": "The numerical embedding representing this item in vector space, used for similarity search and ranking.", + "browser.vectorSet.elementDetails.vectorLabel": "Vector", + "browser.vectorSet.filterHelp.aria": "Filter syntax help", + "browser.vectorSet.filterHelp.close": "Close", + "browser.vectorSet.filterHelp.examplesLabel": "Examples", + "browser.vectorSet.filterHelp.intro": "Filters use a small expression language evaluated against each element's attributes.", + "browser.vectorSet.filterHelp.op.comparison": "== / != / < / <= / > / >=", + "browser.vectorSet.filterHelp.op.inList": "in [ ... ]", + "browser.vectorSet.filterHelp.op.logical": "and / or / not", + "browser.vectorSet.filterHelp.op.selectAttribute": ". – select an attribute (e.g. .price)", + "browser.vectorSet.filterHelp.op.stringLiterals": "\"...\" for string literals", + "browser.vectorSet.filterHelp.operatorsLabel": "Operators", + "browser.vectorSet.filterHelp.title": "Filter syntax", + "browser.vectorSet.form.addAttributes": "Add attributes", + "browser.vectorSet.form.detectedFp32": "Detected FP32 vector ({{dim}} dimensions).", + "browser.vectorSet.form.detectedNumeric": "Detected numeric vector ({{dim}} dimensions).", + "browser.vectorSet.form.dimensionMismatch": "Dimension mismatch. Expected {{expected}} values, but received {{received}}", + "browser.vectorSet.form.elementNamePlaceholder": "Enter Element Name", + "browser.vectorSet.form.invalidFp32": "Invalid FP32 byte string", + "browser.vectorSet.form.invalidFp32Length": "FP32 byte length must be a multiple of 4", + "browser.vectorSet.form.invalidNumeric": "Invalid number format in vector", + "browser.vectorSet.form.nameHelp": "Unique identifier for this vector.", + "browser.vectorSet.form.optional": "(Optional)", + "browser.vectorSet.form.vectorHelp": "Format is detected automatically. The first vector defines the required dimension for this set.", + "browser.vectorSet.form.vectorPlaceholder": "Enter Vector", + "browser.vectorSet.form.vectorPlaceholderDim": "Enter Vector ({{count}} dimensions)", + "browser.vectorSet.list.elementColumn": "Element", + "browser.vectorSet.list.empty": "No results found.", + "browser.vectorSet.list.findSimilar": "Find similar elements", + "browser.vectorSet.list.loading": "Loading...", + "browser.vectorSet.list.viewAction": "View", + "browser.vectorSet.results.elementColumn": "Element", + "browser.vectorSet.results.empty": "No matching elements found.", + "browser.vectorSet.results.emptyAttr": "Empty", + "browser.vectorSet.results.rankColumn": "Rank", + "browser.vectorSet.results.similarityColumn": "Similarity", + "browser.vectorSet.search.elementMode": "Element", + "browser.vectorSet.search.elementModeTooltip": "Search by an existing element.", + "browser.vectorSet.search.elementPlaceholder": "Existing element name", + "browser.vectorSet.search.filterLabel": "Filter expression", + "browser.vectorSet.search.queryNotReadyTooltip": "Enter a vector or element to search", + "browser.vectorSet.search.resetAria": "Reset similarity search form", + "browser.vectorSet.search.resetTooltip": "Reset form", + "browser.vectorSet.search.resultCount": "Result count", + "browser.vectorSet.search.submit": "Find similar items", + "browser.vectorSet.search.suggestionsHint": "List based on partial scan of data.", + "browser.vectorSet.search.vectorMode": "Vector", + "browser.vectorSet.search.vectorModeTooltip": "Search by raw vector values", + "browser.vectorSet.search.vectorPlaceholder": "Enter a vector to find items with the most similar vectors.", + "browser.vectorSet.subheader.previewingFull": "Previewing {{count}} out of {{total}}", + "browser.vectorSet.subheader.previewingShort": "{{count}} out of {{total}}", + "browser.viewIndex.label": "View index", + "browser.zset.add.cancel": "Cancel", + "browser.zset.add.confirmButton": "Add members", + "browser.zset.add.confirmMessage_one": "You are about to add {{count}} member to a sorted set on a production database.", + "browser.zset.add.confirmMessage_other": "You are about to add {{count}} members to a sorted set on a production database.", + "browser.zset.add.confirmTitle": "Add members on production database?", + "browser.zset.add.save": "Save", + "browser.zset.addMembers": "Add Members", + "browser.zset.column.member": "Member", + "browser.zset.column.score": "Score", + "browser.zset.scoreEditDisabledTooltip": "Use CLI or Workbench to edit the score", + "browser.zset.scorePlaceholder": "Enter Score", + "browser.zset.searchMemberPrefix": "Member:", + "cluster.cancel.button": "Cancel", + "cluster.cancel.confirm": "Your changes have not been saved. Do you want to proceed to the list of databases?", + "cluster.cancel.proceed": "Proceed", + "cluster.column.capabilities": "Capabilities", + "cluster.column.database": "Database", + "cluster.column.endpoint": "Endpoint", + "cluster.column.options": "Options", + "cluster.column.result": "Result", + "cluster.column.status": "Status", + "cluster.databases.addButton": "Add selected Databases", + "cluster.databases.noResults": "Your Redis Enterprise Cluster has no databases available.", + "cluster.databases.subtitle_one": "These are the database in your Redis Enterprise Cluster. Select the database that you want to add.", + "cluster.databases.subtitle_other": "These are the databases in your Redis Enterprise Cluster. Select the databases that you want to add.", + "cluster.databases.title": "Auto-Discover Redis Enterprise Databases", + "cluster.endpoint.copyAriaLabel": "Copy public endpoint", + "cluster.loadingMsg": "loading...", + "cluster.notFound": "Not found", + "cluster.result.error": "Error", + "cluster.result.pageTitle": "Redis Enterprise Databases Added", + "cluster.result.title_one": "Redis Enterprise Database Added", + "cluster.result.title_other": "Redis Enterprise Databases Added", + "cluster.result.viewButton": "View Databases", + "cluster.summary.fail_one": "Failed to add {{count}} database.", + "cluster.summary.fail_other": "Failed to add {{count}} databases.", + "cluster.summary.label": "Summary: ", + "cluster.summary.success_one": "Successfully added {{count}} database", + "cluster.summary.success_other": "Successfully added {{count}} databases", + "common.connectionInfo.autofill": "Pasting a connection URL auto fills the database details.", + "common.connectionInfo.supportedUrls": "The following connection URLs are supported:", + "common.fullScreen.enter": "Full Screen", + "common.fullScreen.exit": "Exit Full Screen", + "common.fullScreen.openAria": "Open full screen", + "common.keyType.array": "Array", + "common.keyType.graph": "Graph", + "common.keyType.hash": "Hash", + "common.keyType.json": "JSON", + "common.keyType.list": "List", + "common.keyType.set": "Set", + "common.keyType.sortedSet": "Sorted Set", + "common.keyType.stream": "Stream", + "common.keyType.string": "String", + "common.keyType.timeSeries": "Time Series", + "common.keyType.vectorSet": "Vector Set", "common.privacyPolicy": "Privacy Policy", + "common.uploadWarning": "Use files only from trusted authors to avoid automatic execution of malicious code.", + "home.databaseList.bulkActions.delete.subtitle_one": "Selected {{count}} item will be deleted from RedisInsight:", + "home.databaseList.bulkActions.delete.subtitle_other": "Selected {{count}} items will be deleted from RedisInsight:", + "home.databaseList.bulkActions.export.subtitle_one": "Selected {{count}} item will be exported from RedisInsight:", + "home.databaseList.bulkActions.export.subtitle_other": "Selected {{count}} items will be exported from RedisInsight:", + "home.databaseList.cellHost.ariaLabel.copyHostPort": "Copy host:port", + "home.databaseList.cellName.tooltip.databaseAlias": "Database Alias", + "home.databaseList.controls.ariaLabel.controlsIcon": "Controls icon", + "home.databaseList.controls.ariaLabel.editInstance": "Edit instance", + "home.databaseList.controls.ariaLabel.manageInstanceTags": "Manage Instance Tags", + "home.databaseList.controls.button.editDatabase": "Edit database", + "home.databaseList.controls.button.removeDatabase": "Remove database", + "home.databaseList.controls.deleteConfirm.text": "will be removed from Redis Insight.", + "home.databaseList.controls.tooltip.goToCloud": "Go to Redis Cloud", + "home.databaseList.controls.tooltip.manageTags": "Manage Tags", + "home.databaseList.dbStatus.checkCloudDatabase.autoDelete": "Free Redis Cloud DBs auto-delete after {{days}} days of inactivity.", + "home.databaseList.dbStatus.checkCloudDatabase.capabilities": "Includes native support for JSON, Redis Search and more.", + "home.databaseList.dbStatus.checkCloudDatabase.recreate": "But not to worry, you can always re-create it to test your ideas.", + "home.databaseList.dbStatus.checkCloudDatabase.title": "Build your app with Redis Cloud", + "home.databaseList.dbStatus.tooltip.new": "New", + "home.databaseList.dbStatus.warningWithCapability.body": "Hey, remember your interest in {{capability}}?
Use your free Redis Cloud DB to try it.", + "home.databaseList.dbStatus.warningWithCapability.note": "Note: Free Cloud DBs auto-delete after {{days}} days of inactivity.", + "home.databaseList.dbStatus.warningWithCapability.title": "Build your app with {{capability}}", + "home.databaseList.dbStatus.warningWithoutCapability.body": "Test ideas and build prototypes.
Includes native support for JSON, Redis Search and more.", + "home.databaseList.dbStatus.warningWithoutCapability.note": "Note: Free Redis Cloud DBs auto-delete after {{days}} days of inactivity.", + "home.databaseList.dbStatus.warningWithoutCapability.title": "Your free Redis Cloud DB is waiting.", + "home.databaseList.empty.button.addDatabase": "Add Redis database", + "home.databaseList.empty.link.createCloudDb": "Create a free Redis Cloud database", + "home.databaseList.empty.noInstances": "No added instances", + "home.databaseList.empty.noResults": "No results found", + "home.databaseList.empty.title": "No databases yet, let's add one!", + "home.databaseList.loading": "Loading...", + "home.databaseList.manageTags.button.addTag": "Add additional tag", + "home.databaseList.manageTags.button.cancel": "Cancel", + "home.databaseList.manageTags.button.save": "Save tags", + "home.databaseList.manageTags.description": "Tags are key-value pairs that let you categorize your databases.", + "home.databaseList.manageTags.error.invalidField": "Tag can only have letters, numbers, spaces, and these special characters: “- _ . + @ :”", + "home.databaseList.manageTags.error.maxKeyLength": "Key must be under {{max}} characters", + "home.databaseList.manageTags.error.maxValueLength": "Value must be under {{max}} characters", + "home.databaseList.manageTags.error.uniqueKey": "Key should be unique", + "home.databaseList.manageTags.header.key": "Key", + "home.databaseList.manageTags.header.value": "Value", + "home.databaseList.manageTags.placeholder.key": "Select a key or type your own", + "home.databaseList.manageTags.placeholder.value": "Select a value or type your own", + "home.databaseList.manageTags.suggestions.newTag": "{{term}} (new tag)", + "home.databaseList.manageTags.suggestions.newValue": "{{term}} (new value)", + "home.databaseList.manageTags.suggestions.title": "Suggestions", + "home.databaseList.manageTags.title": "Manage tags for {{name}}", + "home.databaseList.manageTags.warning": "Tag changes in Redis Insight apply locally and are not synced with Redis {{product}}.", + "home.databaseList.search.ariaLabel": "Search database list", + "home.databaseList.search.placeholder": "Database List Search", + "home.databaseList.tags.filter.placeholder": "Enter tag key or value", + "home.form.ariaLabel.back": "back", + "home.form.button.addDatabase": "Add Redis Database", + "home.form.button.cloneDatabase": "Clone Database", + "home.form.button.editDatabase": "Apply Changes", + "home.form.cloud.button.cancel": "Cancel", + "home.form.cloud.button.submit": "Submit", + "home.form.cloud.field.accessKey": "Enter API Account Key", + "home.form.cloud.field.secretKey": "Enter API User Key", + "home.form.cloud.label.accessKey": "API Account Key", + "home.form.cloud.label.connectWith": "Connect with", + "home.form.cloud.label.secretKey": "API User Key", + "home.form.cloud.modalTitle": "Discover Cloud databases", + "home.form.cloud.option.account": "Redis Cloud account", + "home.form.cloud.option.apiKeys": "Redis Cloud API keys", + "home.form.cluster.button.cancel": "Cancel", + "home.form.cluster.button.submit": "Submit", + "home.form.cluster.field.host": "Cluster Host", + "home.form.cluster.field.password": "Admin Password", + "home.form.cluster.field.port": "Cluster Port", + "home.form.cluster.field.username": "Admin Username", + "home.form.cluster.modalTitle": "Redis Software", + "home.form.cluster.placeholder.host": "Enter Cluster Host", + "home.form.cluster.placeholder.password": "Enter Password", + "home.form.cluster.placeholder.port": "Enter Cluster Port", + "home.form.cluster.placeholder.username": "Enter Admin Username", + "home.form.compressor.enable": "Enable Automatic Data Decompression", + "home.form.compressor.field.format": "Decompression format", + "home.form.compressor.option.none": "No decompression", + "home.form.database.connectionFamily.auto": "Auto (IPv4 & IPv6)", + "home.form.database.connectionFamily.tooltip": "Choose which IP protocol to use when connecting. Use IPv4 or IPv6 if the host does not resolve correctly over the other protocol.", + "home.form.database.field.alias": "Database alias", + "home.form.database.field.host": "Host", + "home.form.database.field.ipProtocol": "IP protocol", + "home.form.database.field.password": "Password", + "home.form.database.field.port": "Port", + "home.form.database.field.timeout": "Timeout (s)", + "home.form.database.field.username": "Username", + "home.form.database.placeholder.alias": "Enter Database Alias", + "home.form.database.placeholder.host": "Enter Hostname / IP address / Connection URL", + "home.form.database.placeholder.password": "Enter Password", + "home.form.database.placeholder.port": "Enter Port", + "home.form.database.placeholder.timeout": "Enter Timeout (in seconds)", + "home.form.database.placeholder.username": "Enter Username", + "home.form.dbIndex.field.databaseIndex": "Database Index", + "home.form.dbIndex.placeholder.databaseIndex": "Enter Database Index", + "home.form.dbIndex.selectLogicalDb": "Select Logical Database", + "home.form.dbInfo.field.capabilities": "Capabilities:", + "home.form.dbInfo.field.connectionType": "Connection Type:", + "home.form.dbInfo.field.databaseIndex": "Database Index:", + "home.form.dbInfo.field.host": "Host:", + "home.form.dbInfo.field.nameFromProvider": "Database Name from Provider:", + "home.form.dbInfo.field.port": "Port:", + "home.form.dbInfo.tooltip.hostPort": "Host:port", + "home.form.dbInfoSentinel.ariaLabel.copyHostPort": "Copy host:port", + "home.form.dbInfoSentinel.field.hostAndPort": "Sentinel Host & Port:", + "home.form.dbInfoSentinel.field.primaryGroupName": "Primary Group Name:", + "home.form.dbInfoSentinel.field.primaryGroupNameLabel": "Primary group name", + "home.form.dbInfoSentinel.placeholder.primaryGroupName": "Enter Primary Group Name", + "home.form.environment.development": "Development", + "home.form.environment.label": "Environment", + "home.form.environment.production": "Production", + "home.form.environment.tooltip.description": "Classify this database to apply the right safety behavior.", + "home.form.environment.tooltip.development": "Development — Skips standard confirmation dialogs when modifying data, for faster work on development and test databases.", + "home.form.environment.tooltip.production": "Production — Adds an extra layer of protection to prevent unintended changes. Includes additional confirmation dialogs before modifying data and stronger friction before running dangerous commands.", + "home.form.environment.tooltip.unspecified": "Unspecified — Standard Redis Insight behavior. The default for new and existing connections.", + "home.form.environment.unspecified": "Unspecified", + "home.form.field.alias": "Database alias", + "home.form.field.host": "Host", + "home.form.field.newCaCert": "CA certificate", + "home.form.field.newCaCertName": "CA Certificate Name", + "home.form.field.newTlsCertPairName": "Client Certificate Name", + "home.form.field.newTlsClientCert": "Client Certificate", + "home.form.field.newTlsClientKey": "Private Key", + "home.form.field.port": "Port", + "home.form.field.selectedCaCertName": "CA Certificate", + "home.form.field.sentinelMasterName": "Primary Group Name", + "home.form.field.servername": "Server Name", + "home.form.field.sshHost": "SSH Host", + "home.form.field.sshPort": "SSH Port", + "home.form.field.sshPrivateKey": "SSH Private Key", + "home.form.field.sshUsername": "SSH Username", + "home.form.footer.button.cancel": "Cancel", + "home.form.footer.button.testConnection": "Test Connection", + "home.form.forceStandalone.label": "Force Standalone Connection", + "home.form.forceStandalone.tooltip": "Override the default connection logic and connect to the specified endpoint as a standalone database.", + "home.form.keyFormat.label": "Key name format", + "home.form.manual.ariaLabel.cloneDatabase": "Clone database", + "home.form.manual.button.cloneConnection": "Clone Connection", + "home.form.manual.editSentinel.field.databaseAlias": "Database Alias", + "home.form.manual.editSentinel.placeholder.databaseAlias": "Enter Database Alias", + "home.form.manual.editSentinel.title.database": "Database", + "home.form.manual.editSentinel.title.sentinel": "Sentinel", + "home.form.manual.tab.decompression": "Decompression & Formatters", + "home.form.manual.tab.general": "General", + "home.form.manual.tab.security": "Security", + "home.form.manual.title.cloneDatabase": "Clone Database", + "home.form.manual.title.connectionSettings": "Connection settings", + "home.form.manual.title.editDatabase": "Edit Database", + "home.form.message.cloudApiKeys": "Enter Redis Cloud API keys to discover and add databases. API keys can be enabled by following the steps mentioned in the documentation.", + "home.form.message.enterpriseSoftware": "Your Redis Software databases can be automatically added. Enter the connection details of your Redis Software Cluster to automatically discover your databases and add them to {{appName}}. Learn more here.", + "home.form.message.sentinel": "You can automatically discover and add primary groups from your Redis Sentinel. Enter host and port of your Redis Sentinel to automatically discover your primary groups and add them to {{appName}}. Learn more here.", + "home.form.sentinel.button.cancel": "Cancel", + "home.form.sentinel.button.discover": "Discover database", + "home.form.sentinel.modalTitle": "Redis Sentinel", + "home.form.ssh.field.host": "Host", + "home.form.ssh.field.passphrase": "Passphrase", + "home.form.ssh.field.password": "Password", + "home.form.ssh.field.port": "Port", + "home.form.ssh.field.privateKey": "Private Key", + "home.form.ssh.field.username": "Username", + "home.form.ssh.passType.password": "Password", + "home.form.ssh.passType.privateKey": "Private Key", + "home.form.ssh.placeholder.host": "Enter SSH Host", + "home.form.ssh.placeholder.passphrase": "Enter Passphrase for Private Key", + "home.form.ssh.placeholder.password": "Enter SSH Password", + "home.form.ssh.placeholder.port": "Enter SSH Port", + "home.form.ssh.placeholder.privateKey": "Enter SSH Private Key in PEM format", + "home.form.ssh.placeholder.username": "Enter SSH Username", + "home.form.ssh.useTunnel": "Use SSH Tunnel", + "home.form.tls.deleteConfirm.text": "will be removed from RedisInsight.", + "home.form.tls.field.caCertificate": "CA Certificate", + "home.form.tls.field.certificate": "Certificate", + "home.form.tls.field.certificateName": "Name", + "home.form.tls.field.clientCertificate": "Client Certificate", + "home.form.tls.field.privateKey": "Private Key", + "home.form.tls.field.serverName": "Server Name", + "home.form.tls.option.addNewCaCert": "Add new CA certificate", + "home.form.tls.option.addNewCert": "Add new certificate", + "home.form.tls.option.noCaCert": "No CA Certificate", + "home.form.tls.placeholder.caCert": "Enter CA Certificate", + "home.form.tls.placeholder.caCertName": "Enter CA Certificate Name", + "home.form.tls.placeholder.clientCert": "Enter Client Certificate", + "home.form.tls.placeholder.clientCertName": "Enter Client Certificate Name", + "home.form.tls.placeholder.privateKey": "Enter Private Key", + "home.form.tls.placeholder.selectCaCert": "Select CA certificate", + "home.form.tls.placeholder.selectCert": "Select certificate", + "home.form.tls.placeholder.serverName": "Enter Server Name", + "home.form.tls.requiresClientAuth": "Requires TLS Client Authentication", + "home.form.tls.useSni": "Use SNI", + "home.form.tls.useTls": "Use TLS", + "home.form.tls.verifyCertificate": "Verify TLS Certificate", + "home.header.button.connectExistingDb": "Connect existing database", + "home.header.button.createCloudDb": "Create free Cloud database", + "home.importDatabase.button.cancel": "Cancel", + "home.importDatabase.button.ok": "OK", + "home.importDatabase.button.retry": "Retry", + "home.importDatabase.button.submit": "Submit", + "home.importDatabase.description": "Use a JSON file to import your database connections. Ensure that you only use files from trusted sources to prevent the risk of automatically executing malicious code.", + "home.importDatabase.error.failed": "Failed to add database connections", + "home.importDatabase.error.maxFileSize": "File should not exceed {{max}} MB", + "home.importDatabase.filePicker.ariaLabel": "Select or drag and drop file", + "home.importDatabase.filePicker.prompt": "Select or drag and drop a file", + "home.importDatabase.resultsLog.title.fail": "Failed to import", + "home.importDatabase.resultsLog.title.partial": "Partially imported", + "home.importDatabase.resultsLog.title.success": "Fully imported", + "home.importDatabase.table.successful": "Successful", + "home.importDatabase.title": "Import from file", + "home.importDatabase.tooltip.uploadFile": "Upload a file", + "home.importDatabase.uploading": "Uploading...", + "home.title": "Redis databases", + "notFound.button.databases": "Databases page", + "notFound.description": "We searched every shard,
But couldn't find the page you're after.", + "notFound.title": "Whoops!
This Page Is an Empty Set", + "notification.error.appUpdateFailed.message": "The update could not be downloaded. Please try again later.", + "notification.error.appUpdateFailed.title": "Update failed", "notification.error.arrayBulkDeleteLimit.message": "You can delete up to {{max}} elements at once. Clear some of the selection and try again.", "notification.error.arrayBulkDeleteLimit.title": "Too many elements selected", "notification.error.button.copied": "Copied", "notification.error.button.copy": "Copy", "notification.error.button.downloadFullLog": "Download full log", + "notification.error.createArray.message": "Please try again.", + "notification.error.createArray.title": "Failed to create array", + "notification.error.createVectorSet.message": "Please try again.", + "notification.error.createVectorSet.title": "Failed to create vector set", "notification.error.default": "Something was wrong!", "notification.error.encryption.button.cancel": "Cancel", "notification.error.encryption.button.disable": "Disable Encryption", "notification.error.encryption.checkKeychain": "Check the system keychain or disable encryption to proceed.", "notification.error.encryption.disableWarning": "Disabling encryption will result in storing sensitive information locally in plain text. Re-enter database connection information to work with databases.", "notification.error.encryption.title": "Unable to decrypt", + "notification.error.queryLibraryCleanupFailed.message": "An error occurred while removing saved queries for the deleted index.", + "notification.error.queryLibraryCleanupFailed.title": "Failed to clean up query library", + "notification.error.queryLibrarySaveFailed.message": "An error occurred while saving the query. Please try again.", + "notification.error.queryLibrarySaveFailed.title": "Failed to save query", "notification.error.reportIssue": "If the issue persists, please", "notification.error.reportIssueLink": "report it.", "notification.error.title.default": "Error", "notification.error.tryAgainLater": "Try again later.", + "notification.error.vectorSearchCreateIndexFailed.message": "An error occurred while creating the index. Please try again.", + "notification.error.vectorSearchCreateIndexFailed.title": "Failed to create index", "notification.infinite.appUpdateAvailable.button.restart": "Restart", - "notification.infinite.appUpdateAvailable.description": "With Redis Insight {{version}} you have access to new useful features and optimizations.", - "notification.infinite.appUpdateAvailable.descriptionRestart": "Restart Redis Insight to install updates.", - "notification.infinite.appUpdateAvailable.message": "New version is now available", + "notification.infinite.appUpdateAvailable.description": "Redis Insight {{version}} is ready - see what's new and restart to install.", + "notification.infinite.appUpdateAvailable.message": "Update ready to install", + "notification.infinite.appUpdateDownloading.message": "Downloading update…", + "notification.infinite.appUpdateFound.button.skip": "Skip this version", + "notification.infinite.appUpdateFound.button.update": "Update", + "notification.infinite.appUpdateFound.description": "Redis Insight {{version}} is here. See what's new.", + "notification.infinite.appUpdateFound.message": "A new version is available", "notification.infinite.authenticating.description": "This may take several seconds, but it is totally worth it!", "notification.infinite.authenticating.message": "Authenticating…", "notification.infinite.autoCreatingDatabase.description": "This may take several minutes, but it is totally worth it!", @@ -292,6 +1435,10 @@ "notification.success.messageAction.title": "Message has been {{action}}", "notification.success.noClaimedMessages.message": "No messages exceed the minimum idle time.", "notification.success.noClaimedMessages.title": "No messages claimed", + "notification.success.queryLibraryDeleted.title": "Query has been deleted.", + "notification.success.queryLibrarySaved.action": "Go to Query Library", + "notification.success.queryLibrarySaved.message": "You can find it anytime in the Query Library.", + "notification.success.queryLibrarySaved.title": "Query saved to your library.", "notification.success.removedAllCapiKeys.message": "All API keys have been removed from Redis Insight.", "notification.success.removedAllCapiKeys.title": "API keys have been removed", "notification.success.removedArrayRange.message": "{{total}} element(s) removed from {{name}}", @@ -310,6 +1457,10 @@ "notification.success.removedListElements.title": "Elements have been removed", "notification.success.resetPipeline.message": "The RDI pipeline has been reset, consider flushing the target Redis database.", "notification.success.resetPipeline.title": "Pipeline has been reset", + "notification.success.sampleArrayAdded.message": "The '{{keyName}}' sample array has been successfully added.", + "notification.success.sampleArrayAdded.title": "Sample array added", + "notification.success.sampleVectorSetAdded.message": "The '{{keyName}}' sample vector set has been successfully added.", + "notification.success.sampleVectorSetAdded.title": "Sample vector set added", "notification.success.tagsUpdated.title": "Tags updated successfully.", "notification.success.testConnection.title": "Connection is successful", "notification.success.uploadDataBulk.commandsProcessed": "Commands Processed", @@ -318,6 +1469,251 @@ "notification.success.uploadDataBulk.success": "Success", "notification.success.uploadDataBulk.timeTaken": "Time Taken", "notification.success.uploadDataBulk.title": "Action completed", + "notification.success.vectorSearchIndexCreated.message": "Your data is now searchable. You can start running queries.", + "notification.success.vectorSearchIndexCreated.title": "Index created successfully.", + "notification.success.vectorSearchSampleDataCreated.message": "Start building queries or explore sample ones under Query library.", + "notification.success.vectorSearchSampleDataCreated.title": "Your sample data is now searchable.", + "notification.success.vectorSearchSampleDataExists.message": "You can start building new queries or explore existing ones in the Query Library.", + "notification.success.vectorSearchSampleDataExists.title": "Your sample data is already searchable using an existing index.", + "notification.warning.keyExists.message": "A key named '{{keyName}}' already exists in this database.", + "notification.warning.keyExists.title": "Key already exists", + "notification.warning.sampleArrayNoTtl.message": "The '{{keyName}}' sample array was created, but the TTL could not be applied.", + "notification.warning.sampleArrayNoTtl.title": "Sample array added without TTL", + "oauth.mfa.cancel": "Cancel", + "oauth.mfa.codeLabel": "6-digit code", + "oauth.mfa.description": "Your Redis Cloud account is protected with multi-factor authentication. Enter the code from your authenticator app to finish signing in.", + "oauth.mfa.invalidCode": "Invalid or expired code. Please try again.", + "oauth.mfa.title": "Enter your verification code", + "oauth.mfa.totpUnavailable": "This account can't be verified with an authenticator app here. Finish signing in from the Redis Cloud console.", + "oauth.mfa.verify": "Verify", + "pubsub.empty.description": "Subscribe to the Channel to see all the messages published to your database", + "pubsub.empty.imageAlt": "Pub/Sub", + "pubsub.empty.productionWarning": "Running in production may decrease performance and memory available.", + "pubsub.empty.spublishWarning": "Messages published with SPUBLISH will not appear in this channel", + "pubsub.empty.title": "You are not subscribed", + "pubsub.messageCell.copyAriaLabel": "Copy message", + "pubsub.messageCell.title": "Message", + "pubsub.messages.label": "Messages:", + "pubsub.pageTitle": "{{dbName}} - Pub/Sub", + "pubsub.patterns.all": "All", + "pubsub.patterns.label": "Patterns: {{value}}", + "pubsub.publish.button": "Publish", + "pubsub.publish.channelLabel": "Channel name", + "pubsub.publish.channelPlaceholder": "Enter Channel Name", + "pubsub.publish.messageLabel": "Message", + "pubsub.publish.messagePlaceholder": "Enter Message", + "pubsub.publish.published": "Published", + "pubsub.publish.publishedWithClients": "Published ({{clients}})", + "pubsub.status.label": "Status:", + "pubsub.status.subscribed": "Subscribed", + "pubsub.status.unsubscribed": "Unsubscribed", + "pubsub.subscribe.button.subscribe": "Subscribe", + "pubsub.subscribe.button.unsubscribe": "Unsubscribe", + "pubsub.subscribe.channelsAriaLabel": "channel names for filtering", + "pubsub.subscribe.clearAriaLabel": "clear pub sub", + "pubsub.subscribe.clearTooltip": "Clear Messages", + "pubsub.subscribe.info.channels": "Subscribe to one or more channels or patterns by entering them, separated by spaces.", + "pubsub.subscribe.info.patterns": "Supported glob-style patterns are described here.", + "pubsub.subscribe.patternPlaceholder": "Enter Pattern", + "pubsub.table.column.channel": "Channel", + "pubsub.table.column.message": "Message", + "pubsub.table.column.timestamp": "Timestamp", + "pubsub.table.empty": "No messages published yet", + "query.actions.groupMode.label": "Group results", + "query.actions.groupMode.tooltip": "Groups the command results into a single window.When grouped, the results can be visualized only in the text format.", + "query.actions.rawMode.label": "Raw mode", + "query.actions.rawMode.tooltip": "Enables the raw output mode", + "query.card.clearResult.tooltip": "Clear result", + "query.card.copyQuery.aria": "Copy query", + "query.card.delete.aria": "Delete command", + "query.card.mode.group": "Group mode", + "query.card.mode.raw": "Raw mode", + "query.card.mode.silent": "Silent mode", + "query.card.processingTime": "Processing Time", + "query.card.queryParameters.aria": "Query parameters", + "query.card.rerun.aria": "Re-run command", + "query.card.rerun.tooltip": "Run again", + "query.card.summary.commands_one": "{{count}} Command - {{success}} success", + "query.card.summary.commands_other": "{{count}} Commands - {{success}} success", + "query.card.summary.errors_one": ", {{count}} error", + "query.card.summary.errors_other": ", {{count}} errors", + "query.card.toggleCollapse.aria": "Toggle result", + "query.cliResult.copy": "Copy result", + "query.cliResult.tooBig": "The result is too big to be saved. It will be deleted after the application is closed.", + "query.editor.vectorEmbedding.copy": "Copy", + "query.editor.vectorEmbedding.hover": "Vector embedding — {{dimensions}} dimensions ({{byteSize}} bytes)", + "query.editor.vectorEmbedding.label": "vector · {{dimensions}} dims", + "query.executing": "Please wait while the commands are being executed…", + "query.liteActions.clear.aria": "Clear query", + "query.liteActions.clear.label": "Clear", + "query.liteActions.clear.tooltip": "Clear query", + "query.results.clear": "Clear Results", + "query.runButton.aria": "Run query", + "query.runButton.label": "Run", + "query.runShortcut.label": "Run commands", + "query.runShortcut.labelNonMac": "Run", + "query.tutorials.title": "Tutorials:", + "rdi.home.bulkDelete.subtitle_one": "Selected {{count}} item will be deleted from RedisInsight:", + "rdi.home.bulkDelete.subtitle_other": "Selected {{count}} items will be deleted from RedisInsight:", + "rdi.home.column.controls": "Controls", + "rdi.home.column.lastConnection": "Last connection", + "rdi.home.column.name": "RDI alias", + "rdi.home.column.url": "URL", + "rdi.home.column.version": "RDI version", + "rdi.home.empty.button": "Let’s connect to RDI", + "rdi.home.empty.description": "Redis data integration (RDI) streams data to Redis Cloud, ensuring real-time sync while saving time and costs. It eliminates cache misses and simplifies data management.", + "rdi.home.empty.title": "Create data pipeline", + "rdi.home.form.addButton": "Add Endpoint", + "rdi.home.form.addTitle": "Add RDI endpoint", + "rdi.home.form.applyButton": "Apply Changes", + "rdi.home.form.auth.info": "The RDI REST API authentication is using the RDI Redis username and password.", + "rdi.home.form.cancel": "Cancel", + "rdi.home.form.editTitle": "Edit endpoint", + "rdi.home.form.name.label": "RDI Alias", + "rdi.home.form.name.placeholder": "Enter RDI Alias", + "rdi.home.form.password.label": "Password", + "rdi.home.form.password.placeholder": "Enter the RDI Redis password", + "rdi.home.form.url.info": "The RDI machine servers REST API via port 443. Ensure that Redis Insight can access the RDI host over port 443.", + "rdi.home.form.url.label": "URL", + "rdi.home.form.url.placeholder": "Enter the RDI host IP as: https://[IP-Address]", + "rdi.home.form.username.label": "Username", + "rdi.home.form.username.placeholder": "Enter the RDI Redis username", + "rdi.home.form.wrapperTitle": "Add endpoint", + "rdi.home.header.addButton": "RDI Instance", + "rdi.home.instanceCell.copyUrlAria": "Copy URL", + "rdi.home.instanceControls.controlsAria": "Controls icon", + "rdi.home.instanceControls.deleteText": "will be removed from RedisInsight.", + "rdi.home.instanceControls.editAria": "Edit instance", + "rdi.home.instanceControls.removeButton": "Remove instance", + "rdi.home.list.empty.loading": "Loading...", + "rdi.home.list.empty.noEndpoints": "No added endpoints", + "rdi.home.list.empty.noResults": "No results found", + "rdi.home.pageTitle": "Redis Data Integration", + "rdi.home.search.ariaLabel": "Search rdi instance list", + "rdi.home.search.placeholder": "Endpoint List Search", + "rdi.instance.configMenu.downloadDeployed": "Download deployed pipeline", + "rdi.instance.configMenu.importZip": "Import pipeline from ZIP file", + "rdi.instance.configMenu.saveZip": "Save pipeline to ZIP file", + "rdi.instance.deploy.button": "Deploy", + "rdi.instance.deploy.confirmTitle": "Are you sure you want to deploy the pipeline?", + "rdi.instance.deploy.errorsWarning": "Your RDI pipeline contains errors. Are you sure you want to continue?", + "rdi.instance.deploy.flushText": "After deployment, consider flushing the target Redis database and resetting the pipeline to ensure that all data is reprocessed.", + "rdi.instance.deploy.overwriteText": "When deployed, this local configuration will overwrite any existing pipeline.", + "rdi.instance.deploy.resetInfo": "The pipeline will take a new snapshot of the data and process it, then continue tracking changes.", + "rdi.instance.deploy.resetLabel": "Reset", + "rdi.instance.reset.ariaLabel": "Reset pipeline button", + "rdi.instance.reset.button": "Reset", + "rdi.instance.reset.tooltipLine1": "The pipeline will take a new snapshot of the data and process it, then continue tracking changes.", + "rdi.instance.reset.tooltipLine2": "Before resetting the RDI pipeline, consider stopping the pipeline and flushing the target Redis database.", + "rdi.instance.start.ariaLabel": "Start running pipeline", + "rdi.instance.start.button": "Start", + "rdi.instance.start.tooltip": "Start the pipeline to resume processing new data arrivals.", + "rdi.instance.status.creating": "Creating", + "rdi.instance.status.deleting": "Deleting", + "rdi.instance.status.error": "Error", + "rdi.instance.status.initialSync": "Initial sync", + "rdi.instance.status.notReady": "Not-ready", + "rdi.instance.status.notRunning": "Not running", + "rdi.instance.status.pending": "Pending", + "rdi.instance.status.ready": "Ready", + "rdi.instance.status.resetting": "Resetting", + "rdi.instance.status.started": "Started", + "rdi.instance.status.starting": "Starting", + "rdi.instance.status.stopped": "Stopped", + "rdi.instance.status.stopping": "Stopping", + "rdi.instance.status.streaming": "Streaming", + "rdi.instance.status.title": "Pipeline status", + "rdi.instance.status.unknown": "Unknown", + "rdi.instance.status.updating": "Updating", + "rdi.instance.stop.ariaLabel": "Stop running pipeline", + "rdi.instance.stop.button": "Stop", + "rdi.instance.stop.tooltip": "Stop the pipeline to prevent processing of new data arrivals.", + "rdi.pipeline.config.description": "Configure target instance connection details and applier settings.", + "rdi.pipeline.config.testButton": "Test Connection", + "rdi.pipeline.config.title": "Target database configuration", + "rdi.pipeline.download.body": "When downloading the pipeline configuration from the server, it will overwrite the existing one displayed in Redis Insight.", + "rdi.pipeline.download.cancel": "Cancel", + "rdi.pipeline.download.confirm": "Download from server", + "rdi.pipeline.download.saveToFile": "Save to file", + "rdi.pipeline.download.title": "Download a pipeline from the server", + "rdi.pipeline.dryRun.closeAria": "close dry run panel", + "rdi.pipeline.dryRun.fullscreenAria": "toggle fullscrenn dry run panel", + "rdi.pipeline.dryRun.inputHelp": "Add input data to test the transformation logic.", + "rdi.pipeline.dryRun.inputInvalid": "Input should have JSON format", + "rdi.pipeline.dryRun.inputTitle": "Input", + "rdi.pipeline.dryRun.jobOutput": "Job output", + "rdi.pipeline.dryRun.jobOutputTooltip": "Displays the list of Redis commands that will be generated based on your job details.No data is written to the target database.", + "rdi.pipeline.dryRun.noCommands": "No Redis commands provided by the server.", + "rdi.pipeline.dryRun.noTransformation": "No transformation results provided by the server.", + "rdi.pipeline.dryRun.runButton": "Dry run", + "rdi.pipeline.dryRun.title": "Test transformation logic", + "rdi.pipeline.dryRun.transformationOutput": "Transformation output", + "rdi.pipeline.dryRun.transformationTooltip": "Displays the results of the transformations you defined. The data is presented in JSON format.No data is written to the target database.", + "rdi.pipeline.error.defaultMsg": "Failed to convert YAML to JSON structure", + "rdi.pipeline.error.defaultName": "Value", + "rdi.pipeline.invalidStructure": "{{name}} has an invalid structure.", + "rdi.pipeline.job.dedicatedEditorButton": "SQL and JMESPath Editor", + "rdi.pipeline.job.description": "Create a job per source table to filter, transform, and map data to Redis.", + "rdi.pipeline.job.dryRunButton": "Dry Run", + "rdi.pipeline.jobName.inUse": "Job name is already in use", + "rdi.pipeline.jobName.placeholder": "Enter job name", + "rdi.pipeline.jobName.required": "Job name is required", + "rdi.pipeline.loading": "Loading...", + "rdi.pipeline.nav.addJobAria": "add new job file", + "rdi.pipeline.nav.addJobTooltip": "Add a job file", + "rdi.pipeline.nav.configFile": "Configuration file", + "rdi.pipeline.nav.configTitle": "Configuration", + "rdi.pipeline.nav.deleteConfirm": "Delete", + "rdi.pipeline.nav.deleteJobAria": "delete job", + "rdi.pipeline.nav.deleteJobBody": "Changes will not be applied until the pipeline is deployed.", + "rdi.pipeline.nav.deleteJobTitle": "Delete {{name}}", + "rdi.pipeline.nav.deleteJobTooltip": "Delete job", + "rdi.pipeline.nav.editJobAria": "edit job file name", + "rdi.pipeline.nav.editJobTooltip": "Edit job file name", + "rdi.pipeline.nav.jobsTitle": "Transform and Validate", + "rdi.pipeline.nav.title": "Pipeline management", + "rdi.pipeline.nav.undeployedChanges": "This file contains undeployed changes.", + "rdi.pipeline.pageTitle": "{{name}} - Pipeline Management", + "rdi.pipeline.source.createNew": "Create new pipeline", + "rdi.pipeline.source.importZip": "Import pipeline from ZIP file", + "rdi.pipeline.source.subtitle": "to start with your pipeline", + "rdi.pipeline.source.title": "Select an option", + "rdi.pipeline.template.apply": "Apply", + "rdi.pipeline.template.cancel": "Cancel", + "rdi.pipeline.template.dbType": "Database type", + "rdi.pipeline.template.editorOnly": "Templates can be accessed only with the empty Editor to prevent potential data loss.", + "rdi.pipeline.template.insertAria": "Insert template", + "rdi.pipeline.template.insertButton": "Insert template", + "rdi.pipeline.template.noTemplateLabel": "No template", + "rdi.pipeline.template.noneAvailableLine1": "No template is available.", + "rdi.pipeline.template.noneAvailableLine2": "Close the form and try again.", + "rdi.pipeline.template.pipelineType": "Pipeline type", + "rdi.pipeline.template.title": "Select a template", + "rdi.pipeline.testConn.closeAria": "close test connections panel", + "rdi.pipeline.testConn.colEndpoint": "Endpoint", + "rdi.pipeline.testConn.colResults": "Results", + "rdi.pipeline.testConn.loading": "Loading results...", + "rdi.pipeline.testConn.noResults": "No results found. Please try again.", + "rdi.pipeline.testConn.source": "Source connections", + "rdi.pipeline.testConn.successful": "Successful", + "rdi.pipeline.testConn.target": "Target connections", + "rdi.pipeline.testConn.title": "Test connection", + "rdi.pipeline.upload.errorNoConfig": "config.yaml is missing", + "rdi.pipeline.upload.errorNoJobs": "No jobs folder found", + "rdi.pipeline.upload.errorZip": "There was a problem with the .zip file", + "rdi.pipeline.upload.resultFail": "Failed to upload pipeline", + "rdi.pipeline.upload.resultSuccess": "Pipeline has been uploaded", + "rdi.pipeline.upload.submitButton": "Upload", + "rdi.pipeline.upload.submitResults": "A new pipeline has been successfully uploaded.", + "rdi.pipeline.upload.titleArchive": "Upload an archive with an RDI pipeline", + "rdi.pipeline.upload.titleNew": "Upload a new pipeline", + "rdi.pipeline.upload.warning": "If a new pipeline is uploaded, existing pipeline configuration and transformation jobs will be overwritten. Changes will not be applied until the pipeline is deployed.", + "rdi.statistics.empty.addButton": "Add Pipeline", + "rdi.statistics.empty.description": "Create your first pipeline to get started!", + "rdi.statistics.empty.title": "No pipeline deployed yet", + "rdi.statistics.error": "Unexpected error in your RDI endpoint, please refresh the page", + "rdi.statistics.pageTitle": "{{name}} - Pipeline Status", + "redisStack.title": "Redis Stack", "settings.advanced.keysToScan.label": "Keys to Scan:", "settings.advanced.keysToScan.summary": "Sets the amount of keys to scan per one iteration. Filtering by pattern per a large number of keys may decrease performance.", "settings.advanced.keysToScan.title": "Keys to Scan in List view", @@ -362,6 +1758,10 @@ "settings.general.theme.option.light": "Light Theme", "settings.general.theme.option.system": "Match System", "settings.general.theme.title": "Color Theme", + "settings.general.updates.label": "Specifies how Redis Insight handles new versions:", + "settings.general.updates.option.auto": "Download and install automatically", + "settings.general.updates.option.notify": "Ask me before downloading", + "settings.general.updates.title": "Updates", "settings.language.label": "Specifies the language used in Redis Insight:", "settings.language.title": "Language", "settings.privacy.description": "To optimize your experience, Redis Insight uses third-party tools.", @@ -377,13 +1777,395 @@ "settings.workbench.pipeline.label": "Commands in pipeline:", "settings.workbench.pipeline.summary": "Sets the size of a command batch for the pipeline mode in Workbench. 0 or 1 pipelines every command.", "settings.workbench.pipeline.title": "Pipeline Mode", + "tips.badge.codeChanges": "Code Changes", + "tips.badge.configurationChanges": "Configuration Changes", + "tips.badge.upgrade": "Upgrade", + "tips.content.RTS.title": "Try using the Redis native time series data structure and querying capabilities", + "tips.content.avoidLogicalDatabases.title": "Avoid using logical databases", + "tips.content.bigAmountOfConnectedClients.title": "Don't open a new connection for every request / every command", + "tips.content.bigHashes.title": "Shard big hashes to small hashes", + "tips.content.bigSets.title": "Consider using probabilistic data structures such as Bloom Filter or HyperLogLog", + "tips.content.bigStrings.title": "Avoid large strings", + "tips.content.combineSmallStringsToHashes.title": "Combine small strings to hashes", + "tips.content.compressHashFieldNames.title": "Compress Hash field names", + "tips.content.compressionForList.title": "Enable compression for the list", + "tips.content.functionsWithKeyspace.title": "Consider using triggers and functions to react in real-time to database changes", + "tips.content.functionsWithStreams.title": "Consider using triggers and functions to react in real-time to stream entries", + "tips.content.hashHashtableToZiplist.title": "Convert hashtable to ziplist for hashes", + "tips.content.increaseSetMaxIntsetEntries.title": "Increase the set-max-intset-entries", + "tips.content.luaScript.title": "Avoid dynamic Lua script", + "tips.content.luaToFunctions.title": "Consider using triggers and functions", + "tips.content.redisSearch.title": "Optimize your query and search experience", + "tips.content.redisVersion.title": "Upgrade your Redis database to version 8 or above", + "tips.content.searchHash.title": "Try indexing your hash documents to query and retrieve data", + "tips.content.searchIndexes.title": "Try using the indexing, querying, and full-text search, natively developed in Redis", + "tips.content.searchJSON.title": "Try indexing your JSON documents for efficient data retrieval", + "tips.content.searchVisualization.title": "Try Workbench, the advanced command-line interface", + "tips.content.setPassword.title": "Set a password", + "tips.content.stringToJson.title": "Try using our JSON native document store", + "tips.content.tryRDI.title": "Sync Redis with live data from another database", + "tips.content.useSmallerKeys.title": "Use smaller key names", + "tips.content.zSetHashtableToZiplist.title": "Convert hashtable to ziplist for sorted sets", + "tips.copyKey.copyAria": "copy key name", + "tips.copyKey.label": "Example of a key that may be relevant:", + "tips.eagerForMoreTips": "Eager for more tips? Run Database Analysis to get started.", + "tips.newTipsInfo": "New tips appear while you work with your database, including how to improve performance and optimize memory usage.", + "tips.panel.checkboxShowHiddenAria": "checkbox show hidden", + "tips.panel.footer": "Run Database Analysis to get more tips", + "tips.panel.githubRepoAria": "redis insight github repository", + "tips.panel.infoTooltip": "Tips will help you improve your database.", + "tips.panel.showHidden": "Show hidden", + "tips.panel.title": "Our Tips", + "tips.recommendation.hide.content": "This tip will be removed from the list and not displayed again.", + "tips.recommendation.hide.title": "Hide tip", + "tips.recommendation.redisStackTooltip": "Redis Stack", + "tips.recommendation.show.content": "This tip will be shown in the list.", + "tips.recommendation.show.title": "Show tip", + "tips.recommendation.snooze.aria": "snooze tip", + "tips.recommendation.snooze.content": "This tip will be removed from the list and displayed again when relevant.", + "tips.recommendation.snooze.title": "Snooze tip", + "tips.recommendation.startTutorial": "Start Tutorial", + "tips.recommendation.toggleHideAria": "hide/unhide tip", + "tips.recommendation.workbench": "Workbench", + "tips.runAnalysis.approveButton": "Analyze", + "tips.runAnalysis.popoverTitle": "Run database analysis", + "tips.runAnalysis.tooltip": "Analyze up to 10 000 keys to get an overview of your data and tips on how to save memory and optimize the usage of your database.", + "tips.runAnalysis.tooltipCluster": "Analyze up to 10 000 keys per shard to get an overview of your data and tips on how to save memory and optimize the usage of your database.", + "tips.unknownFormat": "*Unknown format*", + "tips.voting.closePopoverAria": "close popover", + "tips.voting.disabledTooltip": "Enable Analytics on the Settings page to vote for a tip", + "tips.voting.dislikeFollowUp": "Tell us how we can improve.", + "tips.voting.githubLink": "To Github", + "tips.voting.githubRepoAria": "redis insight github issues", + "tips.voting.likeFollowUp": "Share your ideas with us.", + "tips.voting.notUseful": "Not Useful", + "tips.voting.question": "Is this useful?", + "tips.voting.thanks": "Thank you for the feedback.", + "tips.voting.useful": "Useful", + "tips.voting.voteUsefulAria": "vote useful", + "tips.welcome.analyzeButton": "Analyze Database", + "tips.welcome.connectPrompt": "Eager for tips? Connect to a database to get started.", + "tips.welcome.product": "Tips!", + "tips.welcome.subtitle": "Where we help improve your database.", + "tips.welcome.title": "Welcome to", + "vectorSearch.commandView.copied": "Copied", + "vectorSearch.commandView.copyAria": "Copy command", + "vectorSearch.createIndex.confirmKeyChange.body": "You have modified the index types. Selecting a different key will discard your changes and load fields from the new key.", + "vectorSearch.createIndex.confirmKeyChange.discardAndLoad": "Discard and load", + "vectorSearch.createIndex.confirmKeyChange.keepEditing": "Keep editing", + "vectorSearch.createIndex.confirmKeyChange.title": "Unsaved changes", + "vectorSearch.createIndex.content.emptyState": "The indexing schema will appear here once you\nselect a key from the browser on the left.", + "vectorSearch.createIndex.content.emptyStateManual": "Build your search index by manually adding the fields you want to index.\nYou'll need to provide an index name and a prefix to define which keys are included.", + "vectorSearch.createIndex.createDisabledReason": "Select a key and at least one field to index.", + "vectorSearch.createIndex.createDisabledReasonManual": "Add at least one field to index.", + "vectorSearch.createIndex.displayNameFallback": "existing data", + "vectorSearch.createIndex.footer.cancel": "Cancel", + "vectorSearch.createIndex.footer.createIndex": "Create index", + "vectorSearch.createIndex.footer.skippedFields_one": "Field \"{{name}}\" was removed — nested objects and arrays cannot be indexed directly.", + "vectorSearch.createIndex.footer.skippedFields_other": "{{count}} fields were removed ({{list}}) — nested objects and arrays cannot be indexed directly.", + "vectorSearch.createIndex.header.defineTitle": "Define search index:", + "vectorSearch.createIndex.header.infoTooltip": "Select a key from the left panel to auto-detect the indexing schema.", + "vectorSearch.createIndex.header.sampleTitle": "View sample data index: {{name}}", + "vectorSearch.createIndex.indexName.cancelEditing": "Cancel editing", + "vectorSearch.createIndex.indexName.confirmName": "Confirm index name", + "vectorSearch.createIndex.indexName.editName": "Edit index name", + "vectorSearch.createIndex.toolbar.addField": "+ Add field", + "vectorSearch.createIndex.toolbar.commandView": "Command view", + "vectorSearch.createIndex.toolbar.indexPrefix": "Index prefix:", + "vectorSearch.createIndex.toolbar.keyType": "Key type:", + "vectorSearch.createIndex.toolbar.tableView": "Table view", + "vectorSearch.fallback.getStarted": "Get started for free", + "vectorSearch.fallback.learnMore": "Learn more", + "vectorSearch.fieldType.desc.geo": "Use GEO for geographic coordinates (latitude and longitude).", + "vectorSearch.fieldType.desc.numeric": "Use NUMERIC for storing and querying numbers.", + "vectorSearch.fieldType.desc.tag": "Use TAG for filtering by exact match values.", + "vectorSearch.fieldType.desc.text": "Use TEXT for full-text search and indexing free-form text.", + "vectorSearch.fieldType.desc.vector": "Use VECTOR for semantic search using vector embeddings.", + "vectorSearch.fieldType.list.geo": "Geographic distance and radius queries", + "vectorSearch.fieldType.list.intro": "Defines how Redis searches this field and how it behaves at query time. Available indexing types:", + "vectorSearch.fieldType.list.numeric": "Range queries and sorting", + "vectorSearch.fieldType.list.optionalSettings": "Optional settings may affect performance, storage, or ranking.", + "vectorSearch.fieldType.list.tag": "Exact matching and filtering", + "vectorSearch.fieldType.list.text": "Full-text search and relevance scoring", + "vectorSearch.fieldType.list.vector": "Similarity and semantic search", + "vectorSearch.fieldType.modal.add": "Add", + "vectorSearch.fieldType.modal.addTitle": "Add field", + "vectorSearch.fieldType.modal.cancel": "Cancel", + "vectorSearch.fieldType.modal.changeTypeBody": "You can change the field type for this field. Keep in mind that changing the field type will affect how the field is indexed and queried.", + "vectorSearch.fieldType.modal.editTitle": "Edit field", + "vectorSearch.fieldType.modal.fieldName": "Field name", + "vectorSearch.fieldType.modal.fieldNameLabel": "Field name:", + "vectorSearch.fieldType.modal.fieldNamePlaceholder": "Enter field name", + "vectorSearch.fieldType.modal.fieldSampleValue": "Field sample value:", + "vectorSearch.fieldType.modal.save": "Save", + "vectorSearch.fieldType.phonetic.en": "English (dm:en)", + "vectorSearch.fieldType.phonetic.es": "Spanish (dm:es)", + "vectorSearch.fieldType.phonetic.fr": "French (dm:fr)", + "vectorSearch.fieldType.phonetic.none": "None", + "vectorSearch.fieldType.phonetic.pt": "Portuguese (dm:pt)", + "vectorSearch.fieldType.sectionOptions": "{{type}} options", + "vectorSearch.fieldType.text.phoneticMatcher": "Phonetic matcher", + "vectorSearch.fieldType.text.phoneticMatcherTooltip": "Performs phonetic matching in searches.", + "vectorSearch.fieldType.text.weight": "Weight", + "vectorSearch.fieldType.text.weightTooltip": "Declares the importance of this attribute when calculating result accuracy.", + "vectorSearch.fieldType.validation.candidateLimitRange": "Candidate limit must be between {{min}} and {{max}}.", + "vectorSearch.fieldType.validation.dimensionsRange": "Dimensions must be between {{min}} and {{max}}.", + "vectorSearch.fieldType.validation.dimensionsRequired": "Dimensions value is required.", + "vectorSearch.fieldType.validation.epsilonMin": "Epsilon must be {{min}} or greater.", + "vectorSearch.fieldType.validation.fieldNameDuplicate": "A field with this name already exists.", + "vectorSearch.fieldType.validation.fieldNameRequired": "Field name is required.", + "vectorSearch.fieldType.validation.maxEdgesRange": "Max edges must be between {{min}} and {{max}}.", + "vectorSearch.fieldType.validation.maxNeighborsRange": "Max neighbors must be between {{min}} and {{max}}.", + "vectorSearch.fieldType.validation.weightMin": "Weight must be greater than 0.", + "vectorSearch.fieldType.vector.algorithm": "Algorithm", + "vectorSearch.fieldType.vector.algorithmTooltip": "Use FLAT for small datasets or when exact accuracy matters. Use HNSW for larger datasets or when fast search is important.", + "vectorSearch.fieldType.vector.candidateLimit": "Candidate Limit", + "vectorSearch.fieldType.vector.candidateLimitTooltip": "Max top candidates considered during KNN search. Higher values improve accuracy but increase latency.", + "vectorSearch.fieldType.vector.dimensions": "Dimensions", + "vectorSearch.fieldType.vector.dimensionsTooltip": "Number of dimensions in each vector. Query vectors must match this size.", + "vectorSearch.fieldType.vector.distanceMetric": "Distance metric", + "vectorSearch.fieldType.vector.distanceMetricTooltip": "Distance metric for vector comparison.", + "vectorSearch.fieldType.vector.epsilon": "Epsilon", + "vectorSearch.fieldType.vector.epsilonTooltip": "Relative factor for range query boundaries. Higher values widen the search.", + "vectorSearch.fieldType.vector.maxEdges": "Max Edges", + "vectorSearch.fieldType.vector.maxEdgesTooltip": "Maximum outgoing edges per node. Higher values improve accuracy but increase memory.", + "vectorSearch.fieldType.vector.maxNeighbors": "Max Neighbors", + "vectorSearch.fieldType.vector.maxNeighborsTooltip": "Maximum neighbors considered during graph build. Higher values improve accuracy but slow indexing.", + "vectorSearch.fieldType.vector.vectorType": "Vector type", + "vectorSearch.indexDetails.editFieldAria": "Edit field", + "vectorSearch.indexDetails.editFieldType": "Edit field type", + "vectorSearch.indexDetails.fieldName": "Field name", + "vectorSearch.indexDetails.fieldNameTooltip.description": "Represents a searchable attribute in your data. Only selected fields will be searchable.", + "vectorSearch.indexDetails.fieldNameTooltip.title": "Field name", + "vectorSearch.indexDetails.fieldSampleValue": "Field sample value", + "vectorSearch.indexDetails.fieldTypeTooltip.title": "Indexing type & options", + "vectorSearch.indexDetails.fieldValueTooltip.description": "A sample value from the data to be indexed. Use it to verify the field type and indexing choice.", + "vectorSearch.indexDetails.fieldValueTooltip.title": "Field sample value", + "vectorSearch.indexDetails.indexingType": "Indexing type", + "vectorSearch.indexDetails.suggestedIndexingType": "Suggested indexing type", + "vectorSearch.indexInfo.closePanel": "Close panel", + "vectorSearch.indexInfo.column.attribute": "Attribute", + "vectorSearch.indexInfo.column.identifier": "Identifier", + "vectorSearch.indexInfo.column.type": "Type", + "vectorSearch.indexInfo.column.weight": "Weight", + "vectorSearch.indexInfo.documents": "documents.", + "vectorSearch.indexInfo.documentsPrefixed": "documents prefixed by {{prefixes}}.", + "vectorSearch.indexInfo.indexing": "Indexing", + "vectorSearch.indexInfo.noOptionsFound": "no options found", + "vectorSearch.indexInfo.optionFilter": "filter: {{value}}", + "vectorSearch.indexInfo.optionLanguage": "language: {{value}}", + "vectorSearch.indexInfo.options": "Options: {{options}}", + "vectorSearch.indexInfo.summary": "Number of docs: {{numDocs}} (max {{maxDocId}}) | Number of records: {{numRecords}} | Number of terms: {{numTerms}}", + "vectorSearch.keysBrowser.results": "Results: {{count}} keys", + "vectorSearch.keysBrowser.scanned": "Scanned {{scanned}}/{{total}}", + "vectorSearch.keysBrowser.scanning": "Scanning...", + "vectorSearch.keysBrowser.selectKey": "Select key", + "vectorSearch.keysBrowser.supportedTypesInfo": "Only HASH and JSON key types are supported for index creation.", + "vectorSearch.keysBrowser.total": "Total: {{total}}", + "vectorSearch.list.action.browseDataset": "Browse dataset", + "vectorSearch.list.action.delete": "Delete", + "vectorSearch.list.action.query": "Query", + "vectorSearch.list.action.viewIndex": "View index", + "vectorSearch.list.column.docs": "Docs", + "vectorSearch.list.column.fields": "Fields", + "vectorSearch.list.column.name": "Index name", + "vectorSearch.list.column.prefix": "Index prefix", + "vectorSearch.list.column.records": "Records", + "vectorSearch.list.column.terms": "Terms", + "vectorSearch.list.column.types": "Index types", + "vectorSearch.list.createMenu.checkingKeys": "Checking for existing keys…", + "vectorSearch.list.createMenu.create": "+ Create search index", + "vectorSearch.list.createMenu.existingData": "Use existing data", + "vectorSearch.list.createMenu.noKeys": "No Hash or JSON keys found in your database", + "vectorSearch.list.createMenu.sampleData": "Use sample data", + "vectorSearch.list.delete.cancel": "Keep index", + "vectorSearch.list.delete.confirm": "Delete index", + "vectorSearch.list.delete.message": "Deleting the index will remove it from Search and Vector Search, but will not delete your underlying data.", + "vectorSearch.list.delete.question": "Are you sure you want to delete this index?", + "vectorSearch.list.delete.title": "Delete Index", + "vectorSearch.list.empty.loading": "Loading...", + "vectorSearch.list.empty.noIndexes": "No indexes found", + "vectorSearch.list.empty.noResults": "No results found", + "vectorSearch.list.header.description": "A search index organizes your data to enable fast Vector, full-text, hybrid, and numeric searches in Redis.", + "vectorSearch.list.header.learnMore": "Learn more", + "vectorSearch.list.header.title": "Search indexes", + "vectorSearch.list.search.placeholder": "Search index", + "vectorSearch.list.tooltip.docs": "Number of documents currently indexed.", + "vectorSearch.list.tooltip.fields": "Total number of fields defined in the index schema.", + "vectorSearch.list.tooltip.prefix": "Keys matching this prefix are automatically indexed.", + "vectorSearch.list.tooltip.records": "Total indexed field-value pairs across all documents. One document with 5 fields = 5 records.", + "vectorSearch.list.tooltip.terms": "Unique words extracted from TEXT fields for full-text search.", + "vectorSearch.noResults.imageAlt": "No search results", + "vectorSearch.noResults.text": "Your query results will appear here once you run a query.", + "vectorSearch.notAvailable.ctaText": "Use your free trial all-in-one Redis Cloud database to start exploring these capabilities", + "vectorSearch.notAvailable.description": "These features enable multi-field queries, aggregation, exact phrase matching, numeric filtering, geo filtering and vector similarity semantic search on top of text queries.", + "vectorSearch.notAvailable.feature.fullTextSearch": "Full-text search", + "vectorSearch.notAvailable.feature.query": "Query", + "vectorSearch.notAvailable.feature.secondaryIndex": "Secondary index", + "vectorSearch.notAvailable.subtitle": "Redis Search allows to:", + "vectorSearch.notAvailable.title": "Redis Search is not available for this database", + "vectorSearch.onboarding.back": "Back", + "vectorSearch.onboarding.close": "Close", + "vectorSearch.onboarding.commandView.body": "This is the FT.CREATE command Redis will run. Once executed, your data becomes searchable.", + "vectorSearch.onboarding.commandView.title": "Create index command", + "vectorSearch.onboarding.defineIndex.body1": "An index defines how Redis searches and queries your data. The schema controls which fields are indexed, their types, and other configuration options.", + "vectorSearch.onboarding.defineIndex.body2": "Review the suggested index name. You’ll use it when building queries.", + "vectorSearch.onboarding.defineIndex.body3": "Tip: Index only fields you plan to search or filter on.", + "vectorSearch.onboarding.defineIndex.title": "Review and adjust the indexing schema", + "vectorSearch.onboarding.fieldName.body": "Represents a searchable attribute in your data. Only selected fields will be searchable.", + "vectorSearch.onboarding.fieldName.title": "Field name", + "vectorSearch.onboarding.gotIt": "Got it", + "vectorSearch.onboarding.indexPrefix.body1": "Controls which keys are included in the index. All keys starting with this prefix will be indexed.", + "vectorSearch.onboarding.indexPrefix.body2": "Example: bike: will index bike:1, bike:road:3.", + "vectorSearch.onboarding.indexPrefix.title": "Index prefix", + "vectorSearch.onboarding.indexingType.title": "Indexing type & options", + "vectorSearch.onboarding.next": "Next", + "vectorSearch.onboarding.sampleValue.body": "A sample value from the data to be indexed. Use it to verify the field type and indexing choice.", + "vectorSearch.onboarding.sampleValue.title": "Sample value", + "vectorSearch.onboarding.skipTour": "Skip tour", + "vectorSearch.onboarding.stepCounter": "{{current}}/{{total}}", + "vectorSearch.query.breadcrumb.ariaLabel": "Breadcrumb", + "vectorSearch.query.breadcrumb.indexes": "Indexes", + "vectorSearch.query.editor.action.explain": "Explain", + "vectorSearch.query.editor.action.explainAria": "Explain command", + "vectorSearch.query.editor.action.profile": "Profile", + "vectorSearch.query.editor.action.profileAria": "Profile command", + "vectorSearch.query.editor.action.save": "Save", + "vectorSearch.query.editor.action.saveAria": "Save query", + "vectorSearch.query.editor.onboarding.detail.ftAggregate": "Group and summarize results", + "vectorSearch.query.editor.onboarding.detail.ftExplain": "See execution plan", + "vectorSearch.query.editor.onboarding.detail.ftList": "View index schema and stats", + "vectorSearch.query.editor.onboarding.detail.ftProfile": "Analyze performance", + "vectorSearch.query.editor.onboarding.detail.ftSearch": "Find documents by text or filters", + "vectorSearch.query.editor.onboarding.detail.ftSpellcheck": "Suggest corrections for typos", + "vectorSearch.query.editor.onboarding.detail.ftSugget": "Retrieve autocomplete suggestions", + "vectorSearch.query.editor.onboarding.documentation": "Documentation", + "vectorSearch.query.editor.placeholder": "Start typing FT. to access search commands or switch to Query Library to access saved commands.", + "vectorSearch.query.editor.tab.editor": "Query editor", + "vectorSearch.query.editor.tab.library": "Query library", + "vectorSearch.query.editor.tooltip.disabledLoading": "Disabled: query is running.", + "vectorSearch.query.editor.tooltip.disabledNoQuery": "Disabled: no query identified.", + "vectorSearch.query.editor.tooltip.explain": "Shows how your query will run (execution plan) to understand what's used.", + "vectorSearch.query.editor.tooltip.profile": "Profiles your query to show where time is spent and spot bottlenecks.", + "vectorSearch.query.error.executeCommand": "Failed to execute command", + "vectorSearch.query.error.loadCommandDetails": "Failed to load command details", + "vectorSearch.query.groupCommandLabel_one": "{{count}} - Command", + "vectorSearch.query.groupCommandLabel_other": "{{count}} - Commands", + "vectorSearch.query.onboarding.description": "Build queries in the Query Editor or save them for later in the Query Library.", + "vectorSearch.query.onboarding.dismiss": "Got it", + "vectorSearch.query.onboarding.editorDescription": "write search queries directly using Redis commands.", + "vectorSearch.query.onboarding.editorTitle": "Query editor", + "vectorSearch.query.onboarding.libraryDescription": "reuse saved queries or use prebuilt examples for the sample data.", + "vectorSearch.query.onboarding.libraryTitle": "Query library", + "vectorSearch.query.onboarding.title": "Start exploring your data", + "vectorSearch.query.viewIndexButton": "View index", + "vectorSearch.queryLibrary.badge.sample": "Sample query", + "vectorSearch.queryLibrary.badge.saved": "Saved query", + "vectorSearch.queryLibrary.delete.cancel": "Keep query", + "vectorSearch.queryLibrary.delete.confirm": "Delete query", + "vectorSearch.queryLibrary.delete.message": "This action will remove the saved query, but won't affect your index or data.", + "vectorSearch.queryLibrary.delete.question": "Are you sure you want to delete this query?", + "vectorSearch.queryLibrary.delete.title": "Delete query", + "vectorSearch.queryLibrary.empty.noMatch": "No queries match your search", + "vectorSearch.queryLibrary.empty.noQueries": "No saved queries yet. Create your query in editor and click Save to add it here.", + "vectorSearch.queryLibrary.error.load": "Failed to load query library", + "vectorSearch.queryLibrary.item.copyNameAria": "Copy query name", + "vectorSearch.queryLibrary.item.deleteAria": "Delete query", + "vectorSearch.queryLibrary.item.load": "Load", + "vectorSearch.queryLibrary.item.loadAria": "Load query", + "vectorSearch.queryLibrary.item.run": "Run", + "vectorSearch.queryLibrary.item.runAria": "Run query", + "vectorSearch.queryLibrary.save.cancel": "Cancel", + "vectorSearch.queryLibrary.save.confirm": "Save query", + "vectorSearch.queryLibrary.save.description": "Name your query to add it to your saved queries list for quick reuse.", + "vectorSearch.queryLibrary.save.placeholder": "Enter command name", + "vectorSearch.queryLibrary.save.title": "Save query", + "vectorSearch.queryLibrary.searchPlaceholder": "Search query", + "vectorSearch.sampleData.bikes.displayName": "E-commerce discovery", + "vectorSearch.sampleData.bikes.query1.description": "Performs a simple K-nearest neighbors (KNN) vector search to find the 3 bikes most semantically similar to \"Comfortable commuter bike.\" Returns the similarity score along with brand, type, and description fields.", + "vectorSearch.sampleData.bikes.query1.name": "Basic semantic search", + "vectorSearch.sampleData.bikes.query2.description": "Searches for bikes matching the natural language query \"Commuter bike for people over 60.\" Demonstrates how vector search can understand intent and context beyond keyword matching, finding bikes suited for older riders prioritizing comfort and ease of use.", + "vectorSearch.sampleData.bikes.query2.name": "Age-targeted semantic search", + "vectorSearch.sampleData.bikes.query3.description": "Finds mountain bikes semantically similar to \"Female specific mountain bike.\" Shows how embeddings can capture product attributes like gender-specific geometry, sizing, and design features without requiring exact keyword matches.", + "vectorSearch.sampleData.bikes.query3.name": "Gender-specific product search", + "vectorSearch.sampleData.bikes.query4.description": "Combines semantic vector search with traditional attribute filtering. Searches for \"Female specific mountain bike\" but restricts results to bikes of type \"Mountain Bikes\" with prices between $3,000–$3,500. Demonstrates pre-filtering before KNN to narrow the candidate set.", + "vectorSearch.sampleData.bikes.query4.name": "Hybrid search (vector + filters)", + "vectorSearch.sampleData.cancel": "Cancel", + "vectorSearch.sampleData.content.description": "Discover content by theme or plot.", + "vectorSearch.sampleData.content.label": "Content recommendations", + "vectorSearch.sampleData.ecommerce.description": "Discover products that match intent, not just text", + "vectorSearch.sampleData.ecommerce.label": "E-commerce Discovery", + "vectorSearch.sampleData.movies.displayName": "Content recommendations", + "vectorSearch.sampleData.movies.query1.description": "Performs a K-nearest neighbors search to find movies with plot embeddings most similar to the query vector. Returns the top 3 matches with title, plot, and similarity score. Demonstrates pure semantic search—Toy Story ranks first based on meaning, not keyword matches.", + "vectorSearch.sampleData.movies.query1.name": "Basic plot similarity search", + "vectorSearch.sampleData.movies.query2.description": "Combines a genre tag filter with vector similarity to find music-related movies matching \"A feel-good film about music and students.\" Pre-filters to the Music genre before running KNN, showing how hybrid search improves relevance by narrowing candidates.", + "vectorSearch.sampleData.movies.query2.name": "Genre-filtered semantic search", + "vectorSearch.sampleData.movies.query3.description": "Extracts the stored embedding vector from an existing movie document (Inception). This vector can then be used as input for a \"more like this\" recommendation query, enabling content-based recommendations without regenerating embeddings.", + "vectorSearch.sampleData.movies.query3.name": "Retrieve document embedding", + "vectorSearch.sampleData.movies.query4.description": "Combines multiple metadata filters (genre: Music, year: 1970–1979) with vector similarity search. Finds classic 70s music films matching the query's semantic intent, showing how numeric ranges and tag filters work seamlessly with KNN.", + "vectorSearch.sampleData.movies.query4.name": "Multi-filter hybrid search", + "vectorSearch.sampleData.movies.query5.description": "Filters results to user-preferred genres (Animated OR Sci-Fi) before running vector similarity. Demonstrates personalization—narrowing recommendations to categories the user enjoys while still ranking by semantic relevance.", + "vectorSearch.sampleData.movies.query5.name": "Personalized multi-genre search", + "vectorSearch.sampleData.seeIndexDefinition": "See index definition", + "vectorSearch.sampleData.startQuerying": "Start querying", + "vectorSearch.sampleData.subtitle1": "Select a sample dataset.", + "vectorSearch.sampleData.subtitle2": "We'll load the data and generate the index needed for search.", + "vectorSearch.sampleData.title": "Getting your sample data ready for Search", + "vectorSearch.selectKeyOnboarding.body1": "We'll use the selected key to generate a suggested indexing schema. Redis will index all keys with the same prefix, not just this single key.", + "vectorSearch.selectKeyOnboarding.body2": "Indexing available for Hash and JSON data structures.", + "vectorSearch.selectKeyOnboarding.close": "Close", + "vectorSearch.selectKeyOnboarding.gotIt": "Got it", + "vectorSearch.selectKeyOnboarding.title": "Select a key to get started", + "vectorSearch.upgradeBanner.cta": "Free Redis Cloud DB", + "vectorSearch.upgradeBanner.message": "Upgrade to Redis 7.2+ to unlock fast, real-time semantic AI search with vector search", + "vectorSearch.versionNotSupported.ctaText": "Create a free Redis Cloud database to start exploring these capabilities.", + "vectorSearch.versionNotSupported.description": "This page requires Redis Search 2.0 or later (included with Redis 6+). Older versions of Redis Search are not compatible with the commands used here.", + "vectorSearch.versionNotSupported.title": "Redis Search 2.0+ required", + "vectorSearch.welcome.checkingKeys": "Checking for existing keys…", + "vectorSearch.welcome.feature.fullText.description": "Find and filter your data instantly using powerful keyword and field-based queries.", + "vectorSearch.welcome.feature.fullText.title": "Full-text search", + "vectorSearch.welcome.feature.hybrid.description": "Combine vector and keyword search for higher accuracy and more relevant results.", + "vectorSearch.welcome.feature.hybrid.title": "Hybrid search", + "vectorSearch.welcome.feature.performance.description": "Built-in quantization and compression deliver blazing speed and efficiency at any scale.", + "vectorSearch.welcome.feature.performance.title": "High performance, low effort", + "vectorSearch.welcome.feature.vector.description": "Retrieve results by meaning, not just words. Ideal for AI, semantic, and recommendation apps.", + "vectorSearch.welcome.feature.vector.title": "Vector search", + "vectorSearch.welcome.noKeysFound": "No Hash or JSON keys found in your database", + "vectorSearch.welcome.subtitle": "Discover how Redis enables full-text and vector search. Fast, simple, and production-ready.", + "vectorSearch.welcome.title": "Search your data at in-memory speed", + "vectorSearch.welcome.trySampleData": "Try with sample data", + "vectorSearch.welcome.useMyDatabase": "Create index", + "vectorSearch.welcome.useMyDatabaseLegacy": "Use data from my database", "whatsNew.button.gotIt": "Got it", "whatsNew.card.comingSoon": "Coming soon", "whatsNew.card.locationLabel": "Where to find it:", + "whatsNew.card.tooltip": "The feature is rolled out gradually.", "whatsNew.menuItem": "What's new?", "whatsNew.releaseDate": "Released {{date}}", "whatsNew.releaseNotes.link": "See full release notes for {{version}}", "whatsNew.title": "What's New", "whatsNew.version.option": "v{{version}}", - "whatsNew.version.optionLatest": "v{{version}} (Latest)" + "whatsNew.version.optionLatest": "v{{version}} (Latest)", + "workbench.noResults.button.explore": "Explore", + "workbench.noResults.cliSubtitle": "for Redis commands.", + "workbench.noResults.cliTitle": "This is our advanced CLI", + "workbench.noResults.hint": "Or click the icon in the top right corner.", + "workbench.noResults.imageAlt": "no results", + "workbench.noResults.summary": "Try Workbench with our interactive Tutorials to learn how Redis can solve your use cases.", + "workbench.noResults.title": "No results to display yet", + "workbench.pageTitle": "{{name}} {{db}} - Workbench", + "workbench.results.clear": "Clear Results", + "workbench.runConfirm.body_one": "You're about to run {{commands}} on {{db}}. This command is part of the list of dangerous commands. This operation may affect server stability.", + "workbench.runConfirm.body_other": "You're about to run {{commands}} on {{db}}. These commands are part of the list of dangerous commands. This operation may affect server stability.", + "workbench.runConfirm.button.run": "Run command", + "workbench.runConfirm.title": "Proceed with caution in production", + "workbench.suggestions.noIndexes.detail": "Create an index", + "workbench.suggestions.noIndexes.documentation": "See the [documentation]({{link}}) for detailed instructions on how to create an index.", + "workbench.suggestions.noIndexes.label": "No indexes to display", + "workbench.tutorials.basicUseCases": "Basic use cases", + "workbench.tutorials.introToSearch": "Intro to search", + "workbench.tutorials.introToVectorSearch": "Intro to vector search", + "workbench.viewType.explain": "Explain the command", + "workbench.viewType.profile": "Profile the command", + "workbench.viewType.text": "Text" } diff --git a/redisinsight/ui/src/mocks/factories/agent-memory/AgentMemoryEndpoint.factory.ts b/redisinsight/ui/src/mocks/factories/agent-memory/AgentMemoryEndpoint.factory.ts new file mode 100644 index 0000000000..7544d7ea46 --- /dev/null +++ b/redisinsight/ui/src/mocks/factories/agent-memory/AgentMemoryEndpoint.factory.ts @@ -0,0 +1,16 @@ +import { faker } from '@faker-js/faker' +import { Factory } from 'fishery' + +import { + AgentMemoryBackendType, + AgentMemoryEndpoint, +} from 'uiSrc/slices/interfaces/agentMemory' + +export const AgentMemoryEndpointFactory = Factory.define( + () => ({ + id: faker.string.uuid(), + name: faker.lorem.words(2), + url: faker.internet.url(), + backendType: AgentMemoryBackendType.Oss, + }), +) diff --git a/redisinsight/ui/src/mocks/factories/browser/vectorSet/vectorSetElement.factory.ts b/redisinsight/ui/src/mocks/factories/browser/vectorSet/vectorSetElement.factory.ts index e34478dee3..c364d641d5 100644 --- a/redisinsight/ui/src/mocks/factories/browser/vectorSet/vectorSetElement.factory.ts +++ b/redisinsight/ui/src/mocks/factories/browser/vectorSet/vectorSetElement.factory.ts @@ -21,8 +21,14 @@ export const mockVectorSetKeyInfo = { export const mockVectorSetElementAttributes = (): string => JSON.stringify({ [faker.word.noun()]: faker.word.adjective() }) -const buildBaseElement = (): Omit => ({ - name: stringToBuffer(faker.word.words({ count: { min: 1, max: 3 } })), +const buildBaseElement = ( + sequence: number, +): Omit => ({ + // suffix with the factory sequence so a buildList never repeats a name; + // faker.word.words alone can collide and break name-matched reducers + name: stringToBuffer( + `${faker.word.words({ count: { min: 1, max: 3 } })} ${sequence}`, + ), vector: faker.helpers.arrayElements( Array.from({ length: 128 }, () => faker.number.float({ min: -1, max: 1, fractionDigits: 6 }), @@ -31,13 +37,15 @@ const buildBaseElement = (): Omit => ({ ), }) -export const vectorSetElementFactory = Factory.define(() => ({ - ...buildBaseElement(), -})) +export const vectorSetElementFactory = Factory.define( + ({ sequence }) => ({ + ...buildBaseElement(sequence), + }), +) export const vectorSetElementWithAttributesFactory = - Factory.define(() => ({ - ...buildBaseElement(), + Factory.define(({ sequence }) => ({ + ...buildBaseElement(sequence), attributes: mockVectorSetElementAttributes(), })) diff --git a/redisinsight/ui/src/mocks/factories/cloud/AzureAccount.factory.ts b/redisinsight/ui/src/mocks/factories/cloud/AzureAccount.factory.ts index 9b10aa8993..37a3f1d263 100644 --- a/redisinsight/ui/src/mocks/factories/cloud/AzureAccount.factory.ts +++ b/redisinsight/ui/src/mocks/factories/cloud/AzureAccount.factory.ts @@ -6,4 +6,5 @@ export const AzureAccountFactory = Factory.define(() => ({ id: faker.string.uuid(), username: faker.internet.email(), name: faker.person.fullName(), + tenantId: faker.string.uuid(), })) diff --git a/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts b/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts index 07bc662f68..1dcd9676f0 100644 --- a/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts @@ -12,10 +12,6 @@ export const FEATURES_DATA_MOCK = { name: 'envDependent', flag: true, }, - whatsNew: { - name: 'whatsNew', - flag: true, - }, cloudSso: { name: 'cloudSso', flag: true, diff --git a/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts b/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts index 93f61027d9..3809602592 100644 --- a/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts @@ -77,6 +77,10 @@ export const getDatabasesApiSpy = jest HttpResponse.json(INSTANCES_MOCK, { status: 200 }), ) +export const connectDatabaseApiSpy = jest + .fn() + .mockImplementation(async () => HttpResponse.text('', { status: 200 })) + const handlers: HttpHandler[] = [ // fetchInstancesAction http.get(getMswURL(ApiEndpoints.DATABASES), getDatabasesApiSpy), @@ -93,9 +97,10 @@ const handlers: HttpHandler[] = [ return HttpResponse.json(MOCK_INFO_API_RESPONSE, { status: 200 }) }, ), - http.get(getMswURL(`${ApiEndpoints.DATABASES}/:id/connect`), async () => { - return HttpResponse.text('', { status: 200 }) - }), + http.get( + getMswURL(`${ApiEndpoints.DATABASES}/:id/connect`), + connectDatabaseApiSpy, + ), http.post< any, { diff --git a/redisinsight/ui/src/packages/.npmrc b/redisinsight/ui/src/packages/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/clients-list/.npmrc b/redisinsight/ui/src/packages/clients-list/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/clients-list/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/clients-list/README.md b/redisinsight/ui/src/packages/clients-list/README.md index 9af06bb85e..1a1bfdf093 100644 --- a/redisinsight/ui/src/packages/clients-list/README.md +++ b/redisinsight/ui/src/packages/clients-list/README.md @@ -8,8 +8,8 @@ The plugin has been created using React, TypeScript, and [Elastic UI](https://el The following commands will install dependencies and start the server to run the plugin locally: ``` -yarn -yarn start +npm install +npm start ``` These commands will install dependencies and start the server. @@ -22,11 +22,11 @@ This command will generate the `vendor` folder with styles and fonts of the core inside the folder for your plugin and include appropriate styles to the `index.html` file. ``` -yarn -yarn --cwd redisinsight/api/ install +npm install +npm install --prefix redisinsight/api -yarn build:statics - for Linux or MacOs -yarn build:statics:win - for Windows +npm run build:statics - for Linux or MacOs +npm run build:statics:win - for Windows ``` ## Build plugin @@ -34,8 +34,8 @@ yarn build:statics:win - for Windows The following commands will build plugins to be used in Redis Insight: ``` -yarn -yarn build +npm install +npm run build ``` [Add](https://github.com/RedisInsight/RedisInsight/blob/main/docs/plugins/installation.md) the package.json file and the diff --git a/redisinsight/ui/src/packages/clients-list/package-lock.json b/redisinsight/ui/src/packages/clients-list/package-lock.json new file mode 100644 index 0000000000..f416f037ad --- /dev/null +++ b/redisinsight/ui/src/packages/clients-list/package-lock.json @@ -0,0 +1,2020 @@ +{ + "name": "client-list", + "version": "0.0.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client-list", + "version": "0.0.3", + "dependencies": { + "@elastic/datemath": "^5.0.3", + "@elastic/eui": "34.6.0", + "buffer": "^6.0.3", + "classnames": "^2.3.1", + "json-bigint": "^1.0.0", + "lodash": "^4.18.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "redisinsight-plugin-sdk": "^1.1.0" + }, + "devDependencies": { + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elastic/datemath": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@elastic/datemath/-/datemath-5.0.3.tgz", + "integrity": "sha512-8Hbr1Uyjm5OcYBfEB60K7sCP6U3IXuWDaLaQmYv3UxgI4jqBWbakoemwWvsqPVUvnwEjuX6z7ghPZbefs8xiaA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.3" + }, + "peerDependencies": { + "moment": "^2.24.0" + } + }, + "node_modules/@elastic/datemath/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.npmjs.org/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "license": "MIT" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "license": "MIT", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.8.0.tgz", + "integrity": "sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.9.2", + "react-remove-scroll": "^2.5.5", + "react-style-singleton": "^2.2.0", + "tslib": "^2.3.1", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/redisinsight-plugin-sdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz", + "integrity": "sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA==", + "license": "MIT" + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "license": "MIT", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==", + "license": "MIT" + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==", + "license": "Apache-2.0" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/trim": { + "version": "0.0.3" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "license": "0BSD" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/redisinsight/ui/src/packages/clients-list/package.json b/redisinsight/ui/src/packages/clients-list/package.json index bc8275f8a0..766d8e3f95 100644 --- a/redisinsight/ui/src/packages/clients-list/package.json +++ b/redisinsight/ui/src/packages/clients-list/package.json @@ -68,9 +68,9 @@ "react-dom": "^17.0.2", "redisinsight-plugin-sdk": "^1.1.0" }, - "resolutions": { + "overrides": { "trim": "0.0.3", - "@elastic/eui/**/prismjs": "~1.30.0", - "**/semver": "^7.5.2" + "@elastic/eui": { "prismjs": "~1.30.0" }, + "semver": "^7.5.2" } } diff --git a/redisinsight/ui/src/packages/clients-list/yarn.lock b/redisinsight/ui/src/packages/clients-list/yarn.lock deleted file mode 100644 index 6326c04e2a..0000000000 --- a/redisinsight/ui/src/packages/clients-list/yarn.lock +++ /dev/null @@ -1,1510 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.15.4", "@babel/runtime@^7.9.2": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@elastic/datemath@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@elastic/datemath/-/datemath-5.0.3.tgz#7baccdab672b9a3ecb7fe8387580670936b58573" - integrity sha512-8Hbr1Uyjm5OcYBfEB60K7sCP6U3IXuWDaLaQmYv3UxgI4jqBWbakoemwWvsqPVUvnwEjuX6z7ghPZbefs8xiaA== - dependencies: - tslib "^1.9.3" - -"@elastic/eui@34.6.0": - version "34.6.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz#a7188bc97d9c3120cd65e52ed423377872b604bd" - integrity sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw== - dependencies: - "@types/chroma-js" "^2.0.0" - "@types/lodash" "^4.14.160" - "@types/numeral" "^0.0.28" - "@types/react-beautiful-dnd" "^13.0.0" - "@types/react-input-autosize" "^2.2.0" - "@types/react-virtualized-auto-sizer" "^1.0.0" - "@types/react-window" "^1.8.2" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" - "@types/vfile-message" "^2.0.0" - chroma-js "^2.1.0" - classnames "^2.2.6" - lodash "^4.17.21" - mdast-util-to-hast "^10.0.0" - numeral "^2.0.6" - prop-types "^15.6.0" - react-ace "^7.0.5" - react-beautiful-dnd "^13.0.0" - react-dropzone "^11.2.0" - react-focus-on "^3.5.0" - react-input-autosize "^2.2.2" - react-is "~16.3.0" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - refractor "^3.4.0" - rehype-raw "^5.0.0" - rehype-react "^6.0.0" - rehype-stringify "^8.0.0" - remark-emoji "^2.1.0" - remark-parse "^8.0.3" - remark-rehype "^8.0.0" - tabbable "^3.0.0" - text-diff "^1.0.1" - unified "^9.2.0" - unist-util-visit "^2.0.3" - url-parse "^1.5.0" - uuid "^8.3.0" - vfile "^4.2.0" - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@types/chroma-js@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" - integrity sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw== - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/lodash@^4.14.160": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prismjs@*": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" - integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-beautiful-dnd@^13.0.0": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz#bcec72da719c18c0d8b4a7cb00e7fb443211d6d7" - integrity sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA== - dependencies: - "@types/react" "*" - -"@types/react-input-autosize@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz#6a335212e7fce1e1a4da56ae2095c8c5c35fbfe6" - integrity sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-virtualized-auto-sizer@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" - integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== - dependencies: - "@types/react" "*" - -"@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/refractor@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== - dependencies: - "@types/prismjs" "*" - -"@types/resize-observer-browser@^0.1.5": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -aria-hidden@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chroma-js@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" - integrity sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -diff-match-patch@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-selector@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz#59ec4f27aa5baf0841e9c6385c8386bef4d18b17" - integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg== - dependencies: - tslib "^2.0.3" - -focus-lock@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" - integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== - dependencies: - tslib "^2.0.3" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-is-element@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" - integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-html@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" - integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== - dependencies: - ccount "^1.0.0" - comma-separated-tokens "^1.0.0" - hast-util-is-element "^1.0.0" - hast-util-whitespace "^1.0.0" - html-void-elements "^1.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - stringify-entities "^3.0.1" - unist-util-is "^4.0.0" - xtend "^4.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-whitespace@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" - integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inherits@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash@^4.17.21, lodash@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prismjs@~1.27.0, prismjs@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -react-ace@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz#798299fd52ddf3a3dcc92afc5865538463544f01" - integrity sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg== - dependencies: - brace "^0.11.1" - diff-match-patch "^1.0.4" - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - -react-beautiful-dnd@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" - integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - dependencies: - "@babel/runtime" "^7.12.13" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-dropzone@^11.2.0: - version "11.7.1" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" - integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ== - dependencies: - attr-accept "^2.2.2" - file-selector "^0.4.0" - prop-types "^15.8.1" - -react-focus-lock@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.11.6" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-focus-on@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.8.0.tgz#71ba2707a21f67ffa41b71775b1093b2a1c408ee" - integrity sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw== - dependencies: - aria-hidden "^1.2.2" - react-focus-lock "^2.9.2" - react-remove-scroll "^2.5.5" - react-style-singleton "^2.2.0" - tslib "^2.3.1" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@~16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-redux@^7.2.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.0, react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.15" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz#84558bcab61a625d13ec37876639bb09c5a3ec0b" - integrity sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg== - -react-window@^1.8.5: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -redisinsight-plugin-sdk@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz#5ac39dc5398b1f73f2357e67ce51e1875fbece4f" - integrity sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA== - -redux@^4.0.0, redux@^4.0.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -refractor@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -rehype-raw@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -rehype-react@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" - integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - hast-to-hyperscript "^9.0.0" - -rehype-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" - integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== - dependencies: - hast-util-to-html "^7.1.1" - -remark-emoji@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-parse@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -stringify-entities@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" - integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - xtend "^4.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -tabbable@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2" - integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ== - -text-diff@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz#6c105905435e337857375c9d2f6ca63e453ff565" - integrity sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA== - -tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" - integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -url-parse@^1.5.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-memo-one@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" - integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@*: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0, vfile@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -"vite@file:../node_modules/vite": - version "6.3.4" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/redisinsight/ui/src/packages/geodata/.npmrc b/redisinsight/ui/src/packages/geodata/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/geodata/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/geodata/README.md b/redisinsight/ui/src/packages/geodata/README.md index d757801c4f..39fc526ff1 100644 --- a/redisinsight/ui/src/packages/geodata/README.md +++ b/redisinsight/ui/src/packages/geodata/README.md @@ -21,7 +21,7 @@ For an official upstream PR, maintainers may still require the default tile prov ## Development ```sh -yarn --cwd redisinsight/ui/src/packages/geodata -yarn --cwd redisinsight/ui/src/packages/geodata test -yarn --cwd redisinsight/ui/src/packages build +npm install --prefix redisinsight/ui/src/packages/geodata +npm test --prefix redisinsight/ui/src/packages/geodata +npm run build --prefix redisinsight/ui/src/packages ``` diff --git a/redisinsight/ui/src/packages/geodata/package-lock.json b/redisinsight/ui/src/packages/geodata/package-lock.json new file mode 100644 index 0000000000..f11a83bfcb --- /dev/null +++ b/redisinsight/ui/src/packages/geodata/package-lock.json @@ -0,0 +1,259 @@ +{ + "name": "geodata", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "geodata", + "version": "0.0.1", + "dependencies": { + "leaflet": "^1.9.4", + "leaflet.heat": "^0.2.0", + "leaflet.markercluster": "^1.5.3", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/leaflet": "^1.9.3", + "@types/leaflet.markercluster": "^1.5.6", + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/leaflet.markercluster": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.6.tgz", + "integrity": "sha512-I7hZjO2+isVXGYWzKxBp8PsCzAYCJBc29qBdFpquOCkS7zFDqUsUvkEOyQHedsk/Cy5tocQzf+Ndorm5W9YKTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/leaflet": "^1.9" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/leaflet.heat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/leaflet.heat/-/leaflet.heat-0.2.0.tgz", + "integrity": "sha512-Cd5PbAA/rX3X3XKxfDoUGi9qp78FyhWYurFg3nsfhntcM/MCNK08pRkf4iEenO1KNqwVPKCmkyktjW3UD+h9bQ==" + }, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "license": "MIT", + "peerDependencies": { + "leaflet": "^1.3.1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + } + } +} diff --git a/redisinsight/ui/src/packages/geodata/package.json b/redisinsight/ui/src/packages/geodata/package.json index 7f3153bf39..ea6c073058 100644 --- a/redisinsight/ui/src/packages/geodata/package.json +++ b/redisinsight/ui/src/packages/geodata/package.json @@ -136,7 +136,7 @@ }, "iconDark": "./dist/geodata_icon_dark.svg", "iconLight": "./dist/geodata_icon_light.svg", - "description": "Show Redis Query Engine GEO results as plotted locations", + "description": "Show Redis Search GEO results as plotted locations", "default": false }, { @@ -156,7 +156,7 @@ }, "iconDark": "./dist/geodata_heatmap_icon_dark.svg", "iconLight": "./dist/geodata_heatmap_icon_light.svg", - "description": "Show Redis Query Engine GEO result density", + "description": "Show Redis Search GEO result density", "default": false }, { @@ -177,7 +177,7 @@ }, "iconDark": "./dist/geodata_inspector_icon_dark.svg", "iconLight": "./dist/geodata_inspector_icon_light.svg", - "description": "Inspect Redis Query Engine geospatial command inputs and results", + "description": "Inspect Redis Search geospatial command inputs and results", "default": false }, { @@ -196,7 +196,7 @@ }, "iconDark": "./dist/geodata_inspector_icon_dark.svg", "iconLight": "./dist/geodata_inspector_icon_light.svg", - "description": "Show Redis Query Engine GEOSHAPE WKT results", + "description": "Show Redis Search GEOSHAPE WKT results", "default": false } ], @@ -212,7 +212,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0" }, - "resolutions": { - "**/semver": "^7.5.2" + "overrides": { + "semver": "^7.5.2" } } diff --git a/redisinsight/ui/src/packages/geodata/src/App.spec.tsx b/redisinsight/ui/src/packages/geodata/src/App.spec.tsx index d9dde13108..613366e078 100644 --- a/redisinsight/ui/src/packages/geodata/src/App.spec.tsx +++ b/redisinsight/ui/src/packages/geodata/src/App.spec.tsx @@ -194,9 +194,9 @@ describe('Geodata App', () => { GeodataMode.RqeInspector, ) - expect(screen.getByText('Cannot inspect RQE geo command')).toBeInTheDocument() + expect(screen.getByText('Cannot inspect Redis Search geo command')).toBeInTheDocument() expect( - screen.getByText('No Redis Query Engine geospatial predicate found.'), + screen.getByText('No Redis Search geospatial predicate found.'), ).toBeInTheDocument() }) @@ -207,7 +207,7 @@ describe('Geodata App', () => { GeodataMode.RqeMarkers, ) - expect(screen.getByText('Cannot render RQE geo map')).toBeInTheDocument() + expect(screen.getByText('Cannot render Redis Search geo map')).toBeInTheDocument() expect( screen.getByText( 'No returned geospatial fields found. Add RETURN 1 coords to the FT.SEARCH command.', @@ -242,7 +242,7 @@ describe('Geodata App', () => { const plot = screen.getByRole('img', { name: 'Leaflet geospatial shape plot', }) - const summary = screen.getByLabelText('RQE command summary') + const summary = screen.getByLabelText('Redis Search command summary') expect( Boolean( plot.compareDocumentPosition(summary) & @@ -258,7 +258,7 @@ describe('Geodata App', () => { GeodataMode.RqeShape, ) - expect(screen.getByText('Cannot render RQE geo shape')).toBeInTheDocument() + expect(screen.getByText('Cannot render Redis Search geo shape')).toBeInTheDocument() expect( screen.getByText( 'No returned geospatial fields found. Add RETURN 1 geom to the FT.SEARCH command.', diff --git a/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.spec.tsx b/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.spec.tsx index 32d6dba0ef..327e92ec7d 100644 --- a/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.spec.tsx +++ b/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.spec.tsx @@ -124,17 +124,17 @@ describe('RqeGeoVisualization', () => { ) expect( - screen.getByText('Cannot inspect RQE geo results'), + screen.getByText('Cannot inspect Redis Search geo results'), ).toBeInTheDocument() expect( - screen.queryByText('Cannot render RQE geo map'), + screen.queryByText('Cannot render Redis Search geo map'), ).not.toBeInTheDocument() }) it('shows a heatmap-specific error title when heatmap command parsing fails', () => { jest.spyOn(rqeGeoParser, 'parseRqeGeoCommand').mockReturnValue({ ok: false, - error: 'No Redis Query Engine geospatial predicate found.', + error: 'No Redis Search geospatial predicate found.', }) render( @@ -146,9 +146,9 @@ describe('RqeGeoVisualization', () => { />, ) - expect(screen.getByText('Cannot render RQE geo heatmap')).toBeInTheDocument() + expect(screen.getByText('Cannot render Redis Search geo heatmap')).toBeInTheDocument() expect( - screen.queryByText('Cannot inspect RQE geo command'), + screen.queryByText('Cannot inspect Redis Search geo command'), ).not.toBeInTheDocument() }) @@ -170,9 +170,9 @@ describe('RqeGeoVisualization', () => { />, ) - expect(screen.getByText('Cannot render RQE geo heatmap')).toBeInTheDocument() + expect(screen.getByText('Cannot render Redis Search geo heatmap')).toBeInTheDocument() expect( - screen.queryByText('Cannot render RQE geo map'), + screen.queryByText('Cannot render Redis Search geo map'), ).not.toBeInTheDocument() }) }) diff --git a/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.tsx b/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.tsx index d71d82b31f..561ad1b656 100644 --- a/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.tsx +++ b/redisinsight/ui/src/packages/geodata/src/components/RqeGeoVisualization/RqeGeoVisualization.tsx @@ -42,22 +42,22 @@ const getResultsErrorTitle = ( mode: RqeGeoVisualizationProps['mode'], ): string => { if (mode === 'shape') { - return 'Cannot render RQE geo shape' + return 'Cannot render Redis Search geo shape' } if (mode === 'heatmap') { - return 'Cannot render RQE geo heatmap' + return 'Cannot render Redis Search geo heatmap' } if (mode === 'inspector') { - return 'Cannot inspect RQE geo results' + return 'Cannot inspect Redis Search geo results' } - return 'Cannot render RQE geo map' + return 'Cannot render Redis Search geo map' } const getCommandErrorTitle = ( mode: RqeGeoVisualizationProps['mode'], ): string => { if (mode === 'inspector') { - return 'Cannot inspect RQE geo command' + return 'Cannot inspect Redis Search geo command' } return getResultsErrorTitle(mode) } @@ -107,7 +107,7 @@ const renderSummary = (command: ParsedRqeGeoCommand, rowCount: number) => { return ( { ), ).toEqual({ ok: false, - error: 'No Redis Query Engine geospatial predicate found.', + error: 'No Redis Search geospatial predicate found.', }) }) @@ -177,7 +177,7 @@ describe('rqeGeoParser', () => { ), ).toEqual({ ok: false, - error: 'No Redis Query Engine geospatial predicate found.', + error: 'No Redis Search geospatial predicate found.', }) expect( @@ -186,7 +186,7 @@ describe('rqeGeoParser', () => { ), ).toEqual({ ok: false, - error: 'No Redis Query Engine geospatial predicate found.', + error: 'No Redis Search geospatial predicate found.', }) }) @@ -282,11 +282,11 @@ describe('rqeGeoParser', () => { it('rejects malformed RQE geo predicates', () => { expect(parseRqeGeoCommand('')).toEqual({ ok: false, - error: 'Missing Redis Query Engine command.', + error: 'Missing Redis Search command.', }) expect(parseRqeGeoCommand('FT.INFO idx')).toEqual({ ok: false, - error: 'Unsupported Redis Query Engine command: FT.INFO.', + error: 'Unsupported Redis Search command: FT.INFO.', }) expect(parseRqeGeoCommand('FT.SEARCH')).toEqual({ ok: false, @@ -791,7 +791,7 @@ describe('rqeGeoParser', () => { it('rejects unsupported RQE geo commands and malformed shapes', () => { expect(parseRqeGeoCommand('FT.SEARCH idx "*"')).toEqual({ ok: false, - error: 'No Redis Query Engine geospatial predicate found.', + error: 'No Redis Search geospatial predicate found.', }) expect( parseRqeGeoCommand( diff --git a/redisinsight/ui/src/packages/geodata/src/utils/rqeGeoParser.ts b/redisinsight/ui/src/packages/geodata/src/utils/rqeGeoParser.ts index 4822c76e20..20060b2293 100644 --- a/redisinsight/ui/src/packages/geodata/src/utils/rqeGeoParser.ts +++ b/redisinsight/ui/src/packages/geodata/src/utils/rqeGeoParser.ts @@ -307,10 +307,10 @@ export const parseRqeGeoCommand = ( const tokens = tokenizeRedisCommand(command) const commandToken = tokens[0]?.toUpperCase() as RqeGeoCommand | undefined if (!commandToken) { - return { ok: false, error: 'Missing Redis Query Engine command.' } + return { ok: false, error: 'Missing Redis Search command.' } } if (!RQE_GEO_COMMANDS.has(commandToken)) { - return { ok: false, error: `Unsupported Redis Query Engine command: ${tokens[0]}.` } + return { ok: false, error: `Unsupported Redis Search command: ${tokens[0]}.` } } if (!tokens[1]) { return { ok: false, error: `${commandToken} requires an index.` } @@ -333,7 +333,7 @@ export const parseRqeGeoCommand = ( queryOverlay if (!parsedOverlay) { - return { ok: false, error: 'No Redis Query Engine geospatial predicate found.' } + return { ok: false, error: 'No Redis Search geospatial predicate found.' } } if (!parsedOverlay.ok) { return parsedOverlay @@ -534,7 +534,7 @@ const parseRqeRows = ( return { ok: false, - error: `Unsupported Redis Query Engine command: ${command.command}.`, + error: `Unsupported Redis Search command: ${command.command}.`, } } diff --git a/redisinsight/ui/src/packages/geodata/yarn.lock b/redisinsight/ui/src/packages/geodata/yarn.lock deleted file mode 100644 index 83f6669d67..0000000000 --- a/redisinsight/ui/src/packages/geodata/yarn.lock +++ /dev/null @@ -1,461 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/aix-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" - integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== - -"@esbuild/android-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" - integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== - -"@esbuild/android-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" - integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== - -"@esbuild/android-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" - integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== - -"@esbuild/darwin-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" - integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== - -"@esbuild/darwin-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" - integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== - -"@esbuild/freebsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" - integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== - -"@esbuild/freebsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" - integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== - -"@esbuild/linux-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" - integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== - -"@esbuild/linux-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" - integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== - -"@esbuild/linux-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" - integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== - -"@esbuild/linux-loong64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" - integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== - -"@esbuild/linux-mips64el@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" - integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== - -"@esbuild/linux-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" - integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== - -"@esbuild/linux-riscv64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" - integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== - -"@esbuild/linux-s390x@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" - integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== - -"@esbuild/linux-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" - integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== - -"@esbuild/netbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" - integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== - -"@esbuild/netbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" - integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== - -"@esbuild/openbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" - integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== - -"@esbuild/openbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" - integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== - -"@esbuild/openharmony-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" - integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== - -"@esbuild/sunos-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" - integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== - -"@esbuild/win32-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" - integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== - -"@esbuild/win32-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" - integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== - -"@esbuild/win32-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" - integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== - -"@rollup/rollup-android-arm-eabi@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz#31503ca40424374cd6c5198031cf4d5a73de9727" - integrity sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw== - -"@rollup/rollup-android-arm64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz#7cbc30c88507013d0f982cfeb8884337ba1e0bb2" - integrity sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw== - -"@rollup/rollup-darwin-arm64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz#bc341a93bb2111326a2865f55d1d23baedecf40c" - integrity sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g== - -"@rollup/rollup-darwin-x64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz#dfa0236581c55ecc0bcaeb2ea1f2e800c58dc3e2" - integrity sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw== - -"@rollup/rollup-freebsd-arm64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz#4c5977413b87808a13b5edd524e46fafddb85b52" - integrity sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ== - -"@rollup/rollup-freebsd-x64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz#5cb2cee62ffee3ada4a0b44353e96cf98cfc7c3c" - integrity sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA== - -"@rollup/rollup-linux-arm-gnueabihf@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz#04700cad36dd43ae81044fe7ee73e925845c4b85" - integrity sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g== - -"@rollup/rollup-linux-arm-musleabihf@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz#548ebf3997b3a6dcc7cdd7da813ff0c46000ac0a" - integrity sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w== - -"@rollup/rollup-linux-arm64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz#0264608f504b33725639ebe93be02c40e71a35c1" - integrity sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA== - -"@rollup/rollup-linux-arm64-musl@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz#147cf4889502cd3b331a800b8ca6741f87873079" - integrity sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg== - -"@rollup/rollup-linux-loong64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz#0c27c6b5258dcb3d0290e3bd04ba6277c9d7e541" - integrity sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA== - -"@rollup/rollup-linux-loong64-musl@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz#f0f18075ea0bfa2c992f8e3933b39b6ef91f7799" - integrity sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg== - -"@rollup/rollup-linux-ppc64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz#149bb5cb8893589ffaa1924b4eac4282e9fa4c69" - integrity sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ== - -"@rollup/rollup-linux-ppc64-musl@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz#200a063e298b05f996917d2aa53de749d54c0ca0" - integrity sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA== - -"@rollup/rollup-linux-riscv64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz#6d6d6eb996197ba86f95f9a6c442bc862f0756d4" - integrity sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw== - -"@rollup/rollup-linux-riscv64-musl@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz#9deb86001785cfcbc761457f50cd7c112fda0df9" - integrity sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ== - -"@rollup/rollup-linux-s390x-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz#d8228720c6e42da190d96c31a3495d70cf8284b9" - integrity sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig== - -"@rollup/rollup-linux-x64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz#df6bb38617a66a842bd2aeac9560cd729d084258" - integrity sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA== - -"@rollup/rollup-linux-x64-musl@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz#75e3e72849266b4fdd65f2da6c62423051e35636" - integrity sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA== - -"@rollup/rollup-openbsd-x64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz#e1080f0efb8b15cda39b3e62de5fb806079ab6e9" - integrity sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q== - -"@rollup/rollup-openharmony-arm64@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz#1fbda2d95c29dbfceb62785431754cd5aab86c72" - integrity sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg== - -"@rollup/rollup-win32-arm64-msvc@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz#deab3470815f97996f1d0d3608549cf1b7e4ffc2" - integrity sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg== - -"@rollup/rollup-win32-ia32-msvc@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz#817acae2ed4572960b59235ff2322381b6d82f26" - integrity sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA== - -"@rollup/rollup-win32-x64-gnu@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz#48129be99b0250d76b9c6d0ac983bef563a1c48a" - integrity sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A== - -"@rollup/rollup-win32-x64-msvc@4.60.3": - version "4.60.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz#cc6f094a3ffe5556bb4a831ee6fb572b8cd81a75" - integrity sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA== - -"@types/estree@1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/geojson@*": - version "7946.0.16" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" - integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== - -"@types/leaflet.markercluster@^1.5.6": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.6.tgz#3fff147abeee2303b3814d5799151ae14d72654e" - integrity sha512-I7hZjO2+isVXGYWzKxBp8PsCzAYCJBc29qBdFpquOCkS7zFDqUsUvkEOyQHedsk/Cy5tocQzf+Ndorm5W9YKTQ== - dependencies: - "@types/leaflet" "^1.9" - -"@types/leaflet@^1.9", "@types/leaflet@^1.9.3": - version "1.9.21" - resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.9.21.tgz#542e8f91250bc444f8a1416d472f5b518d83e979" - integrity sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w== - dependencies: - "@types/geojson" "*" - -esbuild@^0.25.0: - version "0.25.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" - integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.12" - "@esbuild/android-arm" "0.25.12" - "@esbuild/android-arm64" "0.25.12" - "@esbuild/android-x64" "0.25.12" - "@esbuild/darwin-arm64" "0.25.12" - "@esbuild/darwin-x64" "0.25.12" - "@esbuild/freebsd-arm64" "0.25.12" - "@esbuild/freebsd-x64" "0.25.12" - "@esbuild/linux-arm" "0.25.12" - "@esbuild/linux-arm64" "0.25.12" - "@esbuild/linux-ia32" "0.25.12" - "@esbuild/linux-loong64" "0.25.12" - "@esbuild/linux-mips64el" "0.25.12" - "@esbuild/linux-ppc64" "0.25.12" - "@esbuild/linux-riscv64" "0.25.12" - "@esbuild/linux-s390x" "0.25.12" - "@esbuild/linux-x64" "0.25.12" - "@esbuild/netbsd-arm64" "0.25.12" - "@esbuild/netbsd-x64" "0.25.12" - "@esbuild/openbsd-arm64" "0.25.12" - "@esbuild/openbsd-x64" "0.25.12" - "@esbuild/openharmony-arm64" "0.25.12" - "@esbuild/sunos-x64" "0.25.12" - "@esbuild/win32-arm64" "0.25.12" - "@esbuild/win32-ia32" "0.25.12" - "@esbuild/win32-x64" "0.25.12" - -fdir@^6.4.4, fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -leaflet.heat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/leaflet.heat/-/leaflet.heat-0.2.0.tgz#109d8cf586f0adee41f05aff031e27a77fecc229" - integrity sha512-Cd5PbAA/rX3X3XKxfDoUGi9qp78FyhWYurFg3nsfhntcM/MCNK08pRkf4iEenO1KNqwVPKCmkyktjW3UD+h9bQ== - -leaflet.markercluster@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz#9cdb52a4eab92671832e1ef9899669e80efc4056" - integrity sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA== - -leaflet@^1.9.4: - version "1.9.4" - resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.9.4.tgz#23fae724e282fa25745aff82ca4d394748db7d8d" - integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== - -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -nanoid@^3.3.11: - version "3.3.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" - integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^4.0.2, picomatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" - integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== - -postcss@^8.5.3: - version "8.5.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.14.tgz#a66c2d7808fadf69ebb5b84a03f8bafd76c4919c" - integrity sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -rollup@^4.34.9: - version "4.60.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.3.tgz#789258d41d090687d0ca7e80e8583d733711ddd3" - integrity sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.60.3" - "@rollup/rollup-android-arm64" "4.60.3" - "@rollup/rollup-darwin-arm64" "4.60.3" - "@rollup/rollup-darwin-x64" "4.60.3" - "@rollup/rollup-freebsd-arm64" "4.60.3" - "@rollup/rollup-freebsd-x64" "4.60.3" - "@rollup/rollup-linux-arm-gnueabihf" "4.60.3" - "@rollup/rollup-linux-arm-musleabihf" "4.60.3" - "@rollup/rollup-linux-arm64-gnu" "4.60.3" - "@rollup/rollup-linux-arm64-musl" "4.60.3" - "@rollup/rollup-linux-loong64-gnu" "4.60.3" - "@rollup/rollup-linux-loong64-musl" "4.60.3" - "@rollup/rollup-linux-ppc64-gnu" "4.60.3" - "@rollup/rollup-linux-ppc64-musl" "4.60.3" - "@rollup/rollup-linux-riscv64-gnu" "4.60.3" - "@rollup/rollup-linux-riscv64-musl" "4.60.3" - "@rollup/rollup-linux-s390x-gnu" "4.60.3" - "@rollup/rollup-linux-x64-gnu" "4.60.3" - "@rollup/rollup-linux-x64-musl" "4.60.3" - "@rollup/rollup-openbsd-x64" "4.60.3" - "@rollup/rollup-openharmony-arm64" "4.60.3" - "@rollup/rollup-win32-arm64-msvc" "4.60.3" - "@rollup/rollup-win32-ia32-msvc" "4.60.3" - "@rollup/rollup-win32-x64-gnu" "4.60.3" - "@rollup/rollup-win32-x64-msvc" "4.60.3" - fsevents "~2.3.2" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semver@^7.5.2: - version "7.8.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.0.tgz#ed0661039fcbcda2ce71f01fa6adbefaa77040df" - integrity sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -tinyglobby@^0.2.13: - version "0.2.16" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" - integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.4" - -"vite@file:../node_modules/vite": - version "6.4.2" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" diff --git a/redisinsight/ui/src/packages/package-lock.json b/redisinsight/ui/src/packages/package-lock.json new file mode 100644 index 0000000000..8d6af60e57 --- /dev/null +++ b/redisinsight/ui/src/packages/package-lock.json @@ -0,0 +1,5797 @@ +{ + "name": "shared", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shared", + "version": "0.0.1", + "devDependencies": { + "@types/d3": "^7.4.3", + "@types/file-saver": "^2.0.7", + "@types/jest": "^29.5.14", + "concurrently": "^9.1.2", + "cross-env": "^7.0.3", + "esbuild": "^0.25.2", + "jest": "^29.7.0", + "process": "^0.11.10", + "rimraf": "^6.0.1", + "rollup-plugin-css-only": "^4.5.2", + "vite": "^6.4.3", + "vite-plugin-ejs": "^1.7.0", + "vite-plugin-static-copy": "^2.3.2" + } + }, + "node_modules/@babel/code-frame": { + "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.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "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.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", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "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.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-globals": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "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.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "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": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "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.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", + "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "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": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", + "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", + "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^9.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "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": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-css-only": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-4.5.2.tgz", + "integrity": "sha512-7rj9+jB17Pz8LNcPgtMUb16JcgD8lxQMK9HcGfAVhMK3na/WXes3oGIo5QsrQQVqtgAU6q6KnQNXJrYunaUIQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "5" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "<5" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-ejs": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vite-plugin-ejs/-/vite-plugin-ejs-1.7.0.tgz", + "integrity": "sha512-JNP3zQDC4mSbfoJ3G73s5mmZITD8NGjUmLkq4swxyahy/W0xuokK9U9IJGXw7KCggq6UucT6hJ0p+tQrNtqTZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.9" + }, + "peerDependencies": { + "vite": ">=5.0.0" + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.2.tgz", + "integrity": "sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "p-map": "^7.0.3", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "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": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/redisinsight/ui/src/packages/redisearch/.npmrc b/redisinsight/ui/src/packages/redisearch/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/redisearch/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/redisearch/index.html b/redisinsight/ui/src/packages/redisearch/index.html index 1d9e3ae24c..a2d4740ade 100644 --- a/redisinsight/ui/src/packages/redisearch/index.html +++ b/redisinsight/ui/src/packages/redisearch/index.html @@ -4,7 +4,7 @@ - Redis Query Engine plugin + Redis Search plugin diff --git a/redisinsight/ui/src/packages/redisearch/package-lock.json b/redisinsight/ui/src/packages/redisearch/package-lock.json new file mode 100644 index 0000000000..520de04248 --- /dev/null +++ b/redisinsight/ui/src/packages/redisearch/package-lock.json @@ -0,0 +1,1936 @@ +{ + "name": "redisearch", + "version": "0.0.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redisearch", + "version": "0.0.2", + "dependencies": { + "@elastic/datemath": "^5.0.3", + "@elastic/eui": "34.6.0", + "classnames": "^2.3.1", + "lodash": "^4.18.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "redisinsight-plugin-sdk": "^1.0.0" + }, + "devDependencies": { + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elastic/datemath": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@elastic/datemath/-/datemath-5.0.3.tgz", + "integrity": "sha512-8Hbr1Uyjm5OcYBfEB60K7sCP6U3IXuWDaLaQmYv3UxgI4jqBWbakoemwWvsqPVUvnwEjuX6z7ghPZbefs8xiaA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.3" + }, + "peerDependencies": { + "moment": "^2.24.0" + } + }, + "node_modules/@elastic/datemath/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.npmjs.org/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "license": "MIT" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "license": "MIT", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.8.0.tgz", + "integrity": "sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.9.2", + "react-remove-scroll": "^2.5.5", + "react-style-singleton": "^2.2.0", + "tslib": "^2.3.1", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/redisinsight-plugin-sdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz", + "integrity": "sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA==", + "license": "MIT" + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "license": "MIT", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==", + "license": "MIT" + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==", + "license": "Apache-2.0" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/trim": { + "version": "0.0.3" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "license": "0BSD" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/redisinsight/ui/src/packages/redisearch/package.json b/redisinsight/ui/src/packages/redisearch/package.json index 139086abd2..03334033a8 100644 --- a/redisinsight/ui/src/packages/redisearch/package.json +++ b/redisinsight/ui/src/packages/redisearch/package.json @@ -56,9 +56,9 @@ "devDependencies": { "vite": "file:../node_modules/vite" }, - "resolutions": { + "overrides": { "trim": "0.0.3", - "@elastic/eui/**/prismjs": "~1.30.0", - "**/semver": "^7.5.2" + "@elastic/eui": { "prismjs": "~1.30.0" }, + "semver": "^7.5.2" } } diff --git a/redisinsight/ui/src/packages/redisearch/src/constants/constants.ts b/redisinsight/ui/src/packages/redisearch/src/constants/constants.ts index 2cf9230826..b34225bc3e 100644 --- a/redisinsight/ui/src/packages/redisearch/src/constants/constants.ts +++ b/redisinsight/ui/src/packages/redisearch/src/constants/constants.ts @@ -1,4 +1,13 @@ -export const InfoAttributesBoolean: string[] = ['NOSTEM', 'NOINDEX', 'SORTABLE'] +export const InfoAttributesBoolean: string[] = [ + 'NOSTEM', + 'NOINDEX', + 'SORTABLE', + 'WITHSUFFIXTRIE', + 'CASESENSITIVE', + 'UNF', + 'INDEXEMPTY', + 'INDEXMISSING', +] export enum Command { Search = 'FT.SEARCH', @@ -33,6 +42,9 @@ export enum ResultInfoField { Options = 'index_options', } +/** + * @deprecated Not used anywhere — kept temporarily. Safe to remove in a follow-up cleanup. + */ export const ResultInfoAttributes: string[] = [ 'Name', 'Type', diff --git a/redisinsight/ui/src/packages/redisearch/src/utils/parseResponse.ts b/redisinsight/ui/src/packages/redisearch/src/utils/parseResponse.ts index 7e18f6db51..4a99e4203f 100644 --- a/redisinsight/ui/src/packages/redisearch/src/utils/parseResponse.ts +++ b/redisinsight/ui/src/packages/redisearch/src/utils/parseResponse.ts @@ -77,17 +77,9 @@ const parseInfoRawResponse = (initResult: any[]) => { : value return [ field, - values.map((attrs: any[]) => { - const newAttrs = attrs.reduce( - (prev, current) => - InfoAttributesBoolean.indexOf(current) !== -1 - ? [...prev, current, true] - : [...prev, current], - [], - ) - - return fromPairsChunk(newAttrs, 2) - }), + values.map((attrs: any[]) => + fromPairsChunk(expandBooleanAttributeFlags(attrs), 2), + ), ] } if (isArray(value) && field !== ResultInfoField.Options) { @@ -100,6 +92,29 @@ const parseInfoRawResponse = (initResult: any[]) => { return fromPairs(result) } +/** + * Expand valueless FT.INFO attribute flags to [flag, true] only when the token + * is in key position. Matching any occurrence (e.g. array.includes / reduce on + * every token) false-positives when a field alias is literally WITHSUFFIXTRIE. + */ +const expandBooleanAttributeFlags = (attrs: any[] = []) => { + const expanded: any[] = [] + let i = 0 + + while (i < attrs.length) { + const token = attrs[i] + if (InfoAttributesBoolean.indexOf(token) !== -1) { + expanded.push(token, true) + i += 1 + continue + } + expanded.push(token, attrs[i + 1]) + i += 2 + } + + return expanded +} + const fromPairsChunk = (arr: any[] = [], count: number = 2) => fromPairs(chunk(arr, count)) diff --git a/redisinsight/ui/src/packages/redisearch/src/utils/tests/parseResponse.spec.ts b/redisinsight/ui/src/packages/redisearch/src/utils/tests/parseResponse.spec.ts index 5df27728b4..2279c622c7 100644 --- a/redisinsight/ui/src/packages/redisearch/src/utils/tests/parseResponse.spec.ts +++ b/redisinsight/ui/src/packages/redisearch/src/utils/tests/parseResponse.spec.ts @@ -1,4 +1,8 @@ -import { parseSearchRawResponse, parseAggregateRawResponse } from '..' +import { + parseSearchRawResponse, + parseAggregateRawResponse, + parseInfoRawResponse, +} from '..' const resultFTSearch: any[] = [ 'red:2', @@ -107,3 +111,51 @@ describe('parseAggregateRawResponse', () => { ) }) }) + +describe('parseInfoRawResponse', () => { + it('should set WITHSUFFIXTRIE only for the attribute that enables it', () => { + const result: any = parseInfoRawResponse([ + 'index_name', + 'idx:trie', + 'attributes', + [ + [ + 'identifier', + '$.chunkText', + 'attribute', + 'chunkText', + 'type', + 'TEXT', + 'WEIGHT', + '1', + ], + [ + 'identifier', + '$.chunkText', + 'attribute', + 'chunkText_trie', + 'type', + 'TEXT', + 'WEIGHT', + '1', + 'WITHSUFFIXTRIE', + ], + [ + 'identifier', + '$.chunkText', + 'attribute', + 'WITHSUFFIXTRIE', + 'type', + 'TEXT', + 'WEIGHT', + '1', + ], + ], + ]) + + expect(result.attributes[0].WITHSUFFIXTRIE).toBeUndefined() + expect(result.attributes[1].WITHSUFFIXTRIE).toBe(true) + expect(result.attributes[2].attribute).toBe('WITHSUFFIXTRIE') + expect(result.attributes[2].WITHSUFFIXTRIE).toBeUndefined() + }) +}) diff --git a/redisinsight/ui/src/packages/redisearch/yarn.lock b/redisinsight/ui/src/packages/redisearch/yarn.lock deleted file mode 100644 index aa1b58b2a3..0000000000 --- a/redisinsight/ui/src/packages/redisearch/yarn.lock +++ /dev/null @@ -1,1480 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.15.4", "@babel/runtime@^7.9.2": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@elastic/datemath@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@elastic/datemath/-/datemath-5.0.3.tgz#7baccdab672b9a3ecb7fe8387580670936b58573" - integrity sha512-8Hbr1Uyjm5OcYBfEB60K7sCP6U3IXuWDaLaQmYv3UxgI4jqBWbakoemwWvsqPVUvnwEjuX6z7ghPZbefs8xiaA== - dependencies: - tslib "^1.9.3" - -"@elastic/eui@34.6.0": - version "34.6.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz#a7188bc97d9c3120cd65e52ed423377872b604bd" - integrity sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw== - dependencies: - "@types/chroma-js" "^2.0.0" - "@types/lodash" "^4.14.160" - "@types/numeral" "^0.0.28" - "@types/react-beautiful-dnd" "^13.0.0" - "@types/react-input-autosize" "^2.2.0" - "@types/react-virtualized-auto-sizer" "^1.0.0" - "@types/react-window" "^1.8.2" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" - "@types/vfile-message" "^2.0.0" - chroma-js "^2.1.0" - classnames "^2.2.6" - lodash "^4.17.21" - mdast-util-to-hast "^10.0.0" - numeral "^2.0.6" - prop-types "^15.6.0" - react-ace "^7.0.5" - react-beautiful-dnd "^13.0.0" - react-dropzone "^11.2.0" - react-focus-on "^3.5.0" - react-input-autosize "^2.2.2" - react-is "~16.3.0" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - refractor "^3.4.0" - rehype-raw "^5.0.0" - rehype-react "^6.0.0" - rehype-stringify "^8.0.0" - remark-emoji "^2.1.0" - remark-parse "^8.0.3" - remark-rehype "^8.0.0" - tabbable "^3.0.0" - text-diff "^1.0.1" - unified "^9.2.0" - unist-util-visit "^2.0.3" - url-parse "^1.5.0" - uuid "^8.3.0" - vfile "^4.2.0" - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@types/chroma-js@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" - integrity sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw== - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/lodash@^4.14.160": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prismjs@*": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" - integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-beautiful-dnd@^13.0.0": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz#bcec72da719c18c0d8b4a7cb00e7fb443211d6d7" - integrity sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA== - dependencies: - "@types/react" "*" - -"@types/react-input-autosize@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz#6a335212e7fce1e1a4da56ae2095c8c5c35fbfe6" - integrity sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-virtualized-auto-sizer@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" - integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== - dependencies: - "@types/react" "*" - -"@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/refractor@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== - dependencies: - "@types/prismjs" "*" - -"@types/resize-observer-browser@^0.1.5": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -aria-hidden@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chroma-js@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" - integrity sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -diff-match-patch@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-selector@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz#59ec4f27aa5baf0841e9c6385c8386bef4d18b17" - integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg== - dependencies: - tslib "^2.0.3" - -focus-lock@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" - integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== - dependencies: - tslib "^2.0.3" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-is-element@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" - integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-html@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" - integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== - dependencies: - ccount "^1.0.0" - comma-separated-tokens "^1.0.0" - hast-util-is-element "^1.0.0" - hast-util-whitespace "^1.0.0" - html-void-elements "^1.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - stringify-entities "^3.0.1" - unist-util-is "^4.0.0" - xtend "^4.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-whitespace@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" - integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -inherits@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash@^4.17.21, lodash@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prismjs@~1.27.0, prismjs@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -react-ace@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz#798299fd52ddf3a3dcc92afc5865538463544f01" - integrity sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg== - dependencies: - brace "^0.11.1" - diff-match-patch "^1.0.4" - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - -react-beautiful-dnd@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" - integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - dependencies: - "@babel/runtime" "^7.12.13" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-dropzone@^11.2.0: - version "11.7.1" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" - integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ== - dependencies: - attr-accept "^2.2.2" - file-selector "^0.4.0" - prop-types "^15.8.1" - -react-focus-lock@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.11.6" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-focus-on@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.8.0.tgz#71ba2707a21f67ffa41b71775b1093b2a1c408ee" - integrity sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw== - dependencies: - aria-hidden "^1.2.2" - react-focus-lock "^2.9.2" - react-remove-scroll "^2.5.5" - react-style-singleton "^2.2.0" - tslib "^2.3.1" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@~16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-redux@^7.2.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.0, react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.15" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz#84558bcab61a625d13ec37876639bb09c5a3ec0b" - integrity sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg== - -react-window@^1.8.5: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -redisinsight-plugin-sdk@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz#5ac39dc5398b1f73f2357e67ce51e1875fbece4f" - integrity sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA== - -redux@^4.0.0, redux@^4.0.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -refractor@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -rehype-raw@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -rehype-react@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" - integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - hast-to-hyperscript "^9.0.0" - -rehype-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" - integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== - dependencies: - hast-util-to-html "^7.1.1" - -remark-emoji@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-parse@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -stringify-entities@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" - integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - xtend "^4.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -tabbable@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2" - integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ== - -text-diff@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz#6c105905435e337857375c9d2f6ca63e453ff565" - integrity sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA== - -tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" - integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -url-parse@^1.5.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-memo-one@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" - integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@*: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0, vfile@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -"vite@file:../node_modules/vite": - version "6.3.4" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/redisinsight/ui/src/packages/redisgraph/.npmrc b/redisinsight/ui/src/packages/redisgraph/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/redisgraph/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/redisgraph/README.md b/redisinsight/ui/src/packages/redisgraph/README.md index c606896e58..c3fe4859af 100644 --- a/redisinsight/ui/src/packages/redisgraph/README.md +++ b/redisinsight/ui/src/packages/redisgraph/README.md @@ -8,8 +8,8 @@ The example has been created using React, TypeScript, and [Elastic UI](https://e The following commands will install dependencies and start the server to run the plugin locally: ``` -yarn -yarn start +npm install +npm start ``` These commands will install dependencies and start the server. @@ -20,8 +20,8 @@ This command will generate the `vendor` folder with styles and fonts of the core inside the folder for your plugin and include appropriate styles to the `index.html` file. ``` -yarn build:statics - for Linux or MacOs -yarn build:statics:win - for Windows +npm run build:statics - for Linux or MacOs +npm run build:statics:win - for Windows ``` ## Build plugin @@ -29,8 +29,8 @@ yarn build:statics:win - for Windows The following commands will build plugins to be used in Redis Insight: ``` -yarn -yarn build +npm install +npm run build ``` [Add](../../../../../docs/plugins/installation.md) the package.json file and the diff --git a/redisinsight/ui/src/packages/redisgraph/package-lock.json b/redisinsight/ui/src/packages/redisgraph/package-lock.json new file mode 100644 index 0000000000..91be14ab19 --- /dev/null +++ b/redisinsight/ui/src/packages/redisgraph/package-lock.json @@ -0,0 +1,2982 @@ +{ + "name": "graph-plugin", + "version": "0.0.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "graph-plugin", + "version": "0.0.2", + "dependencies": { + "@elastic/eui": "34.6.0", + "@emotion/react": "^11.7.1", + "classnames": "^2.3.1", + "d3": "^7.3.0", + "prop-types": "^15.8.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-json-tree": "^0.16.1", + "redisinsight-plugin-sdk": "^1.1.0" + }, + "devDependencies": { + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.npmjs.org/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", + "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@types/base16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/base16/-/base16-1.0.2.tgz", + "integrity": "sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg==", + "license": "MIT" + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "license": "MIT" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "license": "MIT", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", + "license": "MIT" + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", + "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", + "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "@types/base16": "^1.0.2", + "@types/lodash": "^4.14.178", + "base16": "^1.0.0", + "color": "^3.2.1", + "csstype": "^3.0.10", + "lodash.curry": "^4.1.1" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.8.0.tgz", + "integrity": "sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.9.2", + "react-remove-scroll": "^2.5.5", + "react-style-singleton": "^2.2.0", + "tslib": "^2.3.1", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-tree": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.16.2.tgz", + "integrity": "sha512-80F7ZTqeOl1YaS/sDce4tYBcSe69/d0mlUmcIhyXezPFctWrtvyN56EMExX9jWsq3XMdvsUKKPUeNo8QCBy2jg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/prop-types": "^15.7.4", + "prop-types": "^15.8.1", + "react-base16-styling": "^0.9.1" + }, + "peerDependencies": { + "@types/react": "^16.3.0 || ^17.0.0", + "react": "^16.3.0 || ^17.0.0" + } + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/redisinsight-plugin-sdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz", + "integrity": "sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA==", + "license": "MIT" + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "license": "MIT", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", + "license": "Unlicense" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==", + "license": "MIT" + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==", + "license": "Apache-2.0" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/trim": { + "version": "0.0.3" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "license": "0BSD" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/redisinsight/ui/src/packages/redisgraph/package.json b/redisinsight/ui/src/packages/redisgraph/package.json index 9322fd9f9d..d5e0820cb6 100644 --- a/redisinsight/ui/src/packages/redisgraph/package.json +++ b/redisinsight/ui/src/packages/redisgraph/package.json @@ -43,9 +43,10 @@ "react-json-tree": "^0.16.1", "redisinsight-plugin-sdk": "^1.1.0" }, - "resolutions": { + "overrides": { "trim": "0.0.3", - "@elastic/eui/**/prismjs": "~1.30.0", - "**/semver": "^7.5.2" + "@elastic/eui": { "prismjs": "~1.30.0" }, + "semver": "^7.5.2", + "lodash": "^4.18.1" } } diff --git a/redisinsight/ui/src/packages/redisgraph/yarn.lock b/redisinsight/ui/src/packages/redisgraph/yarn.lock deleted file mode 100644 index f291499fbc..0000000000 --- a/redisinsight/ui/src/packages/redisgraph/yarn.lock +++ /dev/null @@ -1,2157 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-module-imports@^7.16.7": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.9.2": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@elastic/eui@34.6.0": - version "34.6.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz#a7188bc97d9c3120cd65e52ed423377872b604bd" - integrity sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw== - dependencies: - "@types/chroma-js" "^2.0.0" - "@types/lodash" "^4.14.160" - "@types/numeral" "^0.0.28" - "@types/react-beautiful-dnd" "^13.0.0" - "@types/react-input-autosize" "^2.2.0" - "@types/react-virtualized-auto-sizer" "^1.0.0" - "@types/react-window" "^1.8.2" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" - "@types/vfile-message" "^2.0.0" - chroma-js "^2.1.0" - classnames "^2.2.6" - lodash "^4.17.21" - mdast-util-to-hast "^10.0.0" - numeral "^2.0.6" - prop-types "^15.6.0" - react-ace "^7.0.5" - react-beautiful-dnd "^13.0.0" - react-dropzone "^11.2.0" - react-focus-on "^3.5.0" - react-input-autosize "^2.2.2" - react-is "~16.3.0" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - refractor "^3.4.0" - rehype-raw "^5.0.0" - rehype-react "^6.0.0" - rehype-stringify "^8.0.0" - remark-emoji "^2.1.0" - remark-parse "^8.0.3" - remark-rehype "^8.0.0" - tabbable "^3.0.0" - text-diff "^1.0.1" - unified "^9.2.0" - unist-util-visit "^2.0.3" - url-parse "^1.5.0" - uuid "^8.3.0" - vfile "^4.2.0" - -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.1.3" - -"@emotion/cache@^11.10.5": - version "11.10.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" - integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/react@^11.7.1": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== - dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== - -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== - -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== - -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@types/base16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/base16/-/base16-1.0.2.tgz#eb3a07db52309bfefb9ba010dfdb3c0784971f65" - integrity sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg== - -"@types/chroma-js@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" - integrity sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw== - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/lodash@^4.14.160", "@types/lodash@^4.14.178": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prismjs@*": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" - integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== - -"@types/prop-types@*", "@types/prop-types@^15.7.4": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-beautiful-dnd@^13.0.0": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz#bcec72da719c18c0d8b4a7cb00e7fb443211d6d7" - integrity sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA== - dependencies: - "@types/react" "*" - -"@types/react-input-autosize@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz#6a335212e7fce1e1a4da56ae2095c8c5c35fbfe6" - integrity sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-virtualized-auto-sizer@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" - integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== - dependencies: - "@types/react" "*" - -"@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/refractor@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== - dependencies: - "@types/prismjs" "*" - -"@types/resize-observer-browser@^0.1.5": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aria-hidden@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chroma-js@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" - integrity sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -csstype@^3.0.10, csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" - integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== - dependencies: - internmap "1 - 2" - -d3-axis@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-contour@4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" - integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.4" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" - integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -"d3-ease@1 - 3", d3-ease@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^7.3.0: - version "7.8.4" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.4.tgz#e35d45800e4068cab07e59e5d883a4bb42ab217f" - integrity sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -diff-match-patch@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-selector@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz#59ec4f27aa5baf0841e9c6385c8386bef4d18b17" - integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg== - dependencies: - tslib "^2.0.3" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -focus-lock@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" - integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== - dependencies: - tslib "^2.0.3" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-is-element@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" - integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-html@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" - integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== - dependencies: - ccount "^1.0.0" - comma-separated-tokens "^1.0.0" - hast-util-is-element "^1.0.0" - hast-util-whitespace "^1.0.0" - html-void-elements "^1.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - stringify-entities "^3.0.1" - unist-util-is "^4.0.0" - xtend "^4.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-whitespace@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" - integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inherits@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lodash.curry@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash@^4.17.21: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prismjs@~1.27.0, prismjs@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -react-ace@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz#798299fd52ddf3a3dcc92afc5865538463544f01" - integrity sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg== - dependencies: - brace "^0.11.1" - diff-match-patch "^1.0.4" - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - -react-base16-styling@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.9.1.tgz#4906b4c0a51636f2dca2cea8b682175aa8bd0c92" - integrity sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw== - dependencies: - "@babel/runtime" "^7.16.7" - "@types/base16" "^1.0.2" - "@types/lodash" "^4.14.178" - base16 "^1.0.0" - color "^3.2.1" - csstype "^3.0.10" - lodash.curry "^4.1.1" - -react-beautiful-dnd@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" - integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - dependencies: - "@babel/runtime" "^7.12.13" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-dropzone@^11.2.0: - version "11.7.1" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" - integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ== - dependencies: - attr-accept "^2.2.2" - file-selector "^0.4.0" - prop-types "^15.8.1" - -react-focus-lock@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.11.6" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-focus-on@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.8.0.tgz#71ba2707a21f67ffa41b71775b1093b2a1c408ee" - integrity sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw== - dependencies: - aria-hidden "^1.2.2" - react-focus-lock "^2.9.2" - react-remove-scroll "^2.5.5" - react-style-singleton "^2.2.0" - tslib "^2.3.1" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@~16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-json-tree@^0.16.1: - version "0.16.2" - resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.16.2.tgz#697bd9413407d2448ddff3c8891cd4395342539e" - integrity sha512-80F7ZTqeOl1YaS/sDce4tYBcSe69/d0mlUmcIhyXezPFctWrtvyN56EMExX9jWsq3XMdvsUKKPUeNo8QCBy2jg== - dependencies: - "@babel/runtime" "^7.17.8" - "@types/prop-types" "^15.7.4" - prop-types "^15.8.1" - react-base16-styling "^0.9.1" - -react-redux@^7.2.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.0, react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.15" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz#84558bcab61a625d13ec37876639bb09c5a3ec0b" - integrity sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg== - -react-window@^1.8.5: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -redisinsight-plugin-sdk@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz#5ac39dc5398b1f73f2357e67ce51e1875fbece4f" - integrity sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA== - -redux@^4.0.0, redux@^4.0.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -refractor@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -rehype-raw@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -rehype-react@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" - integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - hast-to-hyperscript "^9.0.0" - -rehype-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" - integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== - dependencies: - hast-util-to-html "^7.1.1" - -remark-emoji@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-parse@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.19.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -stringify-entities@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" - integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - xtend "^4.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2" - integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ== - -text-diff@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz#6c105905435e337857375c9d2f6ca63e453ff565" - integrity sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA== - -tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" - integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -url-parse@^1.5.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-memo-one@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" - integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@*: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0, vfile@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -"vite@file:../node_modules/vite": - version "6.3.4" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/redisinsight/ui/src/packages/redisinsight-plugin-sdk/.gitignore b/redisinsight/ui/src/packages/redisinsight-plugin-sdk/.gitignore index cefc70feb6..18f23783b5 100644 --- a/redisinsight/ui/src/packages/redisinsight-plugin-sdk/.gitignore +++ b/redisinsight/ui/src/packages/redisinsight-plugin-sdk/.gitignore @@ -4,8 +4,6 @@ node_modules logs *.log npm-debug.log* -yarn-debug.log* -yarn-error.log* lerna-debug.log* # OS diff --git a/redisinsight/ui/src/packages/redisinsight-plugin-sdk/README.md b/redisinsight/ui/src/packages/redisinsight-plugin-sdk/README.md index 654b771f35..51f35d8af9 100644 --- a/redisinsight/ui/src/packages/redisinsight-plugin-sdk/README.md +++ b/redisinsight/ui/src/packages/redisinsight-plugin-sdk/README.md @@ -8,7 +8,7 @@ plugin and Redis Insight application. ``` npm install redisinsight-plugin-sdk or -yarn add redisinsight-plugin-sdk +npm install redisinsight-plugin-sdk ``` ## Available methods diff --git a/redisinsight/ui/src/packages/redistimeseries-app/.npmrc b/redisinsight/ui/src/packages/redistimeseries-app/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/redistimeseries-app/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/redistimeseries-app/README.md b/redisinsight/ui/src/packages/redistimeseries-app/README.md index df68b17890..95573cd5db 100644 --- a/redisinsight/ui/src/packages/redistimeseries-app/README.md +++ b/redisinsight/ui/src/packages/redistimeseries-app/README.md @@ -8,8 +8,8 @@ The example has been created using React, TypeScript, and [Elastic UI](https://e The following commands will install dependencies and start the server to run the plugin locally: ``` -yarn -yarn start +npm install +npm start ``` These commands will install dependencies and start the server. @@ -20,8 +20,8 @@ This command will generate the `vendor` folder with styles and fonts of the core inside the folder for your plugin and include appropriate styles to the `index.html` file. ``` -yarn build:statics - for Linux or MacOs -yarn build:statics:win - for Windows +npm run build:statics - for Linux or MacOs +npm run build:statics:win - for Windows ``` ## Build plugin @@ -29,8 +29,8 @@ yarn build:statics:win - for Windows The following commands will build plugins to be used in Redis Insight: ``` -yarn -yarn build +npm install +npm run build ``` [Add](../../../../../docs/plugins/installation.md) the package.json file and the diff --git a/redisinsight/ui/src/packages/redistimeseries-app/package-lock.json b/redisinsight/ui/src/packages/redistimeseries-app/package-lock.json new file mode 100644 index 0000000000..a19cae538b --- /dev/null +++ b/redisinsight/ui/src/packages/redistimeseries-app/package-lock.json @@ -0,0 +1,2468 @@ +{ + "name": "redistimeseries", + "version": "0.0.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redistimeseries", + "version": "0.0.2", + "dependencies": { + "@elastic/eui": "34.6.0", + "@emotion/react": "^11.7.1", + "classnames": "^2.3.1", + "date-fns": "^2.28.0", + "file-saver": "^2.0.5", + "fscreen": "^1.2.0", + "plotly.js-dist-min": "^2.9.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "redisinsight-plugin-sdk": "file:../redisinsight-plugin-sdk" + }, + "devDependencies": { + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "../redisinsight-plugin-sdk": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.npmjs.org/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", + "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "license": "MIT" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "license": "MIT", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "license": "MIT", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fscreen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz", + "integrity": "sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==", + "license": "MIT" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/plotly.js-dist-min": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/plotly.js-dist-min/-/plotly.js-dist-min-2.21.0.tgz", + "integrity": "sha512-+GJDHV7ZKBMwb93U0sRS7/E1I9XNdgjd5aEsa03QHdMtOnARMDyvzwARCcKSn2bHNtwFx95DK9c9XNL1O877rw==", + "license": "MIT" + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.8.0.tgz", + "integrity": "sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.9.2", + "react-remove-scroll": "^2.5.5", + "react-style-singleton": "^2.2.0", + "tslib": "^2.3.1", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/redisinsight-plugin-sdk": { + "resolved": "../redisinsight-plugin-sdk", + "link": true + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "license": "MIT", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==", + "license": "MIT" + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==", + "license": "Apache-2.0" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/trim": { + "version": "0.0.3" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "license": "0BSD" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/redisinsight/ui/src/packages/redistimeseries-app/package.json b/redisinsight/ui/src/packages/redistimeseries-app/package.json index 92b1c4e603..860ed6d7c7 100644 --- a/redisinsight/ui/src/packages/redistimeseries-app/package.json +++ b/redisinsight/ui/src/packages/redistimeseries-app/package.json @@ -46,11 +46,12 @@ "react-dom": "^17.0.2", "redisinsight-plugin-sdk": "file:../redisinsight-plugin-sdk" }, - "resolutions": { - "jest/**/micromatch": "^4.0.8", + "overrides": { + "jest": { "micromatch": "^4.0.8" }, "trim": "0.0.3", - "**/cross-spawn": "^7.0.5", - "@elastic/eui/**/prismjs": "~1.30.0", - "**/semver": "^7.5.2" + "cross-spawn": "^7.0.5", + "@elastic/eui": { "prismjs": "~1.30.0" }, + "semver": "^7.5.2", + "lodash": "^4.18.1" } } diff --git a/redisinsight/ui/src/packages/redistimeseries-app/yarn.lock b/redisinsight/ui/src/packages/redistimeseries-app/yarn.lock deleted file mode 100644 index c72b4997ff..0000000000 --- a/redisinsight/ui/src/packages/redistimeseries-app/yarn.lock +++ /dev/null @@ -1,1895 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-module-imports@^7.16.7": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.9.2": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@elastic/eui@34.6.0": - version "34.6.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz#a7188bc97d9c3120cd65e52ed423377872b604bd" - integrity sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw== - dependencies: - "@types/chroma-js" "^2.0.0" - "@types/lodash" "^4.14.160" - "@types/numeral" "^0.0.28" - "@types/react-beautiful-dnd" "^13.0.0" - "@types/react-input-autosize" "^2.2.0" - "@types/react-virtualized-auto-sizer" "^1.0.0" - "@types/react-window" "^1.8.2" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" - "@types/vfile-message" "^2.0.0" - chroma-js "^2.1.0" - classnames "^2.2.6" - lodash "^4.17.21" - mdast-util-to-hast "^10.0.0" - numeral "^2.0.6" - prop-types "^15.6.0" - react-ace "^7.0.5" - react-beautiful-dnd "^13.0.0" - react-dropzone "^11.2.0" - react-focus-on "^3.5.0" - react-input-autosize "^2.2.2" - react-is "~16.3.0" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - refractor "^3.4.0" - rehype-raw "^5.0.0" - rehype-react "^6.0.0" - rehype-stringify "^8.0.0" - remark-emoji "^2.1.0" - remark-parse "^8.0.3" - remark-rehype "^8.0.0" - tabbable "^3.0.0" - text-diff "^1.0.1" - unified "^9.2.0" - unist-util-visit "^2.0.3" - url-parse "^1.5.0" - uuid "^8.3.0" - vfile "^4.2.0" - -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.1.3" - -"@emotion/cache@^11.10.5": - version "11.10.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" - integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/react@^11.7.1": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== - dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== - -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== - -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== - -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@types/chroma-js@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" - integrity sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw== - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/lodash@^4.14.160": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prismjs@*": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" - integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-beautiful-dnd@^13.0.0": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz#bcec72da719c18c0d8b4a7cb00e7fb443211d6d7" - integrity sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA== - dependencies: - "@types/react" "*" - -"@types/react-input-autosize@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz#6a335212e7fce1e1a4da56ae2095c8c5c35fbfe6" - integrity sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-virtualized-auto-sizer@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" - integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== - dependencies: - "@types/react" "*" - -"@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/refractor@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== - dependencies: - "@types/prismjs" "*" - -"@types/resize-observer-browser@^0.1.5": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aria-hidden@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chroma-js@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" - integrity sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^7.0.5: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -date-fns@^2.28.0: - version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -diff-match-patch@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-saver@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" - integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== - -file-selector@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz#59ec4f27aa5baf0841e9c6385c8386bef4d18b17" - integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg== - dependencies: - tslib "^2.0.3" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -focus-lock@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" - integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== - dependencies: - tslib "^2.0.3" - -fscreen@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fscreen/-/fscreen-1.2.0.tgz#1a8c88e06bc16a07b473ad96196fb06d6657f59e" - integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-is-element@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" - integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-html@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" - integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== - dependencies: - ccount "^1.0.0" - comma-separated-tokens "^1.0.0" - hast-util-is-element "^1.0.0" - hast-util-whitespace "^1.0.0" - html-void-elements "^1.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - stringify-entities "^3.0.1" - unist-util-is "^4.0.0" - xtend "^4.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-whitespace@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" - integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inherits@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -plotly.js-dist-min@^2.9.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/plotly.js-dist-min/-/plotly.js-dist-min-2.21.0.tgz#7f83cc7675a02c02816bbb371565d81ba3adaa8b" - integrity sha512-+GJDHV7ZKBMwb93U0sRS7/E1I9XNdgjd5aEsa03QHdMtOnARMDyvzwARCcKSn2bHNtwFx95DK9c9XNL1O877rw== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prismjs@~1.27.0, prismjs@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -react-ace@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz#798299fd52ddf3a3dcc92afc5865538463544f01" - integrity sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg== - dependencies: - brace "^0.11.1" - diff-match-patch "^1.0.4" - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - -react-beautiful-dnd@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" - integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - dependencies: - "@babel/runtime" "^7.12.13" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-dropzone@^11.2.0: - version "11.7.1" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" - integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ== - dependencies: - attr-accept "^2.2.2" - file-selector "^0.4.0" - prop-types "^15.8.1" - -react-focus-lock@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.11.6" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-focus-on@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.8.0.tgz#71ba2707a21f67ffa41b71775b1093b2a1c408ee" - integrity sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw== - dependencies: - aria-hidden "^1.2.2" - react-focus-lock "^2.9.2" - react-remove-scroll "^2.5.5" - react-style-singleton "^2.2.0" - tslib "^2.3.1" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@~16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-redux@^7.2.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.0, react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.15" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz#84558bcab61a625d13ec37876639bb09c5a3ec0b" - integrity sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg== - -react-window@^1.8.5: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -redux@^4.0.0, redux@^4.0.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -refractor@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -rehype-raw@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -rehype-react@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" - integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - hast-to-hyperscript "^9.0.0" - -rehype-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" - integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== - dependencies: - hast-util-to-html "^7.1.1" - -remark-emoji@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-parse@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.19.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -stringify-entities@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" - integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - xtend "^4.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2" - integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ== - -text-diff@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz#6c105905435e337857375c9d2f6ca63e453ff565" - integrity sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA== - -tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" - integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -url-parse@^1.5.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-memo-one@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" - integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@*: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0, vfile@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -"vite@file:../node_modules/vite": - version "6.3.4" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/redisinsight/ui/src/packages/ri-explain/.npmrc b/redisinsight/ui/src/packages/ri-explain/.npmrc new file mode 100644 index 0000000000..ae71ed1e5b --- /dev/null +++ b/redisinsight/ui/src/packages/ri-explain/.npmrc @@ -0,0 +1,8 @@ +# Retain yarn-equivalent peer dependency resolution. +# @elastic/eui@34.6.0 declares legacy peer deps (e.g. @types/react@^16) that +# conflict with React 18. Mirrors the lenient resolution yarn used by default. +legacy-peer-deps=true + +# Supply-chain guard: only install package versions published at least N days ago. +# Mirrors dependabot's cooldown (.github/dependabot.yml). Maps to npm's --before. +min-release-age=3 diff --git a/redisinsight/ui/src/packages/ri-explain/package-lock.json b/redisinsight/ui/src/packages/ri-explain/package-lock.json new file mode 100644 index 0000000000..d79c1a425c --- /dev/null +++ b/redisinsight/ui/src/packages/ri-explain/package-lock.json @@ -0,0 +1,2518 @@ +{ + "name": "explain-plugin", + "version": "0.0.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "explain-plugin", + "version": "0.0.2", + "dependencies": { + "@antv/hierarchy": "^0.6.8", + "@antv/x6": "^2.1.3", + "@antv/x6-react-shape": "^2.1.0", + "@elastic/eui": "34.6.0", + "@emotion/react": "^11.7.1", + "classnames": "^2.3.1", + "prop-types": "^15.8.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redisinsight-plugin-sdk": "^1.1.0", + "uuid": "^14.0.0" + }, + "devDependencies": { + "vite": "file:../node_modules/vite" + } + }, + "../node_modules/vite": { + "version": "6.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.27.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.1", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.5.0", + "dotenv-expand": "^12.0.2", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.14.1", + "lightningcss": "^1.29.3", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "mrmime": "^2.0.1", + "nanoid": "^5.1.5", + "open": "^10.1.1", + "parse5": "^7.2.1", + "pathe": "^2.0.3", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.2.1", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-license": "^3.6.0", + "sass": "^1.86.3", + "sass-embedded": "^1.86.3", + "sirv": "^3.0.2", + "source-map-support": "^0.5.21", + "strip-literal": "^3.0.0", + "terser": "^5.39.0", + "tsconfck": "^3.1.5", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.6.1", + "ws": "^8.18.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@antv/hierarchy": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.11.tgz", + "integrity": "sha512-RJVhEMCuu4vj+Dt25lXIiNdd7jaqm/fqWGYikiELha4S5tnzdJoTUaUvvpfWlxLx4B0RsS9XRwBs1bOKN71TKg==", + "license": "MIT", + "dependencies": { + "@antv/util": "^2.0.7" + } + }, + "node_modules/@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "license": "ISC", + "dependencies": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/x6": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@antv/x6/-/x6-2.9.7.tgz", + "integrity": "sha512-lKYaiQqK7E3YaioM3y7/sUEQM2CWSA0IggLq4vRiZwLbmAbswasI3qIsIZ5PpMyLrcmRlOecMkP3S4cMI4xcAg==", + "license": "MIT", + "dependencies": { + "@antv/x6-common": "^2.0.12", + "@antv/x6-geometry": "^2.0.5", + "utility-types": "^3.10.0" + } + }, + "node_modules/@antv/x6-common": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@antv/x6-common/-/x6-common-2.0.12.tgz", + "integrity": "sha512-7PcvHGJ2UhrBEtsLI6MaHw6BCMhy22leCH8vCaMvmF32EEQ/491v6DKVPhcpp0dYZNERpfqvAB1w407Aw+bwLA==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.15", + "utility-types": "^3.10.0" + } + }, + "node_modules/@antv/x6-geometry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/x6-geometry/-/x6-geometry-2.0.5.tgz", + "integrity": "sha512-MId6riEQkxphBpVeTcL4ZNXL4lScyvDEPLyIafvWMcWNTGK0jgkK7N20XSzqt8ltJb0mGUso5s56mrk8ysHu2A==", + "license": "MIT" + }, + "node_modules/@antv/x6-react-shape": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@antv/x6-react-shape/-/x6-react-shape-2.1.2.tgz", + "integrity": "sha512-kNflTM88oyQwfx9H1FQNAK1YdzEnB5vUtlcyU/5WZikbXGuaRmcJUBpSDMJt+AQ8ng3c2joKYQwWHQWeV6RgNw==", + "license": "MIT", + "peerDependencies": { + "@antv/x6": "^2.x", + "react": ">=18.0.0", + "react-dom": ">= 18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elastic/eui": { + "version": "34.6.0", + "resolved": "https://registry.npmjs.org/@elastic/eui/-/eui-34.6.0.tgz", + "integrity": "sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@types/chroma-js": "^2.0.0", + "@types/lodash": "^4.14.160", + "@types/numeral": "^0.0.28", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-input-autosize": "^2.2.0", + "@types/react-virtualized-auto-sizer": "^1.0.0", + "@types/react-window": "^1.8.2", + "@types/refractor": "^3.0.0", + "@types/resize-observer-browser": "^0.1.5", + "@types/vfile-message": "^2.0.0", + "chroma-js": "^2.1.0", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "mdast-util-to-hast": "^10.0.0", + "numeral": "^2.0.6", + "prop-types": "^15.6.0", + "react-ace": "^7.0.5", + "react-beautiful-dnd": "^13.0.0", + "react-dropzone": "^11.2.0", + "react-focus-on": "^3.5.0", + "react-input-autosize": "^2.2.2", + "react-is": "~16.3.0", + "react-virtualized-auto-sizer": "^1.0.2", + "react-window": "^1.8.5", + "refractor": "^3.4.0", + "rehype-raw": "^5.0.0", + "rehype-react": "^6.0.0", + "rehype-stringify": "^8.0.0", + "remark-emoji": "^2.1.0", + "remark-parse": "^8.0.3", + "remark-rehype": "^8.0.0", + "tabbable": "^3.0.0", + "text-diff": "^1.0.1", + "unified": "^9.2.0", + "unist-util-visit": "^2.0.3", + "url-parse": "^1.5.0", + "uuid": "^8.3.0", + "vfile": "^4.2.0" + }, + "peerDependencies": { + "@elastic/datemath": "^5.0.2", + "@types/react": "^16.9.34", + "@types/react-dom": "^16.9.6", + "moment": "^2.13.0", + "prop-types": "^15.5.0", + "react": "^16.12", + "react-dom": "^16.12", + "typescript": "^4.0.5" + } + }, + "node_modules/@elastic/eui/node_modules/react-is": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", + "license": "MIT" + }, + "node_modules/@elastic/eui/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", + "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", + "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz", + "integrity": "sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/numeral": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-0.0.28.tgz", + "integrity": "sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw==", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz", + "integrity": "sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-input-autosize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz", + "integrity": "sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/refractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/refractor/-/refractor-3.0.2.tgz", + "integrity": "sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "*" + } + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", + "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "license": "MIT" + }, + "node_modules/@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "license": "MIT", + "dependencies": { + "vfile-message": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "license": "MIT" + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "license": "MIT" + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz", + "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz", + "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^3.0.1", + "unist-util-is": "^4.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", + "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", + "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-ace": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-7.0.5.tgz", + "integrity": "sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg==", + "license": "MIT", + "dependencies": { + "brace": "^0.11.1", + "diff-match-patch": "^1.0.4", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0", + "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-dropzone": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.1.tgz", + "integrity": "sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-focus-on": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-focus-on/-/react-focus-on-3.8.0.tgz", + "integrity": "sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw==", + "license": "MIT", + "dependencies": { + "aria-hidden": "^1.2.2", + "react-focus-lock": "^2.9.2", + "react-remove-scroll": "^2.5.5", + "react-style-singleton": "^2.2.0", + "tslib": "^2.3.1", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-input-autosize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/redisinsight-plugin-sdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz", + "integrity": "sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA==", + "license": "MIT" + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz", + "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^6.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", + "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "hast-to-hyperscript": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-8.0.0.tgz", + "integrity": "sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==", + "license": "MIT", + "dependencies": { + "hast-util-to-html": "^7.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", + "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", + "dependencies": { + "mdast-util-to-hast": "^10.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==", + "license": "MIT" + }, + "node_modules/text-diff": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/text-diff/-/text-diff-1.0.1.tgz", + "integrity": "sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA==", + "license": "Apache-2.0" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/trim": { + "version": "0.0.3" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "license": "0BSD" + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "resolved": "../node_modules/vite", + "link": true + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/redisinsight/ui/src/packages/ri-explain/package.json b/redisinsight/ui/src/packages/ri-explain/package.json index e2b3728051..563085dc81 100644 --- a/redisinsight/ui/src/packages/ri-explain/package.json +++ b/redisinsight/ui/src/packages/ri-explain/package.json @@ -56,9 +56,11 @@ "redisinsight-plugin-sdk": "^1.1.0", "uuid": "^14.0.0" }, - "resolutions": { + "overrides": { "trim": "0.0.3", - "@elastic/eui/**/prismjs": "~1.30.0", - "**/semver": "^7.5.2" + "@elastic/eui": { "prismjs": "~1.30.0" }, + "semver": "^7.5.2", + "lodash": "^4.18.1", + "lodash-es": "^4.18.1" } } diff --git a/redisinsight/ui/src/packages/ri-explain/yarn.lock b/redisinsight/ui/src/packages/ri-explain/yarn.lock deleted file mode 100644 index ff9411cf9b..0000000000 --- a/redisinsight/ui/src/packages/ri-explain/yarn.lock +++ /dev/null @@ -1,1857 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@antv/hierarchy@^0.6.8": - version "0.6.11" - resolved "https://registry.yarnpkg.com/@antv/hierarchy/-/hierarchy-0.6.11.tgz#244d6820347170e0107f3611802d1e5bb089ca7a" - integrity sha512-RJVhEMCuu4vj+Dt25lXIiNdd7jaqm/fqWGYikiELha4S5tnzdJoTUaUvvpfWlxLx4B0RsS9XRwBs1bOKN71TKg== - dependencies: - "@antv/util" "^2.0.7" - -"@antv/util@^2.0.7": - version "2.0.17" - resolved "https://registry.yarnpkg.com/@antv/util/-/util-2.0.17.tgz#e8ef42aca7892815b229269f3dd10c6b3c7597a9" - integrity sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q== - dependencies: - csstype "^3.0.8" - tslib "^2.0.3" - -"@antv/x6-common@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@antv/x6-common/-/x6-common-2.0.12.tgz#99b593110aabe88b59d34e3e6e66ba133c5a7dd9" - integrity sha512-7PcvHGJ2UhrBEtsLI6MaHw6BCMhy22leCH8vCaMvmF32EEQ/491v6DKVPhcpp0dYZNERpfqvAB1w407Aw+bwLA== - dependencies: - lodash-es "^4.17.15" - utility-types "^3.10.0" - -"@antv/x6-geometry@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@antv/x6-geometry/-/x6-geometry-2.0.5.tgz#c158317d74135bedd78c2fdeb76f9c7cfa0ef0aa" - integrity sha512-MId6riEQkxphBpVeTcL4ZNXL4lScyvDEPLyIafvWMcWNTGK0jgkK7N20XSzqt8ltJb0mGUso5s56mrk8ysHu2A== - -"@antv/x6-react-shape@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@antv/x6-react-shape/-/x6-react-shape-2.1.2.tgz#66f1865ff98c4c7c9f7dd96e76c9b6afc95bb09e" - integrity sha512-kNflTM88oyQwfx9H1FQNAK1YdzEnB5vUtlcyU/5WZikbXGuaRmcJUBpSDMJt+AQ8ng3c2joKYQwWHQWeV6RgNw== - -"@antv/x6@^2.1.3": - version "2.9.7" - resolved "https://registry.yarnpkg.com/@antv/x6/-/x6-2.9.7.tgz#d1af6b8a21e67770b8661e81e3548bbfca9e842f" - integrity sha512-lKYaiQqK7E3YaioM3y7/sUEQM2CWSA0IggLq4vRiZwLbmAbswasI3qIsIZ5PpMyLrcmRlOecMkP3S4cMI4xcAg== - dependencies: - "@antv/x6-common" "^2.0.12" - "@antv/x6-geometry" "^2.0.5" - utility-types "^3.10.0" - -"@babel/code-frame@^7.0.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-module-imports@^7.16.7": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.9.2": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@elastic/eui@34.6.0": - version "34.6.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-34.6.0.tgz#a7188bc97d9c3120cd65e52ed423377872b604bd" - integrity sha512-uVMSX0jPJU3LLwD4TRHllyJeTr+Uihh+R5qsFSAzKrCCRZjSfKMmMHKffWhzFyYjG97npdWlMvneXG5q0yobCw== - dependencies: - "@types/chroma-js" "^2.0.0" - "@types/lodash" "^4.14.160" - "@types/numeral" "^0.0.28" - "@types/react-beautiful-dnd" "^13.0.0" - "@types/react-input-autosize" "^2.2.0" - "@types/react-virtualized-auto-sizer" "^1.0.0" - "@types/react-window" "^1.8.2" - "@types/refractor" "^3.0.0" - "@types/resize-observer-browser" "^0.1.5" - "@types/vfile-message" "^2.0.0" - chroma-js "^2.1.0" - classnames "^2.2.6" - lodash "^4.17.21" - mdast-util-to-hast "^10.0.0" - numeral "^2.0.6" - prop-types "^15.6.0" - react-ace "^7.0.5" - react-beautiful-dnd "^13.0.0" - react-dropzone "^11.2.0" - react-focus-on "^3.5.0" - react-input-autosize "^2.2.2" - react-is "~16.3.0" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - refractor "^3.4.0" - rehype-raw "^5.0.0" - rehype-react "^6.0.0" - rehype-stringify "^8.0.0" - remark-emoji "^2.1.0" - remark-parse "^8.0.3" - remark-rehype "^8.0.0" - tabbable "^3.0.0" - text-diff "^1.0.1" - unified "^9.2.0" - unist-util-visit "^2.0.3" - url-parse "^1.5.0" - uuid "^8.3.0" - vfile "^4.2.0" - -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.1.3" - -"@emotion/cache@^11.10.5": - version "11.10.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" - integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/react@^11.7.1": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== - dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== - -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== - -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== - -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@types/chroma-js@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" - integrity sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw== - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/lodash@^4.14.160": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/numeral@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" - integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prismjs@*": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" - integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-beautiful-dnd@^13.0.0": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz#bcec72da719c18c0d8b4a7cb00e7fb443211d6d7" - integrity sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA== - dependencies: - "@types/react" "*" - -"@types/react-input-autosize@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.2.1.tgz#6a335212e7fce1e1a4da56ae2095c8c5c35fbfe6" - integrity sha512-RxzEjd4gbLAAdLQ92Q68/AC+TfsAKTc4evsArUH1aIShIMqQMIMjsxoSnwyjtbFTO/AGIW/RQI94XSdvOxCz/w== - dependencies: - "@types/react" "*" - -"@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-virtualized-auto-sizer@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" - integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== - dependencies: - "@types/react" "*" - -"@types/react-window@^1.8.2": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" - integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/refractor@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/refractor/-/refractor-3.0.2.tgz#2d42128d59f78f84d2c799ffc5ab5cadbcba2d82" - integrity sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg== - dependencies: - "@types/prismjs" "*" - -"@types/resize-observer-browser@^0.1.5": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" - integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/vfile-message@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aria-hidden@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-entities-html4@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" - integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chroma-js@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" - integrity sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -csstype@^3.0.2, csstype@^3.0.8: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -diff-match-patch@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-selector@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.4.0.tgz#59ec4f27aa5baf0841e9c6385c8386bef4d18b17" - integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg== - dependencies: - tslib "^2.0.3" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -focus-lock@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" - integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== - dependencies: - tslib "^2.0.3" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-is-element@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" - integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-html@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" - integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== - dependencies: - ccount "^1.0.0" - comma-separated-tokens "^1.0.0" - hast-util-is-element "^1.0.0" - hast-util-whitespace "^1.0.0" - html-void-elements "^1.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - stringify-entities "^3.0.1" - unist-util-is "^4.0.0" - xtend "^4.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-whitespace@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" - integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inherits@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lodash-es@^4.17.15: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0" - integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prismjs@~1.27.0, prismjs@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" - integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -react-ace@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-7.0.5.tgz#798299fd52ddf3a3dcc92afc5865538463544f01" - integrity sha512-3iI+Rg2bZXCn9K984ll2OF4u9SGcJH96Q1KsUgs9v4M2WePS4YeEHfW2nrxuqJrAkE5kZbxaCE79k6kqK0YBjg== - dependencies: - brace "^0.11.1" - diff-match-patch "^1.0.4" - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - -react-beautiful-dnd@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz#b0f3087a5840920abf8bb2325f1ffa46d8c4d0a2" - integrity sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - dependencies: - "@babel/runtime" "^7.12.13" - -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-dropzone@^11.2.0: - version "11.7.1" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.7.1.tgz#3851bb75b26af0bf1b17ce1449fd980e643b9356" - integrity sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ== - dependencies: - attr-accept "^2.2.2" - file-selector "^0.4.0" - prop-types "^15.8.1" - -react-focus-lock@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" - integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^0.11.6" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-focus-on@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.8.0.tgz#71ba2707a21f67ffa41b71775b1093b2a1c408ee" - integrity sha512-xuH4jUPeRZ4oE0a85d7pA8pPhotb4U2iWK1CBATP/Xao/WEFHUZxxi5+ffWovjjUT7k53mXDm53TE2pvjLccsw== - dependencies: - aria-hidden "^1.2.2" - react-focus-lock "^2.9.2" - react-remove-scroll "^2.5.5" - react-style-singleton "^2.2.0" - tslib "^2.3.1" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@~16.3.0: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-redux@^7.2.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.0, react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.15" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz#84558bcab61a625d13ec37876639bb09c5a3ec0b" - integrity sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg== - -react-window@^1.8.5: - version "1.8.9" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" - integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -redisinsight-plugin-sdk@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redisinsight-plugin-sdk/-/redisinsight-plugin-sdk-1.1.0.tgz#5ac39dc5398b1f73f2357e67ce51e1875fbece4f" - integrity sha512-TtPYfpxVZlwASkO8WFEB8+l6H9N9SVGwVxU0hRGzkEdXZyeQ+Xm/1WwnkGKMaeJyvfpIGrPWVl+lN4pDQ3iqbA== - -redux@^4.0.0, redux@^4.0.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -refractor@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -rehype-raw@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -rehype-react@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" - integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - hast-to-hyperscript "^9.0.0" - -rehype-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" - integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== - dependencies: - hast-util-to-html "^7.1.1" - -remark-emoji@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-parse@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.19.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -stringify-entities@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" - integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - xtend "^4.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2" - integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ== - -text-diff@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/text-diff/-/text-diff-1.0.1.tgz#6c105905435e337857375c9d2f6ca63e453ff565" - integrity sha512-jAnlP3ggZk7FeLX1awaMR8Y2sMyil9P9FXvNjaIJIQBAom1zvpKGGH31htOVrUFp0vlyygmJJpNrbJ4rfjsxrA== - -tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" - integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unified@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -url-parse@^1.5.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-memo-one@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" - integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -uuid@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-14.0.0.tgz#0af883220163d264ffe0c084f6b8a89b9666966d" - integrity sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg== - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@*: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0, vfile@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -"vite@file:../node_modules/vite": - version "6.4.1" - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/redisinsight/ui/src/packages/yarn.lock b/redisinsight/ui/src/packages/yarn.lock deleted file mode 100644 index f48a96cb31..0000000000 --- a/redisinsight/ui/src/packages/yarn.lock +++ /dev/null @@ -1,3087 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" - integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== - dependencies: - "@babel/compat-data" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" - integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== - dependencies: - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" - integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== - dependencies: - "@babel/types" "^7.26.5" - -"@babel/parser@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" - integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== - dependencies: - "@babel/types" "^7.27.0" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/template@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" - integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/traverse@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" - integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.5" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.5" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" - integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" - integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/pluginutils@5": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" - integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/d3-array@*": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" - integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== - -"@types/d3-axis@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" - integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-brush@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" - integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-chord@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" - integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== - -"@types/d3-color@*": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" - integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== - -"@types/d3-contour@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" - integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== - dependencies: - "@types/d3-array" "*" - "@types/geojson" "*" - -"@types/d3-delaunay@*": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" - integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== - -"@types/d3-dispatch@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" - integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== - -"@types/d3-drag@*": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" - integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-dsv@*": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" - integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== - -"@types/d3-ease@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" - integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== - -"@types/d3-fetch@*": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" - integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== - dependencies: - "@types/d3-dsv" "*" - -"@types/d3-force@*": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" - integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== - -"@types/d3-format@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" - integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== - -"@types/d3-geo@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" - integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== - dependencies: - "@types/geojson" "*" - -"@types/d3-hierarchy@*": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" - integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== - -"@types/d3-interpolate@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" - integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== - dependencies: - "@types/d3-color" "*" - -"@types/d3-path@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" - integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== - -"@types/d3-polygon@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" - integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== - -"@types/d3-quadtree@*": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" - integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== - -"@types/d3-random@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" - integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== - -"@types/d3-scale-chromatic@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" - integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== - -"@types/d3-scale@*": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== - dependencies: - "@types/d3-time" "*" - -"@types/d3-selection@*": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" - integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== - -"@types/d3-shape@*": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.7.tgz#2b7b423dc2dfe69c8c93596e673e37443348c555" - integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== - dependencies: - "@types/d3-path" "*" - -"@types/d3-time-format@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" - integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== - -"@types/d3-time@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" - integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== - -"@types/d3-timer@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" - integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== - -"@types/d3-transition@*": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" - integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-zoom@*": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" - integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== - dependencies: - "@types/d3-interpolate" "*" - "@types/d3-selection" "*" - -"@types/d3@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" - integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== - dependencies: - "@types/d3-array" "*" - "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-delaunay" "*" - "@types/d3-dispatch" "*" - "@types/d3-drag" "*" - "@types/d3-dsv" "*" - "@types/d3-ease" "*" - "@types/d3-fetch" "*" - "@types/d3-force" "*" - "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" - "@types/d3-polygon" "*" - "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" - "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" - "@types/d3-transition" "*" - "@types/d3-zoom" "*" - -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/file-saver@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.7.tgz#8dbb2f24bdc7486c54aa854eb414940bbd056f7d" - integrity sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A== - -"@types/geojson@*": - version "7946.0.15" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.15.tgz#f9d55fd5a0aa2de9dc80b1b04e437538b7298868" - integrity sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.14": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/node@*": - version "22.10.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.7.tgz#14a1ca33fd0ebdd9d63593ed8d3fbc882a6d28d7" - integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== - dependencies: - undici-types "~6.20.0" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001688: - version "1.0.30001692" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" - integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c" - integrity sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ== - dependencies: - chalk "^4.1.2" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ejs@^3.1.9: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.73: - version "1.5.83" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz#3f74078f0c83e24bf7e692eaa855a998d1bec34f" - integrity sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.25.0, esbuild@^0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -fast-glob@^3.2.11: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -fs-extra@^11.1.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.1.tgz#1c3aef9a59d680e611b53dcd24bb8639cef064d9" - integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== - dependencies: - foreground-child "^3.1.0" - jackspeak "^4.0.1" - minimatch "^10.0.0" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.0.tgz#c489c079f2b636dc4cbe9b0312a13ff1282e561b" - integrity sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw== - dependencies: - "@isaacs/cliui" "^8.0.2" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.17.21: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== - -lru-cache@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" - integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" - integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.3.tgz#7ac210a2d36f81ec28b736134810f7ba4418cdb6" - integrity sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" - integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.20.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" - integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== - dependencies: - glob "^11.0.0" - package-json-from-dist "^1.0.0" - -rollup-plugin-css-only@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-css-only/-/rollup-plugin-css-only-4.5.2.tgz#f3a74bf889b538f3cc73c40b391cbc6b4bbb0ee4" - integrity sha512-7rj9+jB17Pz8LNcPgtMUb16JcgD8lxQMK9HcGfAVhMK3na/WXes3oGIo5QsrQQVqtgAU6q6KnQNXJrYunaUIQQ== - dependencies: - "@rollup/pluginutils" "5" - -rollup@^4.34.9: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.1: - version "7.8.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" - integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== - dependencies: - tslib "^2.1.0" - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.3, semver@^7.5.4: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.4.tgz#2edd9a4dcefc96649e2e2cb12f637b1f1d92a190" - integrity sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -tslib@^2.1.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" - integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -vite-plugin-ejs@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vite-plugin-ejs/-/vite-plugin-ejs-1.7.0.tgz#c0229729d5a26e9eb57b8abadc75f7070d470d23" - integrity sha512-JNP3zQDC4mSbfoJ3G73s5mmZITD8NGjUmLkq4swxyahy/W0xuokK9U9IJGXw7KCggq6UucT6hJ0p+tQrNtqTZw== - dependencies: - ejs "^3.1.9" - -vite-plugin-static-copy@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.2.tgz#1b6be634c21541d6363dd72ab7870b1ce14bfa53" - integrity sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg== - dependencies: - chokidar "^3.5.3" - fast-glob "^3.2.11" - fs-extra "^11.1.0" - p-map "^7.0.3" - picocolors "^1.0.0" - -vite@^6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.4.3.tgz#85a164db7ce706f2a776812efa2b340f1721858e" - integrity sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A== - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1, yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.spec.tsx b/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.spec.tsx index bfa4d9b5d5..0481eed69b 100644 --- a/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.spec.tsx +++ b/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.spec.tsx @@ -11,26 +11,15 @@ import { waitFor, waitForRedisUiSelectVisible, } from 'uiSrc/utils/test-utils' -import { - AgentMemoryBackendType, - AgentMemoryEndpoint, -} from 'uiSrc/slices/interfaces/agentMemory' +import { AgentMemoryEndpointFactory } from 'uiSrc/mocks/factories/agent-memory/AgentMemoryEndpoint.factory' +import { AgentMemoryBackendType } from 'uiSrc/slices/interfaces/agentMemory' import EndpointConnectionForm, { EndpointConnectionFormProps, } from './EndpointConnectionForm' -const buildEndpoint = ( - overrides: Partial = {}, -): AgentMemoryEndpoint => ({ - id: faker.string.uuid(), - name: faker.lorem.words(2), - url: faker.internet.url(), - backendType: AgentMemoryBackendType.Oss, - ...overrides, -}) - const CLOUD_BACKEND_LABEL = 'Redis Cloud (hosted)' +const OSS_BACKEND_LABEL = 'OSS server (self-hosted)' describe('EndpointConnectionForm', () => { const defaultProps: EndpointConnectionFormProps = { @@ -59,6 +48,12 @@ describe('EndpointConnectionForm', () => { await userEvent.click(screen.getByText(CLOUD_BACKEND_LABEL)) } + const switchBackendToOss = async () => { + await userEvent.click(screen.getByTestId('endpoint-form-backend-select')) + await waitForRedisUiSelectVisible() + await userEvent.click(screen.getByText(OSS_BACKEND_LABEL)) + } + beforeEach(() => { cleanup() jest.clearAllMocks() @@ -142,7 +137,7 @@ describe('EndpointConnectionForm', () => { }) it('should require api key when an oss endpoint is switched to cloud backend', async () => { - const editEndpoint = buildEndpoint({ + const editEndpoint = AgentMemoryEndpointFactory.build({ backendType: AgentMemoryBackendType.Oss, }) renderComponent({ editEndpoint }) @@ -182,7 +177,7 @@ describe('EndpointConnectionForm', () => { }) it('should not require api key when editing a cloud endpoint (stored key is kept)', async () => { - const editEndpoint = buildEndpoint({ + const editEndpoint = AgentMemoryEndpointFactory.build({ backendType: AgentMemoryBackendType.Cloud, storeId: faker.string.alphanumeric(8), }) @@ -197,7 +192,7 @@ describe('EndpointConnectionForm', () => { it('should call onSubmit with only the changed fields', async () => { const onSubmit = jest.fn() - const editEndpoint = buildEndpoint({ + const editEndpoint = AgentMemoryEndpointFactory.build({ backendType: AgentMemoryBackendType.Oss, }) const newName = faker.lorem.words(3) @@ -224,7 +219,7 @@ describe('EndpointConnectionForm', () => { it('should call onSubmit without the untouched api key when editing a cloud endpoint', async () => { const onSubmit = jest.fn() - const editEndpoint = buildEndpoint({ + const editEndpoint = AgentMemoryEndpointFactory.build({ backendType: AgentMemoryBackendType.Cloud, storeId: faker.string.alphanumeric(8), }) @@ -243,6 +238,27 @@ describe('EndpointConnectionForm', () => { }) }) + it('should clear and omit store id when switching a cloud endpoint to oss', async () => { + const onSubmit = jest.fn() + const editEndpoint = AgentMemoryEndpointFactory.build({ + backendType: AgentMemoryBackendType.Cloud, + storeId: faker.string.alphanumeric(8), + }) + renderComponent({ editEndpoint, onSubmit }) + + await switchBackendToOss() + fireEvent.click(screen.getByTestId('endpoint-form-submit-button')) + + await waitFor(() => { + expect(onSubmit).toHaveBeenCalledWith({ + backendType: AgentMemoryBackendType.Oss, + }) + }) + + await switchBackendToCloud() + expect(screen.getByTestId('endpoint-form-store-id-input')).toHaveValue('') + }) + it('should call onCancel when cancel button is clicked', async () => { const onCancel = jest.fn() renderComponent({ onCancel }) @@ -253,7 +269,7 @@ describe('EndpointConnectionForm', () => { }) it('should disable submit button when isLoading is true', async () => { - const editEndpoint = buildEndpoint() + const editEndpoint = AgentMemoryEndpointFactory.build() renderComponent({ editEndpoint, isLoading: true }) await waitFor(() => { diff --git a/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.tsx b/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.tsx index 2712d5ebb5..fe6e513c9c 100644 --- a/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.tsx +++ b/redisinsight/ui/src/pages/agent-memory/home/components/connection-form/EndpointConnectionForm.tsx @@ -103,6 +103,9 @@ const EndpointConnectionForm = (props: EndpointConnectionFormProps) => { const handleSubmit = (values: ConnectionFormValues) => { const updates = getFormUpdates(values, editEndpoint || {}) + if (values.backendType === AgentMemoryBackendType.Oss) { + delete updates.storeId + } onSubmit(updates) } @@ -176,7 +179,12 @@ const EndpointConnectionForm = (props: EndpointConnectionFormProps) => { options={BACKEND_TYPE_OPTIONS} value={values.backendType} valueRender={defaultValueRender} - onChange={(value) => setFieldValue('backendType', value)} + onChange={(value) => { + setFieldValue('backendType', value) + if (value === AgentMemoryBackendType.Oss) { + setFieldValue('storeId', '') + } + }} /> [] = [ +export const getAzureDatabasesColumns = ( + t: TFunction, +): ColumnDef[] => [ { id: 'row-selection', maxSize: 20, @@ -34,7 +37,7 @@ export const AZURE_DATABASES_COLUMNS: ColumnDef[] = [ }, { id: 'name', - header: 'Database Name', + header: t('autodiscover.azure.column.databaseName'), accessorKey: 'name', enableSorting: true, cell: ({ getValue }) => {getValue() as string}, @@ -46,10 +49,10 @@ export const AZURE_DATABASES_COLUMNS: ColumnDef[] = [ isHeaderCustom: true, header: () => ( } /> @@ -62,7 +65,7 @@ export const AZURE_DATABASES_COLUMNS: ColumnDef[] = [ }, { id: 'location', - header: 'Region', + header: t('autodiscover.azure.column.region'), accessorKey: 'location', enableSorting: true, cell: ({ getValue }) => {getValue() as string}, @@ -74,10 +77,10 @@ export const AZURE_DATABASES_COLUMNS: ColumnDef[] = [ isHeaderCustom: true, header: () => ( } /> diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabases/AzureDatabases.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabases/AzureDatabases.tsx index d763da1d70..f8cba932de 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabases/AzureDatabases.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabases/AzureDatabases.tsx @@ -1,5 +1,6 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' +import { useTranslation } from 'uiSrc/i18n' import { Spacer } from 'uiSrc/components/base/layout' import { AutodiscoveryPageTemplate } from 'uiSrc/templates' import { @@ -31,7 +32,7 @@ import { } from 'uiSrc/components/base/forms/radio-group/RadioGroup' import { - AZURE_DATABASES_COLUMNS, + getAzureDatabasesColumns, MAX_DATABASES_SELECTION, } from './AzureDatabases.constants' @@ -66,6 +67,8 @@ const AzureDatabases = ({ onRefresh, onManualConnection, }: Props) => { + const { t } = useTranslation() + const columns = useMemo(() => getAzureDatabasesColumns(t), [t]) const [items, setItems] = useState(databases) useEffect(() => { @@ -141,14 +144,14 @@ const AzureDatabases = ({
- Subscription:{' '} + {t('autodiscover.azure.databases.subscription')}{' '} {subscriptionName} @@ -157,11 +160,11 @@ const AzureDatabases = ({ icon={RefreshIcon} onClick={onRefresh} disabled={loading} - aria-label="Refresh databases" + aria-label={t('autodiscover.azure.databases.refreshAria')} data-testid="btn-refresh-databases" /> | - Auth: + {t('autodiscover.azure.databases.auth')} onAuthTypeChange(value as AzureAuthType)} @@ -175,7 +178,7 @@ const AzureDatabases = ({ > - Microsoft Entra ID (Recommended) + {t('autodiscover.azure.databases.authEntraId')} @@ -185,7 +188,9 @@ const AzureDatabases = ({ data-testid="auth-type-access-key" > - Access Key + + {t('autodiscover.azure.databases.authAccessKey')} + @@ -202,7 +207,7 @@ const AzureDatabases = ({ onRowClick={handleRowClick} getRowId={(row) => row.id} getRowCanSelect={canSelectRow} - columns={AZURE_DATABASES_COLUMNS} + columns={columns} data={items} defaultSorting={[{ id: 'name', desc: false }]} paginationEnabled={items.length > 10} @@ -214,9 +219,7 @@ const AzureDatabases = ({ ) : ( ) } @@ -230,19 +233,22 @@ const AzureDatabases = ({ {isMaxSelected ? ( - Maximum of {MAX_DATABASES_SELECTION} databases can be added at a - time. + {t('autodiscover.azure.databases.maxSelection', { + max: MAX_DATABASES_SELECTION, + })} ) : (
)} - Cancel + + {t('autodiscover.azure.button.cancel')} + - Manual Connection + {t('autodiscover.azure.button.manualConnection')} - Add{' '} {selectedDatabases.length > 0 - ? `(${selectedDatabases.length})` - : ''}{' '} - Database - {selectedDatabases.length !== 1 ? 's' : ''} + ? t('autodiscover.azure.databases.addButton', { + count: selectedDatabases.length, + }) + : t('autodiscover.azure.databases.addButtonEmpty')} diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.spec.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.spec.tsx index 0815c1e045..f4afd61d8b 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.spec.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.spec.tsx @@ -110,6 +110,7 @@ describe('AzureDatabasesPage', () => { expect(fetchDatabasesAzure).toHaveBeenCalledWith( mockAccount.id, mockSubscription.subscriptionId, + undefined, ) }) @@ -177,6 +178,7 @@ describe('AzureDatabasesPage', () => { expect(fetchDatabasesAzure).toHaveBeenCalledWith( mockAccount.id, mockSubscription.subscriptionId, + undefined, ) }) }) diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.tsx index 3d0de01600..9763fbe065 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-databases/AzureDatabasesPage.tsx @@ -4,6 +4,7 @@ import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { Pages } from 'uiSrc/constants' import { setTitle } from 'uiSrc/utils' +import i18n, { useTranslation } from 'uiSrc/i18n' import { Text } from 'uiSrc/components/base/text' import { fetchInstancesAction } from 'uiSrc/slices/instances/instances' import { addMessageNotification } from 'uiSrc/slices/app/notifications' @@ -18,7 +19,10 @@ import { AzureRedisDatabase, ImportAzureDatabaseResponse, } from 'uiSrc/slices/interfaces' -import { azureAuthAccountSelector } from 'uiSrc/slices/oauth/azure' +import { + azureAuthAccountSelector, + azureAuthTenantSelector, +} from 'uiSrc/slices/oauth/azure' import { addDatabasesAzureAction, azureSelector, @@ -34,8 +38,10 @@ const groupErrorsByMessage = ( ): Record => failedResults.reduce>((acc, r) => { const db = selectedDatabases.find((db) => db.id === r.id) - const dbName = db?.name || 'database' - const errorMessage = r.message || 'Failed to add database' + const dbName = + db?.name || i18n.t('autodiscover.azure.databases.unknownDatabase') + const errorMessage = + r.message || i18n.t('autodiscover.azure.databases.addFailedDefault') if (!acc[errorMessage]) { acc[errorMessage] = [] @@ -68,7 +74,9 @@ const showErrorToast = ( errorMessages.DEFAULT( <>{errorList}, () => {}, - `Failed to add ${failedResults.length} database${failedResults.length > 1 ? 's' : ''}`, + i18n.t('autodiscover.azure.databases.addFailedTitle', { + count: failedResults.length, + }), ), { variant: riToast.Variant.Danger, @@ -78,9 +86,11 @@ const showErrorToast = ( } const AzureDatabasesPage = () => { + const { t } = useTranslation() const history = useHistory() const dispatch = useAppDispatch() const account = useAppSelector(azureAuthAccountSelector) + const tenant = useAppSelector(azureAuthTenantSelector) const { loading, error, databases, selectedSubscription, loaded } = useAppSelector(azureSelector) @@ -105,12 +115,16 @@ const AzureDatabasesPage = () => { return } - setTitle('Azure Databases') + setTitle(t('autodiscover.azure.databases.pageTitle')) // Only fetch if not already loaded if (!loaded.databases) { dispatch( - fetchDatabasesAzure(account.id, selectedSubscription.subscriptionId), + fetchDatabasesAzure( + account.id, + selectedSubscription.subscriptionId, + tenant ?? undefined, + ), ) } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -138,8 +152,11 @@ const AzureDatabasesPage = () => { addMessageNotification( successMessages.ADDED_NEW_INSTANCE( successResults.length > 1 - ? `${successResults.length} databases` - : successDb?.name || 'Database', + ? t('autodiscover.azure.databases.addedMultiple', { + count: successResults.length, + }) + : successDb?.name || + t('autodiscover.azure.databases.defaultDatabaseName'), ), ), ) @@ -160,7 +177,12 @@ const AzureDatabasesPage = () => { const databaseIds = selectedDatabases.map((db) => db.id) const results = await dispatch( - addDatabasesAzureAction(account.id, databaseIds, authType), + addDatabasesAzureAction( + account.id, + databaseIds, + authType, + tenant ?? undefined, + ), ) const successResults = results.filter( @@ -189,7 +211,11 @@ const AzureDatabasesPage = () => { if (account?.id && selectedSubscription) { dispatch(clearDatabasesAzure()) dispatch( - fetchDatabasesAzure(account.id, selectedSubscription.subscriptionId), + fetchDatabasesAzure( + account.id, + selectedSubscription.subscriptionId, + tenant ?? undefined, + ), ) setSelectedDatabases([]) } diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-manual-connection/AzureManualConnectionForm.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-manual-connection/AzureManualConnectionForm.tsx index 055da2557e..fd7e2e5ab2 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-manual-connection/AzureManualConnectionForm.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-manual-connection/AzureManualConnectionForm.tsx @@ -14,6 +14,7 @@ import { validateField, } from 'uiSrc/utils' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' export interface AzureManualConnectionFormValues { host: string @@ -32,6 +33,7 @@ export interface Props { const AzureManualConnectionForm = (props: Props) => { const { formik } = props + const { t } = useTranslation() return (
@@ -39,12 +41,15 @@ const AzureManualConnectionForm = (props: Props) => { {/* Database alias */} - + { {/* Host and Port */} - + { formik.setFieldValue('host', validateField(value.trim())) @@ -74,13 +82,16 @@ const AzureManualConnectionForm = (props: Props) => { - + formik.setFieldValue('port', value)} value={Number(formik.values.port)} min={0} @@ -96,17 +107,17 @@ const AzureManualConnectionForm = (props: Props) => { - Authentication will use your Azure Entra ID credentials + {t('autodiscover.azure.manual.entraCredentialsInfo')} - + { {/* Timeout */} - + formik.setFieldValue('timeout', value)} value={Number(formik.values.timeout)} min={1} @@ -145,14 +156,14 @@ const AzureManualConnectionForm = (props: Props) => { - TLS Settings + {t('autodiscover.azure.manual.tlsSettings')} - TLS is always enabled for Azure Cache for Redis connections. + {t('autodiscover.azure.manual.tlsAlwaysEnabled')} @@ -164,7 +175,7 @@ const AzureManualConnectionForm = (props: Props) => { id="verifyServerCert" name="verifyServerCert" labelSize="M" - label="Verify server certificate" + label={t('autodiscover.azure.manual.verifyServerCert')} checked={!!formik.values.verifyServerCert} onChange={formik.handleChange} data-testid="verify-server-cert" @@ -174,8 +185,7 @@ const AzureManualConnectionForm = (props: Props) => { - Recommended for production. Validates that the server - certificate matches the hostname. + {t('autodiscover.azure.manual.verifyServerCertInfo')} @@ -187,7 +197,7 @@ const AzureManualConnectionForm = (props: Props) => { id="sni" name="sni" labelSize="M" - label="Use SNI" + label={t('autodiscover.azure.manual.useSni')} checked={!!formik.values.sni} onChange={(e: ChangeEvent) => { // Pre-fill servername with host value when enabling SNI @@ -203,15 +213,17 @@ const AzureManualConnectionForm = (props: Props) => { - Enable SNI when connecting via Private Link using an IP address. - Enter the original Redis hostname as the Server Name. + {t('autodiscover.azure.manual.sniInfo')} {formik.values.sni && ( - + = {} if (!values.host) { - errs.host = 'Host is required' + errs.host = i18n.t('autodiscover.azure.manual.hostRequired') } if (!values.port) { - errs.port = 'Port is required' + errs.port = i18n.t('autodiscover.azure.manual.portRequired') } if (!values.name) { - errs.name = 'Database alias is required' + errs.name = i18n.t('autodiscover.azure.manual.aliasRequired') } if (values.sni && !values.servername) { - errs.servername = 'Server Name is required when SNI is enabled' + errs.servername = i18n.t('autodiscover.azure.manual.serverNameRequired') } return errs } const AzureManualConnectionPage = () => { + const { t } = useTranslation() const history = useHistory() const dispatch = useAppDispatch() const account = useAppSelector(azureAuthAccountSelector) @@ -82,7 +84,7 @@ const AzureManualConnectionPage = () => { // Send telemetry only once on initial page load (skip if not authenticated) useEffect(() => { if (!account) return - setTitle('Azure Manual Connection') + setTitle(i18n.t('autodiscover.azure.manual.pageTitle')) sendEventTelemetry({ event: TelemetryEvent.AZURE_MANUAL_CONNECTION_OPENED, }) @@ -175,9 +177,9 @@ const AzureManualConnectionPage = () => {
@@ -190,7 +192,7 @@ const AzureManualConnectionPage = () => { - Cancel + {t('autodiscover.azure.button.cancel')} { loading={loading} onClick={() => formik.handleSubmit()} > - Add Database + {t('autodiscover.azure.button.addDatabase')} diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.constants.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.constants.tsx index c95024744f..9296190663 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.constants.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.constants.tsx @@ -1,19 +1,22 @@ import React from 'react' +import { TFunction } from 'i18next' import { type ColumnDef, Table } from 'uiSrc/components/base/layout/table' import { AzureSubscription } from 'uiSrc/slices/interfaces' import { Text } from 'uiSrc/components/base/text' import { ColumnHeader } from 'uiSrc/components/column-header' import { DescriptionsTooltip } from 'uiSrc/pages/autodiscover-azure/components' -import { AZURE_SUBSCRIPTION_STATE_DESCRIPTIONS } from 'uiSrc/pages/autodiscover-azure/constants' +import { getAzureSubscriptionStateDescriptions } from 'uiSrc/pages/autodiscover-azure/constants' -export const AZURE_SUBSCRIPTIONS_COLUMNS: ColumnDef[] = [ +export const getAzureSubscriptionsColumns = ( + t: TFunction, +): ColumnDef[] => [ { id: 'row-selection', maxSize: 15, size: 15, isHeaderCustom: true, - header: '#', + header: t('autodiscover.azure.column.number'), cell: ({ row }) => ( [] = [ }, { id: 'displayName', - header: 'Subscription Name', + header: t('autodiscover.azure.column.subscriptionName'), accessorKey: 'displayName', enableSorting: true, cell: ({ getValue }) => {getValue() as string}, }, { id: 'subscriptionId', - header: 'Subscription ID', + header: t('autodiscover.azure.column.subscriptionId'), accessorKey: 'subscriptionId', enableSorting: true, cell: ({ getValue }) => {getValue() as string}, @@ -42,10 +45,10 @@ export const AZURE_SUBSCRIPTIONS_COLUMNS: ColumnDef[] = [ isHeaderCustom: true, header: () => ( } /> diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.spec.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.spec.tsx index 57981c8ea4..a5b71ec16c 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.spec.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.spec.tsx @@ -3,6 +3,7 @@ import { faker } from '@faker-js/faker' import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' import { AzureSubscription } from 'uiSrc/slices/interfaces' +import { azureAuthTenantSelector } from 'uiSrc/slices/oauth/azure' import AzureSubscriptions, { Props } from './AzureSubscriptions' jest.mock('uiSrc/slices/oauth/azure', () => ({ @@ -12,8 +13,12 @@ jest.mock('uiSrc/slices/oauth/azure', () => ({ username: 'test@example.com', name: 'Test User', }), + azureAuthTenantSelector: jest.fn().mockReturnValue(null), })) +const mockedAzureAuthTenantSelector = + azureAuthTenantSelector as unknown as jest.Mock + const mockSubscription = (): AzureSubscription => ({ subscriptionId: faker.string.uuid(), displayName: faker.company.name(), @@ -58,6 +63,20 @@ describe('AzureSubscriptions', () => { expect(screen.getByText('test@example.com')).toBeInTheDocument() }) + it('should not render the active tenant when none is set', () => { + mockedAzureAuthTenantSelector.mockReturnValue(null) + renderComponent() + expect(screen.queryByTestId('azure-active-tenant')).not.toBeInTheDocument() + }) + + it('should render the active tenant when one is set', () => { + mockedAzureAuthTenantSelector.mockReturnValue('your-tenant.onmicrosoft.com') + renderComponent() + const tenant = screen.getByTestId('azure-active-tenant') + expect(tenant).toBeInTheDocument() + expect(tenant).toHaveTextContent('your-tenant.onmicrosoft.com') + }) + it('should call onSwitchAccount when switch account button is clicked', () => { const onSwitchAccount = jest.fn() renderComponent({ onSwitchAccount }) diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.tsx index 22dcf4e5aa..54e1101c95 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptions/AzureSubscriptions.tsx @@ -1,6 +1,7 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' +import { useTranslation } from 'uiSrc/i18n' import { Spacer } from 'uiSrc/components/base/layout' import { AutodiscoveryPageTemplate } from 'uiSrc/templates' import { @@ -16,7 +17,10 @@ import { Header, } from 'uiSrc/components/auto-discover' import { AzureSubscription } from 'uiSrc/slices/interfaces' -import { azureAuthAccountSelector } from 'uiSrc/slices/oauth/azure' +import { + azureAuthAccountSelector, + azureAuthTenantSelector, +} from 'uiSrc/slices/oauth/azure' import { Text } from 'uiSrc/components/base/text' import { EmptyButton, @@ -27,7 +31,7 @@ import { import { Loader } from 'uiSrc/components/base/display' import { RefreshIcon } from 'uiSrc/components/base/icons' -import { AZURE_SUBSCRIPTIONS_COLUMNS } from './AzureSubscriptions.constants' +import { getAzureSubscriptionsColumns } from './AzureSubscriptions.constants' export interface Props { subscriptions: AzureSubscription[] @@ -52,7 +56,10 @@ const AzureSubscriptions = ({ onRefresh, onManualConnection, }: Props) => { + const { t } = useTranslation() + const columns = useMemo(() => getAzureSubscriptionsColumns(t), [t]) const account = useAppSelector(azureAuthAccountSelector) + const tenant = useAppSelector(azureAuthTenantSelector) const [items, setItems] = useState(subscriptions) const [selectedId, setSelectedId] = useState(null) @@ -113,30 +120,38 @@ const AzureSubscriptions = ({
- Signed in as{' '} + {t('autodiscover.azure.subscriptions.signedInAs')}{' '} {account.username} + {tenant && ( + + {t('autodiscover.azure.subscriptions.tenant')}{' '} + + {tenant} + + + )} - Switch account + {t('autodiscover.azure.subscriptions.switchAccount')} @@ -151,7 +166,7 @@ const AzureSubscriptions = ({ onRowSelectionChange={handleSelectionChange} onRowClick={handleRowClick} getRowId={(row) => row.subscriptionId} - columns={AZURE_SUBSCRIPTIONS_COLUMNS} + columns={columns} data={items} defaultSorting={[{ id: 'displayName', desc: false }]} paginationEnabled={items.length > 10} @@ -163,9 +178,7 @@ const AzureSubscriptions = ({ ) : ( ) } @@ -178,19 +191,21 @@ const AzureSubscriptions = ({
- Cancel + + {t('autodiscover.azure.button.cancel')} + - Manual Connection + {t('autodiscover.azure.button.manualConnection')} - Show Databases + {t('autodiscover.azure.subscriptions.showDatabases')} diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.spec.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.spec.tsx index cb247ee09e..d6a28ce7cf 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.spec.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.spec.tsx @@ -16,7 +16,11 @@ import { clearSubscriptionsAzure, } from 'uiSrc/slices/instances/azure' import { useAzureAuth } from 'uiSrc/components/hooks/useAzureAuth' -import { azureAuthAccountSelector } from 'uiSrc/slices/oauth/azure' +import { + azureAuthAccountSelector, + azureAuthTenantSelector, +} from 'uiSrc/slices/oauth/azure' +import { AzureLoginSource } from 'uiSrc/slices/interfaces' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { AzureAccountFactory } from 'uiSrc/mocks/factories/cloud/AzureAccount.factory' @@ -40,6 +44,7 @@ jest.mock('uiSrc/components/hooks/useAzureAuth', () => ({ jest.mock('uiSrc/slices/oauth/azure', () => ({ ...jest.requireActual('uiSrc/slices/oauth/azure'), azureAuthAccountSelector: jest.fn(), + azureAuthTenantSelector: jest.fn(), })) jest.mock('uiSrc/telemetry', () => ({ @@ -74,6 +79,8 @@ let store: typeof mockedStore const mockedAzureSelector = azureSelector as jest.Mock const mockedAzureAuthAccountSelector = azureAuthAccountSelector as jest.Mock +const mockedAzureAuthTenantSelector = azureAuthTenantSelector as jest.Mock +const mockedFetchSubscriptionsAzure = fetchSubscriptionsAzure as jest.Mock const mockedUseAzureAuth = useAzureAuth as jest.Mock const mockedSendEventTelemetry = sendEventTelemetry as jest.Mock @@ -86,6 +93,8 @@ describe('AzureSubscriptionsPage', () => { store.clearActions() mockedAzureSelector.mockReturnValue(defaultAzureState) mockedAzureAuthAccountSelector.mockReturnValue(mockAccount) + mockedAzureAuthTenantSelector.mockReturnValue(undefined) + mockedFetchSubscriptionsAzure.mockClear() mockedUseAzureAuth.mockReturnValue({ initiateLogin: mockInitiateLogin, account: mockAccount, @@ -117,16 +126,47 @@ describe('AzureSubscriptionsPage', () => { render(, { store }) - expect(fetchSubscriptionsAzure).toHaveBeenCalledWith(mockAccount.id) + expect(fetchSubscriptionsAzure).toHaveBeenCalledWith( + mockAccount.id, + undefined, + ) + }) + + it('should fetch subscriptions for the active tenant', () => { + const tenant = '11111111-1111-1111-1111-111111111111' + mockedAzureSelector.mockReturnValue({ + ...defaultAzureState, + loaded: { ...defaultAzureState.loaded, subscriptions: false }, + }) + mockedAzureAuthTenantSelector.mockReturnValue(tenant) + + render(, { store }) + + expect(fetchSubscriptionsAzure).toHaveBeenCalledWith(mockAccount.id, tenant) }) describe('switch account', () => { - it('should call initiateLogin when switch account button is clicked', () => { + it('should open the sign-in dialog when switch account is clicked', () => { + render(, { store }) + + fireEvent.click(screen.getByTestId('btn-switch-account')) + + expect( + screen.getByTestId('azure-sign-in-dialog-sign-in'), + ).toBeInTheDocument() + expect(mockInitiateLogin).not.toHaveBeenCalled() + }) + + it('should call initiateLogin when signing in from the dialog', () => { render(, { store }) fireEvent.click(screen.getByTestId('btn-switch-account')) + fireEvent.click(screen.getByTestId('azure-sign-in-dialog-sign-in')) - expect(mockInitiateLogin).toHaveBeenCalledTimes(1) + expect(mockInitiateLogin).toHaveBeenCalledWith( + AzureLoginSource.Autodiscovery, + undefined, + ) }) it('should send telemetry when switch account is clicked', () => { @@ -147,7 +187,10 @@ describe('AzureSubscriptionsPage', () => { fireEvent.click(screen.getByTestId('btn-refresh-subscriptions')) expect(clearSubscriptionsAzure).toHaveBeenCalled() - expect(fetchSubscriptionsAzure).toHaveBeenCalledWith(mockAccount.id) + expect(fetchSubscriptionsAzure).toHaveBeenCalledWith( + mockAccount.id, + undefined, + ) }) }) }) diff --git a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.tsx b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.tsx index 2881ad9c58..a3d43dc4ba 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/azure-subscriptions/AzureSubscriptionsPage.tsx @@ -1,11 +1,14 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import { useHistory } from 'react-router-dom' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { Pages } from 'uiSrc/constants' import { setTitle } from 'uiSrc/utils' +import { useTranslation } from 'uiSrc/i18n' import { useAzureAuth } from 'uiSrc/components/hooks/useAzureAuth' -import { AzureSubscription } from 'uiSrc/slices/interfaces' +import { AzureSignInDialog } from 'uiSrc/components/azure-sign-in-dialog' +import { azureAuthTenantSelector } from 'uiSrc/slices/oauth/azure' +import { AzureLoginSource, AzureSubscription } from 'uiSrc/slices/interfaces' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { azureSelector, @@ -16,9 +19,12 @@ import { import AzureSubscriptions from './AzureSubscriptions/AzureSubscriptions' const AzureSubscriptionsPage = () => { + const { t } = useTranslation() const history = useHistory() const dispatch = useAppDispatch() - const { initiateLogin, account } = useAzureAuth() + const { initiateLogin, loading: azureLoading, account } = useAzureAuth() + const tenant = useAppSelector(azureAuthTenantSelector) + const [isSignInDialogOpen, setIsSignInDialogOpen] = useState(false) const { loading, error, subscriptions, loaded } = useAppSelector(azureSelector) @@ -29,14 +35,14 @@ const AzureSubscriptionsPage = () => { return } - setTitle('Azure Subscriptions') + setTitle(t('autodiscover.azure.subscriptions.title')) - // Only fetch if not already loaded or if account changed if (!loaded.subscriptions) { - dispatch(fetchSubscriptionsAzure(account.id)) + dispatch(fetchSubscriptionsAzure(account.id, tenant ?? undefined)) } + // tenant is a dep so account and the fetched tenant never read out of sync. // eslint-disable-next-line react-hooks/exhaustive-deps - }, [account]) + }, [account, tenant]) const handleBack = () => { history.push(Pages.home) @@ -60,7 +66,7 @@ const AzureSubscriptionsPage = () => { }) if (account?.id) { dispatch(clearSubscriptionsAzure()) - dispatch(fetchSubscriptionsAzure(account.id)) + dispatch(fetchSubscriptionsAzure(account.id, tenant ?? undefined)) } } @@ -68,7 +74,12 @@ const AzureSubscriptionsPage = () => { sendEventTelemetry({ event: TelemetryEvent.AZURE_SWITCH_ACCOUNT_CLICKED, }) - initiateLogin() + setIsSignInDialogOpen(true) + } + + const handleSignIn = (tenantId?: string) => { + setIsSignInDialogOpen(false) + initiateLogin(AzureLoginSource.Autodiscovery, tenantId) } const handleManualConnection = () => { @@ -76,17 +87,25 @@ const AzureSubscriptionsPage = () => { } return ( - + <> + + setIsSignInDialogOpen(false)} + onSignIn={handleSignIn} + /> + ) } diff --git a/redisinsight/ui/src/pages/autodiscover-azure/components/DescriptionsTooltip.tsx b/redisinsight/ui/src/pages/autodiscover-azure/components/DescriptionsTooltip.tsx index 68a3e40a45..8154fef64b 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/components/DescriptionsTooltip.tsx +++ b/redisinsight/ui/src/pages/autodiscover-azure/components/DescriptionsTooltip.tsx @@ -1,19 +1,20 @@ import React from 'react' import { Col } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' +import { StateDescription } from 'uiSrc/pages/autodiscover-azure/constants' export interface DescriptionsTooltipProps { - descriptions: Record + descriptions: StateDescription[] } export const DescriptionsTooltip = ({ descriptions, }: DescriptionsTooltipProps) => ( - {Object.entries(descriptions).map(([key, description]) => ( - + {descriptions.map(({ label, description }) => ( + - {key}: + {label}: {' '} {description} diff --git a/redisinsight/ui/src/pages/autodiscover-azure/constants.ts b/redisinsight/ui/src/pages/autodiscover-azure/constants.ts index d314240625..60d3a2cd58 100644 --- a/redisinsight/ui/src/pages/autodiscover-azure/constants.ts +++ b/redisinsight/ui/src/pages/autodiscover-azure/constants.ts @@ -1,44 +1,127 @@ +import { TFunction } from 'i18next' + +export interface StateDescription { + label: string + description: string +} + /** * Azure subscription state descriptions. * @see https://learn.microsoft.com/en-us/rest/api/resources/subscriptions/list#subscriptionstate */ -export const AZURE_SUBSCRIPTION_STATE_DESCRIPTIONS: Record = { - Enabled: 'Subscription is active and fully functional.', - Warned: - 'Subscription has payment issues but is still operational during a grace period.', - PastDue: 'Payment is overdue. Services may be limited.', - Disabled: - 'Subscription is suspended. Resources are not accessible until the subscription is re-enabled.', - Deleted: 'Subscription has been deleted and cannot be recovered.', -} +export const getAzureSubscriptionStateDescriptions = ( + t: TFunction, +): StateDescription[] => [ + { + label: t('autodiscover.azure.subscriptionState.enabled.label'), + description: t('autodiscover.azure.subscriptionState.enabled.description'), + }, + { + label: t('autodiscover.azure.subscriptionState.warned.label'), + description: t('autodiscover.azure.subscriptionState.warned.description'), + }, + { + label: t('autodiscover.azure.subscriptionState.pastDue.label'), + description: t('autodiscover.azure.subscriptionState.pastDue.description'), + }, + { + label: t('autodiscover.azure.subscriptionState.disabled.label'), + description: t('autodiscover.azure.subscriptionState.disabled.description'), + }, + { + label: t('autodiscover.azure.subscriptionState.deleted.label'), + description: t('autodiscover.azure.subscriptionState.deleted.description'), + }, +] /** * Azure database type descriptions. * @see https://learn.microsoft.com/en-us/azure/azure-cache-for-redis/cache-overview */ -export const AZURE_DATABASE_TYPE_DESCRIPTIONS: Record = { - Standard: - 'Azure Cache for Redis with Basic, Standard, or Premium tiers. Suitable for most caching scenarios.', - Enterprise: - 'Azure Cache for Redis Enterprise with dedicated infrastructure, higher performance, and Redis modules support.', -} +export const getAzureDatabaseTypeDescriptions = ( + t: TFunction, +): StateDescription[] => [ + { + label: t('autodiscover.azure.databaseType.standard.label'), + description: t('autodiscover.azure.databaseType.standard.description'), + }, + { + label: t('autodiscover.azure.databaseType.enterprise.label'), + description: t('autodiscover.azure.databaseType.enterprise.description'), + }, +] /** * Azure database provisioning state descriptions. * @see https://learn.microsoft.com/en-us/rest/api/redis/redis/get#provisioningstate */ -export const AZURE_PROVISIONING_STATE_DESCRIPTIONS: Record = { - Succeeded: 'Database is fully provisioned and ready to use.', - Creating: 'Database is being created and is not yet available.', - Updating: 'Database configuration is being updated.', - Deleting: 'Database is being deleted.', - Failed: 'Provisioning failed. The database is not usable.', - Linking: 'Database is being linked for geo-replication.', - Unlinking: 'Database is being unlinked from geo-replication.', - Recovering: 'Database is recovering from a failure.', - Provisioning: 'Database is being provisioned.', - Scaling: 'Database is being scaled.', - ConfiguringAAD: 'Entra ID (Azure AD) authentication is being configured.', - Importing: 'Data is being imported into the database.', - Exporting: 'Data is being exported from the database.', -} +export const getAzureProvisioningStateDescriptions = ( + t: TFunction, +): StateDescription[] => [ + { + label: t('autodiscover.azure.provisioningState.succeeded.label'), + description: t( + 'autodiscover.azure.provisioningState.succeeded.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.creating.label'), + description: t('autodiscover.azure.provisioningState.creating.description'), + }, + { + label: t('autodiscover.azure.provisioningState.updating.label'), + description: t('autodiscover.azure.provisioningState.updating.description'), + }, + { + label: t('autodiscover.azure.provisioningState.deleting.label'), + description: t('autodiscover.azure.provisioningState.deleting.description'), + }, + { + label: t('autodiscover.azure.provisioningState.failed.label'), + description: t('autodiscover.azure.provisioningState.failed.description'), + }, + { + label: t('autodiscover.azure.provisioningState.linking.label'), + description: t('autodiscover.azure.provisioningState.linking.description'), + }, + { + label: t('autodiscover.azure.provisioningState.unlinking.label'), + description: t( + 'autodiscover.azure.provisioningState.unlinking.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.recovering.label'), + description: t( + 'autodiscover.azure.provisioningState.recovering.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.provisioning.label'), + description: t( + 'autodiscover.azure.provisioningState.provisioning.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.scaling.label'), + description: t('autodiscover.azure.provisioningState.scaling.description'), + }, + { + label: t('autodiscover.azure.provisioningState.configuringAad.label'), + description: t( + 'autodiscover.azure.provisioningState.configuringAad.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.importing.label'), + description: t( + 'autodiscover.azure.provisioningState.importing.description', + ), + }, + { + label: t('autodiscover.azure.provisioningState.exporting.label'), + description: t( + 'autodiscover.azure.provisioningState.exporting.description', + ), + }, +] diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/database.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/database.tsx index 72ef9c1b4e..13c2ed402e 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/database.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/database.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseCell } from '../components/DatabaseCell/DatabaseCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const databaseColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Database, + header: i18n.t('autodiscover.cloud.column.database'), id: AutoDiscoverCloudIds.Name, accessorKey: AutoDiscoverCloudIds.Name, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/databaseResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/databaseResult.tsx index 43abf52e74..756058951d 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/databaseResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/databaseResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseCell } from '../components/DatabaseCell/DatabaseCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const databaseResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Database, + header: i18n.t('autodiscover.cloud.column.database'), id: AutoDiscoverCloudIds.Name, accessorKey: AutoDiscoverCloudIds.Name, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpoint.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpoint.tsx index 29ba60271c..0989efc287 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpoint.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpoint.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { EndpointCell } from '../components/EndpointCell/EndpointCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const endpointColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Endpoint, + header: i18n.t('autodiscover.cloud.column.endpoint'), id: AutoDiscoverCloudIds.PublicEndpoint, accessorKey: AutoDiscoverCloudIds.PublicEndpoint, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpointResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpointResult.tsx index e58dd9f9de..bf338dc146 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpointResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/endpointResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { EndpointCell } from '../components/EndpointCell/EndpointCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const endpointResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Endpoint, + header: i18n.t('autodiscover.cloud.column.endpoint'), id: AutoDiscoverCloudIds.PublicEndpoint, accessorKey: AutoDiscoverCloudIds.PublicEndpoint, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/id.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/id.tsx index 7fe8ba7624..40065beada 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/id.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/id.tsx @@ -1,19 +1,17 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const idColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Id, accessorKey: AutoDiscoverCloudIds.Id, - header: AutoDiscoverCloudTitles.Id, + header: i18n.t('autodiscover.cloud.column.id'), enableSorting: true, size: 80, cell: ({ diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/messageResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/messageResult.tsx index fa4aed5c01..f96b11ae05 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/messageResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/messageResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { MessageResultCell } from '../components/MessageResultCell/MessageResultCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const messageResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Result, + header: i18n.t('autodiscover.cloud.column.result'), id: AutoDiscoverCloudIds.MessageAdded, accessorKey: AutoDiscoverCloudIds.MessageAdded, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modules.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modules.tsx index e92740a981..dc1609e339 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modules.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modules.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseListModules } from 'uiSrc/components' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const modulesColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Capabilities, + header: i18n.t('autodiscover.cloud.column.capabilities'), id: AutoDiscoverCloudIds.Modules, accessorKey: AutoDiscoverCloudIds.Modules, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modulesResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modulesResult.tsx index 2202142021..9c65ee06a1 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modulesResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/modulesResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseListModules } from 'uiSrc/components' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const modulesResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Capabilities, + header: i18n.t('autodiscover.cloud.column.capabilities'), id: AutoDiscoverCloudIds.Modules, accessorKey: AutoDiscoverCloudIds.Modules, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/numberOfDbs.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/numberOfDbs.tsx index b99e47448b..de96685290 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/numberOfDbs.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/numberOfDbs.tsx @@ -1,20 +1,18 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' import { isNumber } from 'lodash' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const numberOfDbsColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.NumberOfDatabases, accessorKey: AutoDiscoverCloudIds.NumberOfDatabases, - header: AutoDiscoverCloudTitles.NumberOfDatabases, + header: i18n.t('autodiscover.cloud.column.numberOfDatabases'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/options.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/options.tsx index c3d2a59472..7556902f93 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/options.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/options.tsx @@ -1,20 +1,18 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseListOptions } from 'uiSrc/components' import { parseInstanceOptionsCloud } from 'uiSrc/utils' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const optionsColumn = ( instances: InstanceRedisCloud[], ): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Options, + header: i18n.t('autodiscover.cloud.column.options'), id: AutoDiscoverCloudIds.Options, accessorKey: AutoDiscoverCloudIds.Options, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/optionsResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/optionsResult.tsx index 62117a764d..c7fab07024 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/optionsResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/optionsResult.tsx @@ -1,18 +1,16 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { DatabaseListOptions } from 'uiSrc/components' import { parseInstanceOptionsCloud } from 'uiSrc/utils' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const optionsResultColumn = ( instancesForOptions: InstanceRedisCloud[], ): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Options, + header: i18n.t('autodiscover.cloud.column.options'), id: AutoDiscoverCloudIds.Options, accessorKey: AutoDiscoverCloudIds.Options, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/provider.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/provider.tsx index 182b781d74..387509cc91 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/provider.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/provider.tsx @@ -1,19 +1,17 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const providerColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Provider, accessorKey: AutoDiscoverCloudIds.Provider, - header: AutoDiscoverCloudTitles.Provider, + header: i18n.t('autodiscover.cloud.column.provider'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/region.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/region.tsx index a2baae3d9d..5bb8943ad1 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/region.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/region.tsx @@ -1,19 +1,17 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const regionColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Region, accessorKey: AutoDiscoverCloudIds.Region, - header: AutoDiscoverCloudTitles.Region, + header: i18n.t('autodiscover.cloud.column.region'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/status.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/status.tsx index 693c55fc7e..a8ea54811e 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/status.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/status.tsx @@ -1,4 +1,5 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription, @@ -6,16 +7,13 @@ import { } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const statusColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Status, accessorKey: AutoDiscoverCloudIds.Status, - header: AutoDiscoverCloudTitles.Status, + header: i18n.t('autodiscover.cloud.column.status'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDb.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDb.tsx index f772b3a188..f12691dc45 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDb.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDb.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { StatusColumnText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const statusDbColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Status, + header: i18n.t('autodiscover.cloud.column.status'), id: AutoDiscoverCloudIds.Status, accessorKey: AutoDiscoverCloudIds.Status, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDbResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDbResult.tsx index cb90945feb..b737819ee7 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDbResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/statusDbResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const statusDbResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Status, + header: i18n.t('autodiscover.cloud.column.status'), id: AutoDiscoverCloudIds.Status, accessorKey: AutoDiscoverCloudIds.Status, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscription.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscription.tsx index 67fc02717e..0aa62dfd96 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscription.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscription.tsx @@ -1,19 +1,17 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type RedisCloudSubscription } from 'uiSrc/slices/interfaces' import { SubscriptionCell } from '../components/SubscriptionCell/SubscriptionCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Name, accessorKey: AutoDiscoverCloudIds.Name, - header: AutoDiscoverCloudTitles.Subscription, + header: i18n.t('autodiscover.cloud.column.subscription'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDb.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDb.tsx index b56b6ab6e0..898164e8d4 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDb.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDb.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { SubscriptionCell } from '../components/SubscriptionCell/SubscriptionCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionDbColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Subscription, + header: i18n.t('autodiscover.cloud.column.subscription'), id: AutoDiscoverCloudIds.SubscriptionName, accessorKey: AutoDiscoverCloudIds.SubscriptionName, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDbResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDbResult.tsx index f47abc69c6..13a0c7836f 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDbResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionDbResult.tsx @@ -1,17 +1,15 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { SubscriptionCell } from '../components/SubscriptionCell/SubscriptionCell' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionDbResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Subscription, + header: i18n.t('autodiscover.cloud.column.subscription'), id: AutoDiscoverCloudIds.SubscriptionName, accessorKey: AutoDiscoverCloudIds.SubscriptionName, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionId.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionId.tsx index ebce482a60..91757df441 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionId.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionId.tsx @@ -1,15 +1,13 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionIdColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.SubscriptionId, + header: i18n.t('autodiscover.cloud.column.subscriptionId'), id: AutoDiscoverCloudIds.SubscriptionId, accessorKey: AutoDiscoverCloudIds.SubscriptionId, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionIdResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionIdResult.tsx index 7416b5dfa9..97e4d6a22a 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionIdResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionIdResult.tsx @@ -1,13 +1,11 @@ import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { type InstanceRedisCloud } from 'uiSrc/slices/interfaces' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import i18n from 'uiSrc/i18n' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionIdResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.SubscriptionId, + header: i18n.t('autodiscover.cloud.column.subscriptionId'), id: AutoDiscoverCloudIds.SubscriptionId, accessorKey: AutoDiscoverCloudIds.SubscriptionId, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionType.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionType.tsx index 2f64ae12a0..cc9b19c848 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionType.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionType.tsx @@ -1,4 +1,5 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { @@ -7,14 +8,11 @@ import { } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionTypeColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Type, + header: i18n.t('autodiscover.cloud.column.type'), id: AutoDiscoverCloudIds.SubscriptionType, accessorKey: AutoDiscoverCloudIds.SubscriptionType, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionTypeResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionTypeResult.tsx index 855e34f4f7..5f9de3af34 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionTypeResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/subscriptionTypeResult.tsx @@ -3,15 +3,13 @@ import { type InstanceRedisCloud, RedisCloudSubscriptionTypeText, } from 'uiSrc/slices/interfaces' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import i18n from 'uiSrc/i18n' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const subscriptionTypeResultColumn = (): ColumnDef => { return { - header: AutoDiscoverCloudTitles.Type, + header: i18n.t('autodiscover.cloud.column.type'), id: AutoDiscoverCloudIds.SubscriptionType, accessorKey: AutoDiscoverCloudIds.SubscriptionType, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/type.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/type.tsx index 91ea21f098..2f302987cf 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/type.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/columns/type.tsx @@ -1,4 +1,5 @@ import React from 'react' +import i18n from 'uiSrc/i18n' import { type ColumnDef } from 'uiSrc/components/base/layout/table' import { @@ -7,16 +8,13 @@ import { } from 'uiSrc/slices/interfaces' import { CellText } from 'uiSrc/components/auto-discover' -import { - AutoDiscoverCloudIds, - AutoDiscoverCloudTitles, -} from 'uiSrc/pages/autodiscover-cloud/constants/constants' +import { AutoDiscoverCloudIds } from 'uiSrc/pages/autodiscover-cloud/constants/constants' export const typeColumn = (): ColumnDef => { return { id: AutoDiscoverCloudIds.Type, accessorKey: AutoDiscoverCloudIds.Type, - header: AutoDiscoverCloudTitles.Type, + header: i18n.t('autodiscover.cloud.column.type'), enableSorting: true, cell: ({ row: { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/AlertCell/AlertCell.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/AlertCell/AlertCell.tsx index 0dbc9a6788..e0e92a990e 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/AlertCell/AlertCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/AlertCell/AlertCell.tsx @@ -5,11 +5,13 @@ import { RedisCloudSubscriptionStatus } from 'uiSrc/slices/interfaces' import { RiIcon } from 'uiSrc/components/base/icons' import { CellText } from 'uiSrc/components/auto-discover' import { AlertStatusContent } from 'uiSrc/pages/autodiscover-cloud/components/AlertStatusContent' +import { useTranslation } from 'uiSrc/i18n' import styles from 'uiSrc/pages/autodiscover-cloud/redis-cloud-subscriptions/styles.module.scss' import { AlertCellProps } from './AlertCell.types' export const AlertCell = ({ status, numberOfDatabases }: AlertCellProps) => { + const { t } = useTranslation() const isUnavailable = status !== RedisCloudSubscriptionStatus.Active || numberOfDatabases === 0 @@ -18,7 +20,7 @@ export const AlertCell = ({ status, numberOfDatabases }: AlertCellProps) => { - This subscription is not available for one of the following reasons: + {t('autodiscover.cloud.alert.title')} } content={} @@ -29,7 +31,7 @@ export const AlertCell = ({ status, numberOfDatabases }: AlertCellProps) => { type="ToastDangerIcon" color="danger500" size="m" - aria-label="subscription alert" + aria-label={t('autodiscover.cloud.alert.aria')} /> ) diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/DatabaseCell/DatabaseCell.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/DatabaseCell/DatabaseCell.tsx index 22a97fd60f..606a02dfa4 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/DatabaseCell/DatabaseCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/DatabaseCell/DatabaseCell.tsx @@ -3,11 +3,13 @@ import React from 'react' import { formatLongName, replaceSpaces } from 'uiSrc/utils' import { RiTooltip } from 'uiSrc/components' import { CellText } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import styles from 'uiSrc/pages/autodiscover-cloud/redis-cloud-databases/styles.module.scss' import { DatabaseCellProps } from './DatabaseCell.types' export const DatabaseCell = ({ name, className }: DatabaseCellProps) => { + const { t } = useTranslation() const cellContent = replaceSpaces(name.substring(0, 200)) return ( @@ -18,7 +20,7 @@ export const DatabaseCell = ({ name, className }: DatabaseCellProps) => { > { + const { t } = useTranslation() + if (!publicEndpoint) { return - } @@ -20,7 +23,7 @@ export const EndpointCell = ({ publicEndpoint }: EndpointCellProps) => { {publicEndpoint} @@ -28,7 +31,7 @@ export const EndpointCell = ({ publicEndpoint }: EndpointCellProps) => { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/MessageResultCell/MessageResultCell.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/MessageResultCell/MessageResultCell.tsx index 0373c3cc45..70a6c49e11 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/MessageResultCell/MessageResultCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/MessageResultCell/MessageResultCell.tsx @@ -6,6 +6,7 @@ import { RiTooltip } from 'uiSrc/components' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { ColorText } from 'uiSrc/components/base/text' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' +import { useTranslation } from 'uiSrc/i18n' import { MessageResultCellProps } from './MessageResultCell.types' @@ -13,6 +14,8 @@ export const MessageResultCell = ({ statusAdded, messageAdded = '', }: MessageResultCellProps) => { + const { t } = useTranslation() + if (!statusAdded) { return - } @@ -24,7 +27,7 @@ export const MessageResultCell = ({ return ( @@ -35,7 +38,7 @@ export const MessageResultCell = ({ - Error + {t('autodiscover.cloud.cell.error')} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/SubscriptionCell/SubscriptionCell.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/SubscriptionCell/SubscriptionCell.tsx index 65fb023131..5f20cc4c64 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/SubscriptionCell/SubscriptionCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/column-definitions/components/SubscriptionCell/SubscriptionCell.tsx @@ -3,6 +3,7 @@ import React from 'react' import { formatLongName, replaceSpaces } from 'uiSrc/utils' import { RiTooltip } from 'uiSrc/components' import { CellText } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import styles from 'uiSrc/pages/autodiscover-cloud/redis-cloud-databases/styles.module.scss' import { SubscriptionCellProps } from './SubscriptionCell.types' @@ -11,13 +12,14 @@ export const SubscriptionCell = ({ name, className, }: SubscriptionCellProps) => { + const { t } = useTranslation() const cellContent = replaceSpaces(name.substring(0, 200)) return (
( - - } - /> - } - /> - } - /> - -) +export const AlertStatusContent = () => { + const { t } = useTranslation() + + return ( + + } + /> + } + /> + } + /> + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/constants/constants.ts b/redisinsight/ui/src/pages/autodiscover-cloud/constants/constants.ts index 606993c40e..faf00681aa 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/constants/constants.ts +++ b/redisinsight/ui/src/pages/autodiscover-cloud/constants/constants.ts @@ -15,19 +15,3 @@ export enum AutoDiscoverCloudIds { SubscriptionType = 'subscriptionType', Type = 'type', } - -export enum AutoDiscoverCloudTitles { - Id = 'Id', - Database = 'Database', - Endpoint = 'Endpoint', - Result = 'Result', - Capabilities = 'Capabilities', - NumberOfDatabases = '# databases', - Options = 'Options', - Provider = 'Cloud provider', - Region = 'Region', - Status = 'Status', - Subscription = 'Subscription', - SubscriptionId = 'Subscription id', - Type = 'Type', -} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResult.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResult.tsx index ed390c78a9..15335549b9 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResult.tsx @@ -17,6 +17,7 @@ import { Footer, Header, } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import { SummaryText } from './components' export interface Props { @@ -26,15 +27,16 @@ export interface Props { onBack: () => void } -const loadingMsg = 'loading...' -const notFoundMsg = 'Not found' - const RedisCloudDatabaseListResult = ({ instances, columns, onBack, onView, }: Props) => { + const { t } = useTranslation() + const loadingMsg = t('autodiscover.cloud.loading') + const notFoundMsg = t('autodiscover.cloud.notFound') + const [items, setItems] = useState([]) const [message, setMessage] = useState(loadingMsg) @@ -70,7 +72,7 @@ const RedisCloudDatabaseListResult = ({
@@ -111,7 +113,7 @@ const RedisCloudDatabaseListResult = ({ data-testid="btn-view-databases" disabled={items.length === 0} > - View Databases + {t('autodiscover.cloud.result.viewDatabases')}
diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/components/SummaryText/SummaryText.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/components/SummaryText/SummaryText.tsx index 9de7c87825..e76cd2c4e0 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/components/SummaryText/SummaryText.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/components/SummaryText/SummaryText.tsx @@ -1,22 +1,36 @@ import React from 'react' import { ColorText, Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import type { SummaryTextProps } from './SummaryText.types' export const SummaryText = ({ countSuccessAdded, countFailAdded, -}: SummaryTextProps) => ( - - Summary: {' '} - {countSuccessAdded ? ( - - Successfully added {countSuccessAdded} database(s) - {countFailAdded ? '. ' : '.'} - - ) : null} - {countFailAdded ? ( - Failed to add {countFailAdded} database(s). - ) : null} - -) +}: SummaryTextProps) => { + const { t } = useTranslation() + + return ( + + + {t('autodiscover.cloud.summary.prefix')} + {' '} + {countSuccessAdded ? ( + + {t('autodiscover.cloud.summary.databasesSuccess', { + count: countSuccessAdded, + })} + {countFailAdded ? '. ' : '.'} + + ) : null} + {countFailAdded ? ( + + {t('autodiscover.cloud.summary.databasesFail', { + count: countFailAdded, + })} + . + + ) : null} + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/hooks/useCloudDatabasesResultConfig.ts b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/hooks/useCloudDatabasesResultConfig.ts index 7cef62aea6..f2b7287050 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/hooks/useCloudDatabasesResultConfig.ts +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/hooks/useCloudDatabasesResultConfig.ts @@ -10,6 +10,7 @@ import { } from 'uiSrc/slices/instances/cloud' import { LoadedCloud } from 'uiSrc/slices/interfaces' import { setTitle } from 'uiSrc/utils' +import i18n from 'uiSrc/i18n' import { colFactory } from '../utils/colFactory' import { UseCloudDatabasesResultConfigReturn } from './useCloudDatabasesResultConfig.types' @@ -25,7 +26,7 @@ export const useCloudDatabasesResultConfig = if (!instances.length) { history.push(Pages.home) } - setTitle('Redis Enterprise Databases Added') + setTitle(i18n.t('autodiscover.cloud.result.title')) }, [instances.length, history]) const handleClose = useCallback(() => { diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabases/RedisCloudDatabases.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabases/RedisCloudDatabases.tsx index b5de1cd00a..61214e3277 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabases/RedisCloudDatabases.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabases/RedisCloudDatabases.tsx @@ -14,6 +14,7 @@ import { } from 'uiSrc/components/base/forms/buttons' import { RiPopover, RiTooltip } from 'uiSrc/components/base' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { ColumnDef, RowSelectionState, @@ -48,11 +49,6 @@ interface IPopoverProps { isPopoverOpen: boolean } -const loadingMsg = 'loading...' -const notFoundMsg = 'Not found' -const noResultsMessage = - 'Your Redis Enterprise Cloud has no databases available' - const RedisCloudDatabasesPage = ({ columns, selection, @@ -63,6 +59,11 @@ const RedisCloudDatabasesPage = ({ onBack, onSubmit, }: Props) => { + const { t } = useTranslation() + const loadingMsg = t('autodiscover.cloud.loading') + const notFoundMsg = t('autodiscover.cloud.notFound') + const noResultsMessage = t('autodiscover.cloud.databases.noResults') + const [items, setItems] = useState([]) const [message, setMessage] = useState(loadingMsg) const [isPopoverOpen, setIsPopoverOpen] = useState(false) @@ -125,14 +126,11 @@ const RedisCloudDatabasesPage = ({ className="btn-cancel" data-testid="btn-cancel" > - Cancel + {t('autodiscover.cloud.cancel.button')} } > - - Your changes have not been saved. Do you want to proceed to - the list of databases? - + {t('autodiscover.cloud.cancel.confirm')}
- Proceed + {t('autodiscover.cloud.cancel.proceed')}
@@ -165,7 +163,7 @@ const RedisCloudDatabasesPage = ({ icon={isDisabled ? InfoIcon : undefined} data-testid="btn-add-databases" > - Add selected Databases + {t('autodiscover.cloud.databases.addSelected')} ) @@ -174,14 +172,12 @@ const RedisCloudDatabasesPage = ({
1 ? 'databases ' : 'database '} - in your Redis Cloud. Select the - ${items.length > 1 ? ' databases ' : ' database '} that you want to - add.`} + subTitle={t('autodiscover.cloud.databases.subtitle', { + count: items.length, + })} /> diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/hooks/useCloudDatabasesConfig.ts b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/hooks/useCloudDatabasesConfig.ts index eab072d941..248cec15ba 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/hooks/useCloudDatabasesConfig.ts +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/hooks/useCloudDatabasesConfig.ts @@ -11,6 +11,7 @@ import { } from 'uiSrc/slices/instances/cloud' import { oauthCloudUserSelector } from 'uiSrc/slices/oauth/cloud' import { setTitle } from 'uiSrc/utils' +import i18n from 'uiSrc/i18n' import { Pages } from 'uiSrc/constants' import { InstanceRedisCloud, @@ -59,7 +60,7 @@ export const useCloudDatabasesConfig = (): UseCloudDatabasesConfigReturn => { if (instances === null) { history.push(Pages.home) } - setTitle('Redis Cloud Databases') + setTitle(i18n.t('autodiscover.cloud.databases.title')) dispatch(resetLoadedRedisCloud(LoadedCloud.Instances)) }, [instances]) diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptions/RedisCloudSubscriptions.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptions/RedisCloudSubscriptions.tsx index c6e240eb0d..55613bcb18 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptions/RedisCloudSubscriptions.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptions/RedisCloudSubscriptions.tsx @@ -25,6 +25,7 @@ import { Footer, Header, } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import { canSelectRow } from '../utils/canSelectRow' import { Account, CancelButton, SubmitButton, SummaryText } from '../components' @@ -45,10 +46,6 @@ export interface Props { onSelectionChange: (state: RowSelectionState) => void } -const loadingMsg = 'loading...' -const notFoundMsg = 'Not found' -const noResultsMessage = 'Your Redis Cloud has no subscriptions available.' - const RedisCloudSubscriptions = ({ subscriptions, selection, @@ -60,7 +57,11 @@ const RedisCloudSubscriptions = ({ onSubmit, onSelectionChange, }: Props) => { - // const subscriptions = []; + const { t } = useTranslation() + const loadingMsg = t('autodiscover.cloud.loading') + const notFoundMsg = t('autodiscover.cloud.notFound') + const noResultsMessage = t('autodiscover.cloud.subscriptions.noResults') + const [items, setItems] = useState(subscriptions || []) const [message, setMessage] = useState(loadingMsg) const [isPopoverOpen, setIsPopoverOpen] = useState(false) @@ -119,7 +120,7 @@ const RedisCloudSubscriptions = ({
diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/Account/Account.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/Account/Account.tsx index fe02cb95a9..ada83117aa 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/Account/Account.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/Account/Account.tsx @@ -1,6 +1,7 @@ import React from 'react' import { LoadingContent } from 'uiSrc/components/base/layout' import { ColorText } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import * as S from './Account.style' import { type AccountProps, type AccountValueProps } from './Account.types' @@ -23,31 +24,43 @@ const AccountValue = ({ value, ...rest }: AccountValueProps) => { export const Account = ({ account: { accountId, accountName, ownerEmail, ownerName }, -}: AccountProps) => ( - - {accountId && ( - - Account ID: - - - )} - {accountName && ( - - Name: - - - )} - {ownerName && ( - - Owner Name: - - - )} - {ownerEmail && ( - - Owner Email: - - - )} - -) +}: AccountProps) => { + const { t } = useTranslation() + + return ( + + {accountId && ( + + + {t('autodiscover.cloud.account.accountId')} + + + + )} + {accountName && ( + + + {t('autodiscover.cloud.account.name')} + + + + )} + {ownerName && ( + + + {t('autodiscover.cloud.account.ownerName')} + + + + )} + {ownerEmail && ( + + + {t('autodiscover.cloud.account.ownerEmail')} + + + + )} + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/CancelButton/CancelButton.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/CancelButton/CancelButton.tsx index 7de59591a0..49970e2da0 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/CancelButton/CancelButton.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/CancelButton/CancelButton.tsx @@ -5,6 +5,7 @@ import { } from 'uiSrc/components/base/forms/buttons' import { Text } from 'uiSrc/components/base/text' import { RiPopover } from 'uiSrc/components/base' +import { useTranslation } from 'uiSrc/i18n' import styles from '../../styles.module.scss' import { type CancelButtonProps } from './CancelButton.types' @@ -14,36 +15,37 @@ export const CancelButton = ({ onClose, onShowPopover, onClosePopover, -}: CancelButtonProps) => ( - - Cancel - - } - > - - Your changes have not been saved. Do you want to proceed to the - list of databases? - -
-
- - Proceed - -
-
-) +}: CancelButtonProps) => { + const { t } = useTranslation() + + return ( + + {t('autodiscover.cloud.cancel.button')} + + } + > + {t('autodiscover.cloud.cancel.confirm')} +
+
+ + {t('autodiscover.cloud.cancel.proceed')} + +
+
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SubmitButton/SubmitButton.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SubmitButton/SubmitButton.tsx index 5643764d8a..24ff76a1a9 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SubmitButton/SubmitButton.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SubmitButton/SubmitButton.tsx @@ -2,6 +2,7 @@ import React from 'react' import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { RiTooltip } from 'uiSrc/components/base' import validationErrors from 'uiSrc/constants/validationErrors' +import { useTranslation } from 'uiSrc/i18n' import { type SubmitButtonProps } from './SubmitButton.types' @@ -9,25 +10,31 @@ export const SubmitButton = ({ isDisabled, loading, onClick, -}: SubmitButtonProps) => ( - {validationErrors.NO_SUBSCRIPTIONS_CLOUD} : null - } - > - { + const { t } = useTranslation() + + return ( + {validationErrors.NO_SUBSCRIPTIONS_CLOUD} + ) : null + } > - Show databases - - -) + + {t('autodiscover.cloud.subscriptions.showDatabases')} + + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SummaryText/SummaryText.tsx b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SummaryText/SummaryText.tsx index aff143ca98..14d4660213 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SummaryText/SummaryText.tsx +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/components/SummaryText/SummaryText.tsx @@ -1,29 +1,37 @@ import React from 'react' import { ColorText, Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { type SummaryTextProps } from './SummaryText.types' export const SummaryText = ({ countStatusActive, countStatusFailed, -}: SummaryTextProps) => ( - - Summary: - {countStatusActive ? ( - - Successfully discovered database(s) in {countStatusActive} -   - {countStatusActive > 1 ? 'subscriptions' : 'subscription'} - .  - - ) : null} +}: SummaryTextProps) => { + const { t } = useTranslation() - {countStatusFailed ? ( - - Failed to discover database(s) in {countStatusFailed} -   - {countStatusFailed > 1 ? 'subscriptions.' : ' subscription.'} - - ) : null} - -) + return ( + + + {t('autodiscover.cloud.summary.prefix')} + + {countStatusActive ? ( + + {t('autodiscover.cloud.summary.subscriptionsSuccess', { + count: countStatusActive, + })} + .  + + ) : null} + + {countStatusFailed ? ( + + {t('autodiscover.cloud.summary.subscriptionsFail', { + count: countStatusFailed, + })} + . + + ) : null} + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/hooks/useCloudSubscriptionConfig.ts b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/hooks/useCloudSubscriptionConfig.ts index cd0862fe14..a466106bf3 100644 --- a/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/hooks/useCloudSubscriptionConfig.ts +++ b/redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/hooks/useCloudSubscriptionConfig.ts @@ -18,6 +18,7 @@ import { } from 'uiSrc/slices/instances/cloud' import { oauthCloudUserSelector } from 'uiSrc/slices/oauth/cloud' import { Maybe, setTitle } from 'uiSrc/utils' +import i18n from 'uiSrc/i18n' import { Pages } from 'uiSrc/constants' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' @@ -48,7 +49,7 @@ export const useCloudSubscriptionConfig = if (subscriptions === null) { history.push(Pages.home) } else { - setTitle('Redis Cloud Subscriptions') + setTitle(i18n.t('autodiscover.cloud.subscriptions.title')) } }, []) diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/constants/constants.ts b/redisinsight/ui/src/pages/autodiscover-sentinel/constants/constants.ts index 92a92ebf6d..d211c71751 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/constants/constants.ts +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/constants/constants.ts @@ -1,14 +1,3 @@ -export enum SentinelDatabaseTitles { - Address = 'Address', - Alias = 'Database alias*', - Username = 'Username', - DatabaseIndex = 'Database index', - NumberOfReplicas = '# of replicas', - Password = 'Password', - PrimaryGroup = 'Primary group', - Result = 'Result', -} - export enum SentinelDatabaseIds { Message = 'message', Address = 'host', diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/SentinelDatabasesResult.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/SentinelDatabasesResult.tsx index 0a72bf61c9..3e68828752 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/SentinelDatabasesResult.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/SentinelDatabasesResult.tsx @@ -20,6 +20,7 @@ import { } from 'uiSrc/components/auto-discover' import { Spacer } from 'uiSrc/components/base/layout' import { Header } from 'uiSrc/components/auto-discover/Header' +import { useTranslation } from 'uiSrc/i18n' import { SummaryText } from './components/Summary' export interface Props { @@ -30,9 +31,6 @@ export interface Props { onViewDatabases: () => void } -const loadingMsg = 'loading...' -const notFoundMsg = 'Not found.' - const SentinelDatabasesResult = ({ columns, onBack, @@ -40,6 +38,10 @@ const SentinelDatabasesResult = ({ countSuccessAdded, masters, }: Props) => { + const { t } = useTranslation() + const loadingMsg = t('autodiscover.sentinel.loading') + const notFoundMsg = t('autodiscover.sentinel.notFound') + const [items, setItems] = useState(masters) const [message, setMessage] = useState(loadingMsg) @@ -82,7 +84,7 @@ const SentinelDatabasesResult = ({
@@ -130,7 +132,7 @@ const SentinelDatabasesResult = ({ onClick={handleViewDatabases} data-testid="btn-view-databases" > - View Databases + {t('autodiscover.sentinel.result.viewDatabases')} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/components/Summary.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/components/Summary.tsx index 359041ae3a..531c4735b0 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/components/Summary.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/components/Summary.tsx @@ -1,27 +1,32 @@ import React from 'react' import { ColorText, Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { type SummaryTextProps } from './SummaryTextProps.types' export const SummaryText = ({ countSuccessAdded, countFailAdded, -}: SummaryTextProps) => ( - - - Summary:  - - {countSuccessAdded ? ( - - Successfully added {countSuccessAdded} - {' primary group(s)'} - {countFailAdded ? '; ' : ' '} - - ) : null} - {countFailAdded ? ( - - Failed to add {countFailAdded} - {' primary group(s)'} +}: SummaryTextProps) => { + const { t } = useTranslation() + + return ( + + + {t('autodiscover.sentinel.summary.prefix')} - ) : null} - -) + {countSuccessAdded ? ( + + {t('autodiscover.sentinel.summary.success', { + count: countSuccessAdded, + })} + {countFailAdded ? '; ' : ' '} + + ) : null} + {countFailAdded ? ( + + {t('autodiscover.sentinel.summary.fail', { count: countFailAdded })} + + ) : null} + + ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/address.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/address.tsx index 4ab0b1d0ab..bcae3e4529 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/address.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/address.tsx @@ -2,15 +2,13 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { AddressCell } from '../components' export const addressColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.Address, + header: i18n.t('autodiscover.sentinel.column.address'), id: SentinelDatabaseIds.Address, accessorKey: SentinelDatabaseIds.Address, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/alias.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/alias.tsx index a3b17e81c9..4f714fb804 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/alias.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/alias.tsx @@ -5,10 +5,8 @@ import type { ModifiedSentinelMaster, AddRedisDatabaseStatus, } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { AliasCell } from '../components' export const aliasColumn = ( @@ -19,7 +17,7 @@ export const aliasColumn = ( ) => boolean, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Alias, + header: i18n.t('autodiscover.sentinel.column.alias'), id: SentinelDatabaseIds.Alias, accessorKey: SentinelDatabaseIds.Alias, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/db.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/db.tsx index 0ec88858be..2968762d8b 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/db.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/db.tsx @@ -2,17 +2,15 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { DbCell } from '../components' export const dbColumn = ( handleChangedInput: (name: string, value: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.DatabaseIndex, + header: i18n.t('autodiscover.sentinel.column.databaseIndex'), id: SentinelDatabaseIds.DatabaseIndex, accessorKey: SentinelDatabaseIds.DatabaseIndex, size: 140, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/numberOfReplicas.ts b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/numberOfReplicas.ts index 1a7f2ac647..5f33361d10 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/numberOfReplicas.ts +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/numberOfReplicas.ts @@ -1,13 +1,11 @@ import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' export const numberOfReplicasColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.NumberOfReplicas, + header: i18n.t('autodiscover.sentinel.column.numberOfReplicas'), id: SentinelDatabaseIds.NumberOfReplicas, accessorKey: SentinelDatabaseIds.NumberOfReplicas, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/password.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/password.tsx index da8416f6b7..70e7c74b9f 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/password.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/password.tsx @@ -5,10 +5,8 @@ import type { ModifiedSentinelMaster, AddRedisDatabaseStatus, } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { PasswordCell } from '../components' export const passwordColumn = ( @@ -20,7 +18,7 @@ export const passwordColumn = ( ) => boolean, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Password, + header: i18n.t('autodiscover.sentinel.column.password'), id: SentinelDatabaseIds.Password, accessorKey: SentinelDatabaseIds.Password, cell: ({ diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/primaryGroup.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/primaryGroup.tsx index 8e1ac71756..3a63a608cc 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/primaryGroup.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/primaryGroup.tsx @@ -2,15 +2,13 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { PrimaryGroupCell } from '../components' export const primaryGroupColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.PrimaryGroup, + header: i18n.t('autodiscover.sentinel.column.primaryGroup'), id: SentinelDatabaseIds.PrimaryGroup, accessorKey: SentinelDatabaseIds.PrimaryGroup, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/result.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/result.tsx index 243a19c47d..53b93a0def 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/result.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/result.tsx @@ -2,10 +2,8 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { ResultCell } from '../components' export const resultColumn = ( @@ -13,7 +11,7 @@ export const resultColumn = ( onAddInstance?: (name: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Result, + header: i18n.t('autodiscover.sentinel.column.result'), id: SentinelDatabaseIds.Message, accessorKey: SentinelDatabaseIds.Message, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/username.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/username.tsx index 35965d1ccc..cc44f7a386 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/username.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/columns/username.tsx @@ -5,10 +5,8 @@ import type { ModifiedSentinelMaster, AddRedisDatabaseStatus, } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { UsernameCell } from '../components' export const usernameColumn = ( @@ -20,7 +18,7 @@ export const usernameColumn = ( ) => boolean, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Username, + header: i18n.t('autodiscover.sentinel.column.username'), id: SentinelDatabaseIds.Username, accessorKey: SentinelDatabaseIds.Username, cell: ({ diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddErrorButton/AddErrorButton.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddErrorButton/AddErrorButton.tsx index e1aab4ee33..955387f88f 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddErrorButton/AddErrorButton.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddErrorButton/AddErrorButton.tsx @@ -6,6 +6,7 @@ import { ApiEncryptionErrors } from 'uiSrc/constants/apiErrors' import validationErrors from 'uiSrc/constants/validationErrors' import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { InfoIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import type { AddErrorButtonProps } from './AddErrorButton.types' @@ -16,6 +17,7 @@ export const AddErrorButton = ({ loading = false, onAddInstance = () => {}, }: AddErrorButtonProps) => { + const { t } = useTranslation() const isDisabled = !alias if ( typeof error === 'object' && @@ -32,7 +34,11 @@ export const AddErrorButton = ({ Database Alias : null} + content={ + isDisabled ? ( + {t('autodiscover.sentinel.aliasRequiredContent')} + ) : null + } > onAddInstance(name)} icon={isDisabled ? InfoIcon : undefined} > - Add Primary Group + {t('autodiscover.sentinel.button.addPrimaryGroup')} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddressCell/AddressCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddressCell/AddressCell.tsx index a11959f82d..030c5651ff 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddressCell/AddressCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AddressCell/AddressCell.tsx @@ -4,10 +4,13 @@ import { CopyPublicEndpointText, CopyBtnWrapper, } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import type { AddressCellProps } from './AddressCell.types' export const AddressCell = ({ host = '', port = '' }: AddressCellProps) => { + const { t } = useTranslation() + if (!host || !port) { return null } @@ -18,7 +21,11 @@ export const AddressCell = ({ host = '', port = '' }: AddressCellProps) => { {text} - + ) } diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AliasCell/AliasCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AliasCell/AliasCell.tsx index cb0da36e65..45b7e860a3 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AliasCell/AliasCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/AliasCell/AliasCell.tsx @@ -2,6 +2,7 @@ import React from 'react' import { CellText } from 'uiSrc/components/auto-discover' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' +import { useTranslation } from 'uiSrc/i18n' import type { AliasCellProps } from './AliasCell.types' @@ -14,6 +15,8 @@ export const AliasCell = ({ handleChangedInput, errorNotAuth, }: AliasCellProps) => { + const { t } = useTranslation() + if (errorNotAuth(error, status)) { return {alias} } @@ -21,7 +24,7 @@ export const AliasCell = ({ { + const { t } = useTranslation() + if (status === AddRedisDatabaseStatus.Success) { - return db !== undefined ? {db} : not assigned + return db !== undefined ? ( + {db} + ) : ( + {t('autodiscover.sentinel.cell.notAssigned')} + ) } const isDBInvalid = typeof error === 'object' && @@ -30,7 +37,7 @@ export const DbCell = ({ value={`${db}` || '0'} name={`db-${id}`} isInvalid={isDBInvalid} - placeholder="Enter Index" + placeholder={t('autodiscover.sentinel.cell.indexPlaceholder')} inputType={SentinelInputFieldType.Number} onChangedInput={handleChangedInput} /> diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/PasswordCell/PasswordCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/PasswordCell/PasswordCell.tsx index 548b3b8009..a30606905b 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/PasswordCell/PasswordCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/PasswordCell/PasswordCell.tsx @@ -2,6 +2,7 @@ import React from 'react' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' import { AddRedisDatabaseStatus } from 'uiSrc/slices/interfaces' +import { useTranslation } from 'uiSrc/i18n' import type { PasswordCellProps } from './PasswordCell.types' @@ -15,11 +16,17 @@ export const PasswordCell = ({ isInvalid, errorNotAuth, }: PasswordCellProps) => { + const { t } = useTranslation() + if ( errorNotAuth(error, status) || status === AddRedisDatabaseStatus.Success ) { - return password ? ************ : not assigned + return password ? ( + ************ + ) : ( + {t('autodiscover.sentinel.cell.notAssigned')} + ) } return (
@@ -27,7 +34,7 @@ export const PasswordCell = ({ isInvalid={isInvalid} value={password} name={`password-${id}`} - placeholder="Enter Password" + placeholder={t('autodiscover.sentinel.cell.passwordPlaceholder')} disabled={loading} inputType={SentinelInputFieldType.Password} onChangedInput={handleChangedInput} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/ResultCell/ResultCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/ResultCell/ResultCell.tsx index 49cb5a01ed..7c915dc6bf 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/ResultCell/ResultCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/ResultCell/ResultCell.tsx @@ -8,6 +8,7 @@ import { RiTooltip } from 'uiSrc/components' import { ColorText } from 'uiSrc/components/base/text' import { Spacer } from 'uiSrc/components/base/layout' import { RiIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import { AddErrorButton } from '../AddErrorButton/AddErrorButton' import type { ResultCellProps } from './ResultCell.types' @@ -22,6 +23,8 @@ export const ResultCell = ({ addActions, onAddInstance, }: ResultCellProps) => { + const { t } = useTranslation() + return ( {message} )} {!loading && status !== AddRedisDatabaseStatus.Success && ( - + - Error + {t('autodiscover.sentinel.cell.error')} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/UsernameCell/UsernameCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/UsernameCell/UsernameCell.tsx index d55050dc31..3d6bc33bde 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/UsernameCell/UsernameCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/column-definitions/components/UsernameCell/UsernameCell.tsx @@ -2,6 +2,7 @@ import React from 'react' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' import { AddRedisDatabaseStatus } from 'uiSrc/slices/interfaces' +import { useTranslation } from 'uiSrc/i18n' import type { UsernameCellProps } from './UsernameCell.types' @@ -15,11 +16,17 @@ export const UsernameCell = ({ isInvalid, errorNotAuth, }: UsernameCellProps) => { + const { t } = useTranslation() + if ( errorNotAuth(error, status) || status === AddRedisDatabaseStatus.Success ) { - return username ? {username} : Default + return username ? ( + {username} + ) : ( + {t('autodiscover.sentinel.cell.usernameDefault')} + ) } return (
@@ -28,7 +35,7 @@ export const UsernameCell = ({ isInvalid={isInvalid} value={username} name={`username-${id}`} - placeholder="Enter Username" + placeholder={t('autodiscover.sentinel.cell.usernamePlaceholder')} disabled={loading} inputType={SentinelInputFieldType.Text} onChangedInput={handleChangedInput} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/useSentinelDatabasesResultConfig.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/useSentinelDatabasesResultConfig.tsx index c1924d5004..0d219705e4 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/useSentinelDatabasesResultConfig.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/useSentinelDatabasesResultConfig.tsx @@ -16,6 +16,7 @@ import { ModifiedSentinelMaster, } from 'uiSrc/slices/interfaces' import { removeEmpty, setTitle } from 'uiSrc/utils' +import i18n from 'uiSrc/i18n' import { pick } from 'lodash' import { ColumnDef } from 'uiSrc/components/base/layout/table' import { @@ -97,7 +98,7 @@ export const useSentinelDatabasesResultConfig = () => { history.push(Pages.home) return } - setTitle('Redis Sentinel Primary Groups Added') + setTitle(i18n.t('autodiscover.sentinel.result.pageTitle')) setIsInvalid(true) setItems(masters) diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/SentinelDatabases.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/SentinelDatabases.tsx index 0997b2d696..5038efd6e1 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/SentinelDatabases.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/SentinelDatabases.tsx @@ -20,6 +20,7 @@ import { Header, } from 'uiSrc/components/auto-discover' import { Text } from 'uiSrc/components/base/text' +import { Trans, useTranslation } from 'uiSrc/i18n' import { getRowId } from '../../useSentinelDatabasesConfig' import { CancelButton, SubmitButton, NoMastersMessage } from './components' @@ -34,10 +35,6 @@ export interface Props { onSubmit: (databases: ModifiedSentinelMaster[]) => void } -const loadingMsg = 'loading...' -const notMastersMsg = 'Your Redis Sentinel has no primary groups available.' -const notFoundMsg = 'Not found.' - const SentinelDatabases = ({ columns, onSelectionChange, @@ -47,6 +44,11 @@ const SentinelDatabases = ({ masters, selection, }: Props) => { + const { t } = useTranslation() + const loadingMsg = t('autodiscover.sentinel.loading') + const notMastersMsg = t('autodiscover.sentinel.databases.noMasters') + const notFoundMsg = t('autodiscover.sentinel.notFound') + const [items, setItems] = useState(masters) const [message, setMessage] = useState(loadingMsg) @@ -105,15 +107,16 @@ const SentinelDatabases = ({
0 && ( - Redis Sentinel instance found. Here is a list of primary groups - your Sentinel instance is managing.
- Select the primary group(s) you want to add: + }} + />
) } diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/CancelButton/CancelButton.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/CancelButton/CancelButton.tsx index 5d2cbe43f7..42d6c52939 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/CancelButton/CancelButton.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/CancelButton/CancelButton.tsx @@ -5,6 +5,7 @@ import { } from 'uiSrc/components/base/forms/buttons' import { Text } from 'uiSrc/components/base/text' import { RiPopover } from 'uiSrc/components/base' +import { useTranslation } from 'uiSrc/i18n' import { type CancelButtonProps } from './CancelButton.types' import styles from './styles.module.scss' @@ -14,36 +15,37 @@ export const CancelButton = ({ onClose, onShowPopover, onClosePopover, -}: CancelButtonProps) => ( - - Cancel - - } - > - - Your changes have not been saved. Do you want to proceed to the - list of databases? - -
-
- - Proceed - -
-
-) +}: CancelButtonProps) => { + const { t } = useTranslation() + + return ( + + {t('autodiscover.sentinel.cancel.button')} + + } + > + {t('autodiscover.sentinel.cancel.confirm')} +
+
+ + {t('autodiscover.sentinel.cancel.proceed')} + +
+
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/SubmitButton/SubmitButton.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/SubmitButton/SubmitButton.tsx index a81b20d084..08e87e6b74 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/SubmitButton/SubmitButton.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/components/SubmitButton/SubmitButton.tsx @@ -3,6 +3,7 @@ import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { RiIcon } from 'uiSrc/components/base/icons' import { RiTooltip } from 'uiSrc/components/base' import validationErrors from 'uiSrc/constants/validationErrors' +import { useTranslation } from 'uiSrc/i18n' import { type SubmitButtonProps } from './SubmitButton.types' @@ -24,6 +25,7 @@ export const SubmitButton = ({ onClick, isDisabled, }: SubmitButtonProps) => { + const { t } = useTranslation() let title: string | null = null let content: string | null = null const emptyAliases = selection.filter(({ alias }) => !alias) @@ -35,7 +37,7 @@ export const SubmitButton = ({ if (emptyAliases.length !== 0) { title = validationErrors.REQUIRED_TITLE(emptyAliases.length) - content = 'Database Alias' + content = t('autodiscover.sentinel.aliasRequiredContent') } return ( @@ -51,7 +53,7 @@ export const SubmitButton = ({ } data-testid="btn-add-primary-group" > - Add Primary Group + {t('autodiscover.sentinel.button.addPrimaryGroup')} ) } diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/address.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/address.tsx index 7677da0aa4..e25d4773d7 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/address.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/address.tsx @@ -2,16 +2,14 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { AddressCell } from '../components' export const addressColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.Address, + header: i18n.t('autodiscover.sentinel.column.address'), id: SentinelDatabaseIds.Address, accessorKey: SentinelDatabaseIds.Address, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/alias.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/alias.tsx index 53945db9ff..977f993291 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/alias.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/alias.tsx @@ -3,16 +3,14 @@ import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' import { AliasCell } from '../components' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' export const aliasColumn = ( handleChangedInput: (name: string, value: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Alias, + header: i18n.t('autodiscover.sentinel.column.alias'), id: SentinelDatabaseIds.Alias, accessorKey: SentinelDatabaseIds.Alias, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/dbIndex.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/dbIndex.tsx index 344e9f0c5b..4d4e5eef81 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/dbIndex.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/dbIndex.tsx @@ -3,16 +3,14 @@ import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' import { DbIndexCell } from '../components' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' export const dbIndexColumn = ( handleChangedInput: (name: string, value: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.DatabaseIndex, + header: i18n.t('autodiscover.sentinel.column.databaseIndex'), id: SentinelDatabaseIds.DatabaseIndex, accessorKey: SentinelDatabaseIds.DatabaseIndex, size: 140, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/numberOfReplicas.ts b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/numberOfReplicas.ts index 9837bd82dd..544186a725 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/numberOfReplicas.ts +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/numberOfReplicas.ts @@ -1,14 +1,12 @@ import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' export const numberOfReplicasColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.NumberOfReplicas, + header: i18n.t('autodiscover.sentinel.column.numberOfReplicas'), id: SentinelDatabaseIds.NumberOfReplicas, accessorKey: SentinelDatabaseIds.NumberOfReplicas, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/password.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/password.tsx index adbdd33ba0..3e4a094ae0 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/password.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/password.tsx @@ -2,10 +2,8 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { PasswordCell } from '../components' @@ -13,7 +11,7 @@ export const passwordColumn = ( handleChangedInput: (name: string, value: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Password, + header: i18n.t('autodiscover.sentinel.column.password'), id: SentinelDatabaseIds.Password, accessorKey: SentinelDatabaseIds.Password, cell: ({ diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/primaryGroup.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/primaryGroup.tsx index 3998a347f4..774c58e924 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/primaryGroup.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/primaryGroup.tsx @@ -3,15 +3,13 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { PrimaryGroupCell } from '../components' export const primaryGroupColumn = (): ColumnDef => { return { - header: SentinelDatabaseTitles.PrimaryGroup, + header: i18n.t('autodiscover.sentinel.column.primaryGroup'), id: SentinelDatabaseIds.PrimaryGroup, accessorKey: SentinelDatabaseIds.PrimaryGroup, enableSorting: true, diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/username.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/username.tsx index b12b298aa0..e0690c5a04 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/username.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/columns/username.tsx @@ -2,10 +2,8 @@ import React from 'react' import type { ColumnDef } from 'uiSrc/components/base/layout/table' import type { ModifiedSentinelMaster } from 'uiSrc/slices/interfaces' -import { - SentinelDatabaseIds, - SentinelDatabaseTitles, -} from 'uiSrc/pages/autodiscover-sentinel/constants/constants' +import i18n from 'uiSrc/i18n' +import { SentinelDatabaseIds } from 'uiSrc/pages/autodiscover-sentinel/constants/constants' import { UsernameCell } from '../components' @@ -13,7 +11,7 @@ export const usernameColumn = ( handleChangedInput: (name: string, value: string) => void, ): ColumnDef => { return { - header: SentinelDatabaseTitles.Username, + header: i18n.t('autodiscover.sentinel.column.username'), id: SentinelDatabaseIds.Username, accessorKey: SentinelDatabaseIds.Username, cell: ({ diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AddressCell/AddressCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AddressCell/AddressCell.tsx index c64f5c69ca..c17e0de6a8 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AddressCell/AddressCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AddressCell/AddressCell.tsx @@ -4,10 +4,13 @@ import { CopyPublicEndpointText, CopyBtnWrapper, } from 'uiSrc/components/auto-discover' +import { useTranslation } from 'uiSrc/i18n' import type { AddressCellProps } from './AddressCell.types' export const AddressCell = ({ host, port }: AddressCellProps) => { + const { t } = useTranslation() + if (!host || !port) { return null } @@ -18,7 +21,7 @@ export const AddressCell = ({ host, port }: AddressCellProps) => { {text} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AliasCell/AliasCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AliasCell/AliasCell.tsx index b12bbf87e0..2554c429eb 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AliasCell/AliasCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/AliasCell/AliasCell.tsx @@ -1,6 +1,7 @@ import React from 'react' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' +import { useTranslation } from 'uiSrc/i18n' import type { AliasCellProps } from './AliasCell.types' @@ -9,15 +10,19 @@ export const AliasCell = ({ alias, name, handleChangedInput, -}: AliasCellProps) => ( -
- -
-) +}: AliasCellProps) => { + const { t } = useTranslation() + + return ( +
+ +
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/DbIndexCell/DbIndexCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/DbIndexCell/DbIndexCell.tsx index cea8395bf4..e65e8071dd 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/DbIndexCell/DbIndexCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/DbIndexCell/DbIndexCell.tsx @@ -2,6 +2,7 @@ import React from 'react' import { InputFieldSentinel, RiTooltip } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' import { RiIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import type { DbIndexCellProps } from './DbIndexCell.types' @@ -9,24 +10,28 @@ export const DbIndexCell = ({ db = 0, id, handleChangedInput, -}: DbIndexCellProps) => ( -
- - - - } - /> -
-) +}: DbIndexCellProps) => { + const { t } = useTranslation() + + return ( +
+ + + + } + /> +
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/PasswordCell/PasswordCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/PasswordCell/PasswordCell.tsx index 075a0b05b0..0464586bf4 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/PasswordCell/PasswordCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/PasswordCell/PasswordCell.tsx @@ -1,6 +1,7 @@ import React from 'react' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' +import { useTranslation } from 'uiSrc/i18n' import type { PasswordCellProps } from './PasswordCell.types' @@ -8,14 +9,18 @@ export const PasswordCell = ({ password, id, handleChangedInput, -}: PasswordCellProps) => ( -
- -
-) +}: PasswordCellProps) => { + const { t } = useTranslation() + + return ( +
+ +
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/UsernameCell/UsernameCell.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/UsernameCell/UsernameCell.tsx index 7798132197..44c5d8e2e5 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/UsernameCell/UsernameCell.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/column-definitions/components/UsernameCell/UsernameCell.tsx @@ -1,6 +1,7 @@ import React from 'react' import { InputFieldSentinel } from 'uiSrc/components' import { SentinelInputFieldType } from 'uiSrc/components/input-field-sentinel/InputFieldSentinel' +import { useTranslation } from 'uiSrc/i18n' import type { UsernameCellProps } from './UsernameCell.types' @@ -8,14 +9,18 @@ export const UsernameCell = ({ username, id, handleChangedInput, -}: UsernameCellProps) => ( -
- -
-) +}: UsernameCellProps) => { + const { t } = useTranslation() + + return ( +
+ +
+ ) +} diff --git a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/useSentinelDatabasesConfig.tsx b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/useSentinelDatabasesConfig.tsx index 4d40f0dfeb..07638b2b15 100644 --- a/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/useSentinelDatabasesConfig.tsx +++ b/redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/useSentinelDatabasesConfig.tsx @@ -14,6 +14,7 @@ import { import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { Pages } from 'uiSrc/constants' import { setTitle } from 'uiSrc/utils' +import i18n from 'uiSrc/i18n' import { CreateSentinelDatabaseDto } from 'apiClient' import { ColumnDef, @@ -82,7 +83,7 @@ export const useSentinelDatabasesConfig = () => { } }, [masters.length]) - useEffect(() => setTitle('Auto-Discover Redis Sentinel Primary Groups'), []) + useEffect(() => setTitle(i18n.t('autodiscover.sentinel.databases.title')), []) const handleClose = useCallback(() => { sendCancelEvent() dispatch(resetDataSentinel()) diff --git a/redisinsight/ui/src/pages/browser/BrowserPage.test.tsx b/redisinsight/ui/src/pages/browser/BrowserPage.test.tsx index 3d51c92411..a5cdca3d60 100644 --- a/redisinsight/ui/src/pages/browser/BrowserPage.test.tsx +++ b/redisinsight/ui/src/pages/browser/BrowserPage.test.tsx @@ -207,7 +207,7 @@ describe('KeyDetailsHeader', () => { await waitForRiTooltipVisible() expect(screen.queryByTestId('apply-tooltip')).toBeInTheDocument() - }) + }, 10_000) }) describe('KeyDetailsWrapper', () => { diff --git a/redisinsight/ui/src/pages/browser/BrowserPage.tsx b/redisinsight/ui/src/pages/browser/BrowserPage.tsx index 97d8bc3768..fbd368b477 100644 --- a/redisinsight/ui/src/pages/browser/BrowserPage.tsx +++ b/redisinsight/ui/src/pages/browser/BrowserPage.tsx @@ -92,8 +92,6 @@ const BrowserPage = () => { const overview = useAppSelector(connectedInstanceOverviewSelector) const featureFlags = useAppSelector(appFeatureFlagsFeaturesSelector) const isDevBrowser = featureFlags?.[FeatureFlags.devBrowser]?.flag ?? false - const isVectorSearch = - featureFlags?.[FeatureFlags.vectorSearchV2]?.flag ?? false const panelMinSize = isDevBrowser ? 20 : 45 const panelDefaultSize = 50 @@ -232,12 +230,11 @@ const BrowserPage = () => { const handleCreateIndexPanel = useCallback( (value: boolean) => { - if (value && isVectorSearch) { + if (value) { history.push(Pages.vectorSearch(instanceId)) - return } }, - [isVectorSearch, instanceId], + [instanceId], ) const closeRightPanels = useCallback(() => { diff --git a/redisinsight/ui/src/pages/browser/components/action-footer/ActionFooter.tsx b/redisinsight/ui/src/pages/browser/components/action-footer/ActionFooter.tsx index de016f2ed7..556022cf95 100644 --- a/redisinsight/ui/src/pages/browser/components/action-footer/ActionFooter.tsx +++ b/redisinsight/ui/src/pages/browser/components/action-footer/ActionFooter.tsx @@ -7,6 +7,7 @@ import { import AddKeyFooter from 'uiSrc/pages/browser/components/add-key/AddKeyFooter/AddKeyFooter' import { SpacerSize } from 'uiSrc/components/base/layout/spacer/spacer.styles' import { Panel } from 'uiSrc/components/panel' +import { useTranslation } from 'uiSrc/i18n' export interface ActionFooterProps { cancelText?: string @@ -25,8 +26,8 @@ export interface ActionFooterProps { } export const ActionFooter = ({ - cancelText = 'Cancel', - actionText = 'Save', + cancelText, + actionText, onCancel, onAction, disabled = false, @@ -39,6 +40,9 @@ export const ActionFooter = ({ usePortal = true, enableFormSubmit = true, }: ActionFooterProps) => { + const { t } = useTranslation() + const resolvedCancelText = cancelText ?? t('browser.addKey.button.cancel') + const resolvedActionText = actionText ?? t('browser.addKey.button.save') const content = ( @@ -47,7 +51,7 @@ export const ActionFooter = ({ data-testid={cancelTestId} className={cancelClassName} > - {cancelText} + {resolvedCancelText} @@ -59,7 +63,7 @@ export const ActionFooter = ({ data-testid={actionTestId} className={actionClassName} > - {actionText} + {resolvedActionText} diff --git a/redisinsight/ui/src/pages/browser/components/actions/Actions.tsx b/redisinsight/ui/src/pages/browser/components/actions/Actions.tsx index dc4d90d629..6567c5eeaa 100644 --- a/redisinsight/ui/src/pages/browser/components/actions/Actions.tsx +++ b/redisinsight/ui/src/pages/browser/components/actions/Actions.tsx @@ -21,12 +21,14 @@ import { FeatureFlagComponent } from 'uiSrc/components' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { keysSelector } from 'uiSrc/slices/browser/keys' import { Row } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' export interface Props { handleAddKeyPanel: (value: boolean) => void handleBulkActionsPanel: (value: boolean) => void } const Actions = ({ handleAddKeyPanel, handleBulkActionsPanel }: Props) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const { id: instanceId } = useAppSelector(connectedInstanceSelector) const { viewType, search, filter } = useAppSelector(keysSelector) @@ -52,7 +54,7 @@ const Actions = ({ handleAddKeyPanel, handleBulkActionsPanel }: Props) => { onClick={openAddKeyPanel} data-testid="btn-add-key" > - Add key + {t('browser.actions.addKey')} ) const openBulkActions = () => { @@ -70,9 +72,9 @@ const Actions = ({ handleAddKeyPanel, handleBulkActionsPanel }: Props) => { icon={SubscriptionsIcon} onClick={openBulkActions} data-testid="btn-bulk-actions" - aria-label="bulk actions" + aria-label={t('browser.actions.bulkActionsAria')} > - Bulk actions + {t('browser.actions.bulkActions')} ) return ( diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.spec.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.spec.tsx index ae9d5a706b..f5cb1f4b0d 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.spec.tsx @@ -1,11 +1,9 @@ import React from 'react' -import { cloneDeep, set } from 'lodash' +import { cloneDeep } from 'lodash' import { cleanup, - initialStateDefault, mockedStore, - mockStore, render, screen, userEvent, @@ -23,7 +21,6 @@ import { import * as appFeaturesSlice from 'uiSrc/slices/app/features' import { setSSOFlow } from 'uiSrc/slices/instances/cloud' import { setSocialDialogState } from 'uiSrc/slices/oauth/cloud' -import { FeatureFlags } from 'uiSrc/constants' import AddKey from './AddKey' const handleAddKeyPanelMock = () => {} @@ -40,27 +37,13 @@ jest.mock('uiSrc/slices/instances/instances', () => ({ }), })) -/** - * Build a fresh store with the `vectorSet` feature flag pre-seeded so the - * Vector Set option's `isEnabledSelector` (which reads the flag from the - * features slice) resolves correctly. We seed the store rather than spying - * on the selector because the option config holds an import-time reference - * to the selector, which jest spies on the module export cannot intercept. - */ -const renderWithVectorSetFlag = (enabled: boolean) => { - const storeState = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.vectorSet}`, - { flag: enabled }, - ) - return render( +const renderAddKey = () => + render( , - { store: mockStore(storeState) }, ) -} const mockRedisVersion = (version: string) => (connectedInstanceOverviewSelector as jest.Mock).mockReturnValue({ version }) @@ -169,28 +152,24 @@ describe('AddKey', () => { ]) }) - it('should show Vector Set option when redis version >= 8.0 and vector set flag is enabled', async () => { + it('should show Vector Set option as enabled when redis version >= 8.0', async () => { mockRedisVersion('8.0.0') - renderWithVectorSetFlag(true) + renderAddKey() await userEvent.click(screen.getByTestId('select-key-type')) expect(await screen.findByText('Vector Set')).toBeInTheDocument() + // no promotion tag/wrapper when the type is supported + expect(screen.queryByTestId('vectorset-disabled')).not.toBeInTheDocument() }) - it('should hide Vector Set option when redis version < 8.0', async () => { + it('should promote Vector Set as a disabled option with a version tag when redis version < 8.0', async () => { mockRedisVersion('7.4.0') - renderWithVectorSetFlag(true) + renderAddKey() await userEvent.click(screen.getByTestId('select-key-type')) - expect(screen.queryByText('Vector Set')).not.toBeInTheDocument() - }) - - it('should hide Vector Set option when vector set flag is disabled', async () => { - mockRedisVersion('8.0.0') - renderWithVectorSetFlag(false) - - await userEvent.click(screen.getByTestId('select-key-type')) - expect(screen.queryByText('Vector Set')).not.toBeInTheDocument() + // still visible (promoted), not removed from the list, rendered as disabled + expect(await screen.findByText('Vector Set')).toBeInTheDocument() + expect(screen.getByTestId('vectorset-disabled')).toBeInTheDocument() }) it('should not show text if db contains ReJSON module', async () => { diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.tsx index 62d6ce5ff1..f47c19739a 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.tsx @@ -33,11 +33,12 @@ import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { CancelSlimIcon } from 'uiSrc/components/base/icons' -import { HealthText } from 'uiSrc/components/base/text/HealthText' import { Title } from 'uiSrc/components/base/text/Title' import { RiTooltip } from 'uiSrc/components' import { Spacer } from 'uiSrc/components/base/layout' +import { useTranslation } from 'uiSrc/i18n' import { ADD_KEY_TYPE_OPTIONS } from './constants/key-type-options' +import { KeyTypeOption } from './KeyTypeOption/KeyTypeOption' import AddKeyHash from './AddKeyHash' import AddKeyZset from './AddKeyZset' import AddKeyString from './AddKeyString' @@ -58,6 +59,7 @@ export interface Props { } const AddKey = (props: Props) => { const { onAddKeyPanel, onClosePanel, arePanelsCollapsed } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const { loading } = useAppSelector(addKeyStateSelector) @@ -87,27 +89,18 @@ const AddKey = (props: Props) => { [], ) - const options = enabledOptions - .filter( - ({ minVersion }) => - !minVersion || isVersionHigherOrEquals(version, minVersion), - ) - .map((item) => { - const { value, color, text } = item - return { - value, - inputDisplay: ( - - {text} - - ), - } - }) + // Version-gated types (e.g. Vector Set, Array) stay in the list as disabled + // entries on unsupported Redis versions instead of being hidden. + const options = enabledOptions.map((item) => { + const isSupported = + !item.minVersion || isVersionHigherOrEquals(version, item.minVersion) + + return { + value: item.value, + disabled: !isSupported, + inputDisplay: , + } + }) const [typeSelected, setTypeSelected] = useState( options[0]?.value ?? KeyTypes.Hash, ) @@ -116,6 +109,9 @@ const AddKey = (props: Props) => { const [keyNameDisabled, setKeyNameDisabled] = useState(false) const onChangeType = (value: string) => { + if (options.find((option) => option.value === value)?.disabled) { + return + } setTypeSelected(value) } @@ -164,16 +160,16 @@ const AddKey = (props: Props) => { > - New Key + {t('browser.addKey.title')} {!arePanelsCollapsed && ( closeKey()} /> diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.types.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.types.ts index 02b313467d..091f7e3bd7 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKey.types.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKey.types.ts @@ -1,7 +1,8 @@ +import { ParseKeys } from 'i18next' import { RootState } from 'uiSrc/slices/store' export type AddKeyTypeOption = { - text: string + text: ParseKeys value: string color: string minVersion?: string diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.spec.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.spec.tsx index 5876dd9272..127d1f9166 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.spec.tsx @@ -9,6 +9,7 @@ import { waitFor, } from 'uiSrc/utils/test-utils' import { addArrayKey, addKeyIntoList } from 'uiSrc/slices/browser/keys' +import i18n from 'uiSrc/i18n' import { stringToBuffer } from 'uiSrc/utils' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { Environment } from 'apiClient' @@ -92,7 +93,10 @@ const contiguousDataset = SAMPLE_DATASETS.find( const valueFindingRegex = /^value-\d+$/ const getModeOptionLabel = (mode: string) => - CREATION_MODE_OPTIONS.find(({ value }) => value === mode)?.label ?? '' + i18n.t( + (CREATION_MODE_OPTIONS.find(({ value }) => value === mode)?.label ?? + '') as never, + ) const selectSampleMode = () => fireEvent.click(screen.getByTestId('add-key-array-populate-sample')) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.tsx index c7f9535aeb..fd735bbbb4 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.tsx @@ -30,6 +30,7 @@ import { Text } from 'uiSrc/components/base/text' import { FormField } from 'uiSrc/components/base/forms/FormField' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' import { CreateArrayWithExpireDto, Environment } from 'apiClient' +import { useTranslation } from 'uiSrc/i18n' import LoadSampleDataset, { DEFAULT_SAMPLE_DATASET, @@ -82,6 +83,12 @@ const AddKeyArray = (props: Props) => { setKeyName, setKeyNameDisabled, } = props + const { t } = useTranslation() + const creationModeOptions = CREATION_MODE_OPTIONS.map((option) => ({ + ...option, + inputDisplay: t(option.inputDisplay), + label: t(option.label), + })) const [populateMode, setPopulateMode] = useState( PopulateMode.Manual, ) @@ -253,7 +260,7 @@ const AddKeyArray = (props: Props) => { return ( - + setPopulateMode(value)} @@ -275,11 +282,11 @@ const AddKeyArray = (props: Props) => { - {option.label} + {t(option.label)} {option.description && ( - {option.description} + {t(option.description)} )} @@ -304,8 +311,7 @@ const AddKeyArray = (props: Props) => { color="danger" data-testid="add-key-array-prod-warning" > - Loading sample data is disabled for your production database to - avoid accidental data modifications. + {t('browser.addKey.array.prodWarning')} )} @@ -314,7 +320,7 @@ const AddKeyArray = (props: Props) => { <> setMode(value as ArrayCreationMode)} data-testid="creation-mode-select" /> @@ -337,7 +343,7 @@ const AddKeyArray = (props: Props) => { onCancel(true)} onAction={onClickAction} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading || isSubmittingSampleDataset} disabled={ isSampleMode diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.types.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.types.ts index edc63d1ada..1dc6620eb6 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.types.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArray.types.ts @@ -1,11 +1,12 @@ +import { ParseKeys } from 'i18next' import { Maybe } from 'uiSrc/utils' import type { PopulateMode } from './constants' export interface PopulateOption { value: PopulateMode - label: string - description?: string + label: ParseKeys + description?: ParseKeys disabled?: boolean id: string } diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArrayContiguous/AddKeyArrayContiguous.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArrayContiguous/AddKeyArrayContiguous.tsx index e68ae1599b..85ff7f56ec 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArrayContiguous/AddKeyArrayContiguous.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArrayContiguous/AddKeyArrayContiguous.tsx @@ -5,12 +5,15 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { Spacer } from 'uiSrc/components/base/layout' import { FormField } from 'uiSrc/components/base/forms/FormField' -import { AddArrayFormConfig as config } from '../../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddArrayFormConfig } from '../../constants/fields-config' import AddMultipleFields from '../../../add-multiple-fields' import { AddKeyArrayContiguousProps } from './AddKeyArrayContiguous.types' const AddKeyArrayContiguous = (props: AddKeyArrayContiguousProps) => { const { disabled, value, onChange } = props + const { t } = useTranslation() + const config = getAddArrayFormConfig(t) const { startIndex, values } = value const setStartIndex = (next: string) => onChange({ startIndex: next, values }) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArraySparse/AddKeyArraySparse.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArraySparse/AddKeyArraySparse.tsx index 565ef5edb4..f2cf1eeb14 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArraySparse/AddKeyArraySparse.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/AddKeyArraySparse/AddKeyArraySparse.tsx @@ -5,7 +5,8 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { FormField } from 'uiSrc/components/base/forms/FormField' -import { AddArrayFormConfig as config } from '../../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddArrayFormConfig } from '../../constants/fields-config' import AddMultipleFields from '../../../add-multiple-fields' import { IArraySparseElement, @@ -15,6 +16,8 @@ import { AddKeyArraySparseProps } from './AddKeyArraySparse.types' const AddKeyArraySparse = (props: AddKeyArraySparseProps) => { const { disabled, value, onChange } = props + const { t } = useTranslation() + const config = getAddArrayFormConfig(t) const { elements } = value const setElements = (next: IArraySparseElement[]) => diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.constants.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.constants.ts index bb981050cd..1a1ea6ea56 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.constants.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.constants.ts @@ -1,3 +1,4 @@ +import { TFunction } from 'i18next' import { SAMPLE_DATASETS } from './data' import { SampleArrayDataset } from './LoadSampleDataset.types' @@ -8,11 +9,30 @@ export const DATASET_OPTIONS = SAMPLE_DATASETS.map( }), ) +// `testId` stays a stable English slug (used for keys and data-testids); +// `label` is localized at render. export const getDatasetInfo = ( dataset: SampleArrayDataset, -): Array<{ label: string; value: string }> => [ - { label: 'Key', value: dataset.keyName }, - { label: 'Elements', value: `${dataset.elementCount}` }, - { label: 'Highest index', value: dataset.highestIndex }, - { label: 'Layout', value: dataset.description }, + t: TFunction, +): Array<{ testId: string; label: string; value: string }> => [ + { + testId: 'key', + label: t('browser.addKey.array.summary.key'), + value: dataset.keyName, + }, + { + testId: 'elements', + label: t('browser.addKey.array.summary.elements'), + value: `${dataset.elementCount}`, + }, + { + testId: 'highest-index', + label: t('browser.addKey.array.summary.highestIndex'), + value: dataset.highestIndex, + }, + { + testId: 'layout', + label: t('browser.addKey.array.summary.layout'), + value: dataset.description, + }, ] diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.tsx index e0b921967e..a7fd1d683c 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/LoadSampleDataset.tsx @@ -3,6 +3,7 @@ import React from 'react' import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' import { Col, Row } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { SAMPLE_DATASETS } from './data' import { DATASET_OPTIONS, getDatasetInfo } from './LoadSampleDataset.constants' @@ -13,6 +14,7 @@ import * as S from './LoadSampleDataset.styles' // Key action. Full data lives in backend data files, so this shows just the // first rows. const LoadSampleDataset = ({ dataset, onDatasetChange, disabled }: Props) => { + const { t } = useTranslation() const remaining = dataset.elementCount - dataset.previewRows.length return ( @@ -62,7 +64,7 @@ const LoadSampleDataset = ({ dataset, onDatasetChange, disabled }: Props) => { color="secondary" data-testid="load-sample-dataset-preview-more" > - … and {remaining} more + {t('browser.addKey.array.moreItems', { count: remaining })} )} @@ -74,12 +76,12 @@ const LoadSampleDataset = ({ dataset, onDatasetChange, disabled }: Props) => { data-testid="load-sample-dataset-info" grow={false} > - {getDatasetInfo(dataset).map((row) => ( + {getDatasetInfo(dataset, t).map((row) => ( {row.label}: diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/notifications.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/notifications.ts index 0b29d72f83..cfed344d5a 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/notifications.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/LoadSampleDataset/notifications.ts @@ -1,20 +1,21 @@ import { ToastVariant } from 'uiSrc/components/base/display/toast/RiToast' +import i18n from 'uiSrc/i18n' export const loadSampleDatasetFailedNotification = () => ({ - title: 'Failed to create array', - message: 'Please try again.', + title: i18n.t('notification.error.createArray.title'), + message: i18n.t('notification.error.createArray.message'), variant: 'danger' as ToastVariant, }) export const sampleDatasetLoadedNotification = (keyName: string) => ({ - title: 'Sample array added', - message: `The '${keyName}' sample array has been successfully added.`, + title: i18n.t('notification.success.sampleArrayAdded.title'), + message: i18n.t('notification.success.sampleArrayAdded.message', { keyName }), showCloseButton: false, }) export const sampleDatasetTtlFailedNotification = (keyName: string) => ({ - title: 'Sample array added without TTL', - message: `The '${keyName}' sample array was created, but the TTL could not be applied.`, + title: i18n.t('notification.warning.sampleArrayNoTtl.title'), + message: i18n.t('notification.warning.sampleArrayNoTtl.message', { keyName }), variant: 'notice' as ToastVariant, showCloseButton: false, }) @@ -22,8 +23,8 @@ export const sampleDatasetTtlFailedNotification = (keyName: string) => ({ // Copy stays generic on purpose: we can verify only that the key exists, not // that it holds the bundled sample. export const keyAlreadyExistsNotification = (keyName: string) => ({ - title: 'Key already exists', - message: `A key named '${keyName}' already exists in this database.`, + title: i18n.t('notification.warning.keyExists.title'), + message: i18n.t('notification.warning.keyExists.message', { keyName }), variant: 'notice' as ToastVariant, showCloseButton: false, }) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/constants.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/constants.ts index c08b35f5c8..6f3329aae0 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/constants.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyArray/constants.ts @@ -1,3 +1,4 @@ +import { ParseKeys } from 'i18next' import { CreateArrayWithExpireDto } from 'apiClient' import type { PopulateOption } from './AddKeyArray.types' @@ -7,16 +8,21 @@ export type ArrayCreationMode = CreateArrayWithExpireDto['mode'] export const CONTIGUOUS_MODE: ArrayCreationMode = 'contiguous' export const SPARSE_MODE: ArrayCreationMode = 'sparse' -export const CREATION_MODE_OPTIONS = [ +// inputDisplay/label hold i18n keys, resolved with t() at render time. +export const CREATION_MODE_OPTIONS: { + value: ArrayCreationMode + inputDisplay: ParseKeys + label: ParseKeys +}[] = [ { value: CONTIGUOUS_MODE, - inputDisplay: 'Contiguous (sequential indexes)', - label: 'Contiguous (sequential indexes)', + inputDisplay: 'browser.addKey.array.mode.contiguous', + label: 'browser.addKey.array.mode.contiguous', }, { value: SPARSE_MODE, - inputDisplay: 'Sparse (explicit indexes)', - label: 'Sparse (explicit indexes)', + inputDisplay: 'browser.addKey.array.mode.sparse', + label: 'browser.addKey.array.mode.sparse', }, ] @@ -32,19 +38,20 @@ export enum PopulateMode { Manual = 'manual', } +// label/description hold i18n keys, resolved with t() at render time. export const POPULATE_OPTIONS: PopulateOption[] = [ { value: PopulateMode.Sample, - label: 'Load sample data', - description: 'Explore arrays with one of the bundled sample datasets.', + label: 'browser.addKey.array.populate.sample.label', + description: 'browser.addKey.array.populate.sample.description', id: 'populate-sample', }, { value: PopulateMode.Manual, - label: 'Create manually', - description: 'Define your own key, indexes, and values from scratch.', + label: 'browser.addKey.array.populate.manual.label', + description: 'browser.addKey.array.populate.manual.description', id: 'populate-manual', }, ] -export const POPULATE_LABEL = 'How would you like to populate this array?' +export const POPULATE_LABEL: ParseKeys = 'browser.addKey.array.populateLabel' diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyCommonFields/AddKeyCommonFields.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyCommonFields/AddKeyCommonFields.tsx index a78abcd7b7..6a121e487e 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyCommonFields/AddKeyCommonFields.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyCommonFields/AddKeyCommonFields.tsx @@ -8,7 +8,8 @@ import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' import { FormFieldset } from 'uiSrc/components/base/forms/fieldset' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { TextInput } from 'uiSrc/components/base/inputs' -import { AddCommonFieldsFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddCommonFieldsFormConfig } from '../constants/fields-config' import styles from './styles.module.scss' @@ -41,6 +42,8 @@ const AddKeyCommonFields = (props: Props) => { setKeyTTL, keyNameDisabled = false, } = props + const { t } = useTranslation() + const config = getAddCommonFieldsFormConfig(t) const handleTTLChange = (value: string) => { const validatedValue = validateTTLNumberForAddKey(value) @@ -56,9 +59,12 @@ const AddKeyCommonFields = (props: Props) => { - + diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx index 202624ce88..6e9fe3aea1 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx @@ -21,7 +21,8 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { CreateHashWithExpireDto, HashFieldDto } from 'apiClient' import { IHashFieldState, INITIAL_HASH_FIELD_STATE } from './interfaces' -import { AddHashFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddHashFormConfig } from '../constants/fields-config' export interface Props { keyName: string @@ -31,6 +32,8 @@ export interface Props { const AddKeyHash = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddHashFormConfig(t) const { loading } = useAppSelector(addKeyStateSelector) const { version } = useAppSelector(connectedInstanceOverviewSelector) const { [FeatureFlags.hashFieldExpiration]: hashFieldExpirationFeature } = @@ -196,7 +199,7 @@ const AddKeyHash = (props: Props) => { @@ -218,7 +221,7 @@ const AddKeyHash = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-hash-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx index 08bbaf398d..c890f90ff8 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx @@ -5,7 +5,7 @@ import { Maybe, stringToBuffer } from 'uiSrc/utils' import { addKeyStateSelector, addListKey } from 'uiSrc/slices/browser/keys' import { ActionFooter } from 'uiSrc/pages/browser/components/action-footer' import { - optionsDestinations, + HEAD_DESTINATION, TAIL_DESTINATION, } from 'uiSrc/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements' import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' @@ -13,7 +13,8 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { Spacer } from 'uiSrc/components/base/layout' import { CreateListWithExpireDto, ListElementDestination } from 'apiClient' -import { AddListFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddListFormConfig } from '../constants/fields-config' import AddMultipleFields from '../../add-multiple-fields' export interface Props { @@ -24,6 +25,20 @@ export interface Props { const AddKeyList = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddListFormConfig(t) + const destinationOptions = [ + { + value: TAIL_DESTINATION, + inputDisplay: t('browser.list.destination.tail'), + label: t('browser.list.destination.tail'), + }, + { + value: HEAD_DESTINATION, + inputDisplay: t('browser.list.destination.head'), + label: t('browser.list.destination.head'), + }, + ] const [elements, setElements] = useState(['']) const [destination, setDestination] = useState(TAIL_DESTINATION) @@ -82,7 +97,7 @@ const AddKeyList = (props: Props) => { setDestination(value as ListElementDestination)} data-testid="destination-select" /> @@ -108,7 +123,7 @@ const AddKeyList = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-list-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx index 9d705c9bbf..c7593461f1 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx @@ -13,7 +13,8 @@ import { FormField } from 'uiSrc/components/base/forms/FormField' import { ActionFooter } from 'uiSrc/pages/browser/components/action-footer' import { CreateRejsonRlWithExpireDto } from 'apiClient' -import { AddJSONFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddJSONFormConfig } from '../constants/fields-config' export interface Props { keyName: string @@ -23,6 +24,8 @@ export interface Props { const AddKeyReJSON = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddJSONFormConfig(t) const { loading } = useAppSelector(addKeyStateSelector) const [ReJSONValue, setReJSONValue] = useState('') const [isFormValid, setIsFormValid] = useState(false) @@ -96,7 +99,7 @@ const AddKeyReJSON = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-json-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx index 5f209874da..ffc05e8b95 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx @@ -11,7 +11,8 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { CreateSetWithExpireDto } from 'apiClient' import { INITIAL_SET_MEMBER_STATE, ISetMemberState } from './interfaces' -import { AddSetFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddSetFormConfig } from '../constants/fields-config' export interface Props { keyName: string @@ -21,6 +22,8 @@ export interface Props { const AddKeySet = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddSetFormConfig(t) const { loading } = useAppSelector(addKeyStateSelector) const [members, setMembers] = useState([ { ...INITIAL_SET_MEMBER_STATE }, @@ -151,7 +154,7 @@ const AddKeySet = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-set-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyStream/AddKeyStream.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyStream/AddKeyStream.tsx index e8550485ec..82876f9090 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyStream/AddKeyStream.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyStream/AddKeyStream.tsx @@ -7,7 +7,7 @@ import { Maybe, stringToBuffer, } from 'uiSrc/utils' -import { AddStreamFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' import { StreamEntryFields } from 'uiSrc/pages/browser/modules/key-details/components/stream-details/add-stream-entity' import { ActionFooter } from 'uiSrc/pages/browser/components/action-footer' import { CreateStreamDto } from 'apiClient' @@ -28,6 +28,7 @@ export const INITIAL_STREAM_FIELD_STATE = { const AddKeyStream = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() const [entryIdError, setEntryIdError] = useState('') const [entryID, setEntryID] = useState('*') @@ -49,9 +50,7 @@ const AddKeyStream = (props: Props) => { const validateEntryID = () => { setEntryIdError( - entryIdRegex.test(entryID) - ? '' - : `${config.entryId.name} format is incorrect`, + entryIdRegex.test(entryID) ? '' : t('browser.addKey.stream.entryIdError'), ) } @@ -95,7 +94,7 @@ const AddKeyStream = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} disabled={!isFormValid} actionTestId="add-key-hash-btn" /> diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx index 156624092f..186fbb28ba 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx @@ -9,7 +9,8 @@ import { ActionFooter } from 'uiSrc/pages/browser/components/action-footer' import { FormField } from 'uiSrc/components/base/forms/FormField' import { TextArea } from 'uiSrc/components/base/inputs' import { SetStringWithExpireDto } from 'apiClient' -import { AddStringFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddStringFormConfig } from '../constants/fields-config' export interface Props { keyName: string @@ -19,6 +20,8 @@ export interface Props { const AddKeyString = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddStringFormConfig(t) const { loading } = useAppSelector(addKeyStateSelector) const [value, setValue] = useState('') const [isFormValid, setIsFormValid] = useState(false) @@ -63,7 +66,7 @@ const AddKeyString = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-string-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.tsx index 997efacfae..89df819ea1 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.tsx @@ -28,6 +28,7 @@ import { FormField } from 'uiSrc/components/base/forms/FormField' import { Col } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' import { Spacer } from 'uiSrc/components/base/layout/spacer' +import { useTranslation } from 'uiSrc/i18n' import { SubmitElement, @@ -53,6 +54,7 @@ const AddKeyVectorSet = ({ setKeyName, setKeyNameDisabled, }: Props) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const { loading } = useAppSelector(addKeyStateSelector) const { id: instanceId } = useAppSelector(connectedInstanceSelector) @@ -198,7 +200,7 @@ const AddKeyVectorSet = ({ return ( - + setPopulateMode(value)} @@ -219,11 +221,11 @@ const AddKeyVectorSet = ({ - {option.label} + {t(option.label)} {option.description && ( - {option.description} + {t(option.description)} )} @@ -246,7 +248,7 @@ const AddKeyVectorSet = ({ onCancel(true)} onAction={onClickAction} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading || isSubmittingSampleDataset} disabled={!isFormValid || isSubmittingSampleDataset} actionTestId="add-key-vector-set-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.types.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.types.ts index fc41c2bf0e..a53d41ae19 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.types.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/AddKeyVectorSet.types.ts @@ -1,3 +1,4 @@ +import { ParseKeys } from 'i18next' import { Maybe } from 'uiSrc/utils' import { PopulateMode } from './constants' @@ -22,8 +23,8 @@ export interface Props { export interface PopulateOption { value: PopulateMode - label: string - description?: string + label: ParseKeys + description?: ParseKeys disabled?: boolean id: string } diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.spec.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.spec.tsx index 25695f1003..d35c01b42c 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.spec.tsx @@ -1,8 +1,9 @@ import React from 'react' import { render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import LoadSampleDataset from './LoadSampleDataset' -import { VEC2WORD_INFO, VEC2WORD_PREVIEW } from './data' +import { getVec2WordInfo, VEC2WORD_PREVIEW } from './data' describe('LoadSampleDataset', () => { it('renders all hardcoded preview rows and info pairs', () => { @@ -14,9 +15,8 @@ describe('LoadSampleDataset', () => { expect(row).toHaveTextContent(vector) }) - VEC2WORD_INFO.forEach(({ label, value }) => { - const testId = `load-sample-dataset-info-${label.toLowerCase().replace(/\s+/g, '-')}` - const row = screen.getByTestId(testId) + getVec2WordInfo(i18n.t).forEach(({ testId, label, value }) => { + const row = screen.getByTestId(`load-sample-dataset-info-${testId}`) expect(row).toHaveTextContent(label) expect(row).toHaveTextContent(value) }) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.tsx index 703aba1aaf..6b5413ddb8 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.tsx @@ -2,59 +2,72 @@ import React from 'react' import { Col, Row } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' -import { VEC2WORD_INFO, VEC2WORD_PREVIEW } from './data' +import { getVec2WordInfo, VEC2WORD_PREVIEW } from './data' import * as S from './LoadSampleDataset.styles' -const LoadSampleDataset = () => ( - - - {VEC2WORD_PREVIEW.map((row) => ( - - - {row.word} - - - {row.vector} - - - ))} - +const LoadSampleDataset = () => { + const { t } = useTranslation() - - {VEC2WORD_INFO.map((row) => ( - - - {row.label}: - - - {row.value} - - - ))} - - -) + + {VEC2WORD_PREVIEW.map((row) => ( + + + {row.word} + + + {row.vector} + + + ))} + + + + {getVec2WordInfo(t).map((row) => ( + + + {row.label}: + + + {row.value} + + + ))} + + + ) +} export default LoadSampleDataset diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.types.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.types.ts index f622817b44..8cdf4b96d4 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.types.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/LoadSampleDataset.types.ts @@ -4,6 +4,7 @@ export interface Vec2WordPreviewRow { } export interface Vec2WordInfoRow { + testId: string label: string value: string } diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/data.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/data.ts index 958ffc0849..c0b46dff04 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/data.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/data.ts @@ -1,3 +1,4 @@ +import { TFunction } from 'i18next' import { Vec2WordInfoRow, Vec2WordPreviewRow } from './LoadSampleDataset.types' export const VEC2WORD_COLLECTION_NAME = 'vec2word' @@ -8,9 +9,25 @@ export const VEC2WORD_PREVIEW: Vec2WordPreviewRow[] = [ { word: 'apple', vector: '[-0.011, 0.054, 0.092, …]' }, ] -export const VEC2WORD_INFO: Vec2WordInfoRow[] = [ - { label: 'Dataset', value: VEC2WORD_COLLECTION_NAME }, - { label: 'Size', value: '100' }, - { label: 'Vector size', value: '300' }, - { label: 'Embedding', value: 'GloVe' }, +export const getVec2WordInfo = (t: TFunction): Vec2WordInfoRow[] => [ + { + testId: 'dataset', + label: t('browser.addKey.vectorSet.sample.dataset'), + value: VEC2WORD_COLLECTION_NAME, + }, + { + testId: 'size', + label: t('browser.addKey.vectorSet.sample.size'), + value: '100', + }, + { + testId: 'vector-size', + label: t('browser.addKey.vectorSet.sample.vectorSize'), + value: '300', + }, + { + testId: 'embedding', + label: t('browser.addKey.vectorSet.sample.embedding'), + value: 'GloVe', + }, ] diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/notifications.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/notifications.ts index 9056291e4c..644e75218e 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/notifications.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/LoadSampleDataset/notifications.ts @@ -1,18 +1,21 @@ import { ToastVariant } from 'uiSrc/components/base/display/toast/RiToast' +import i18n from 'uiSrc/i18n' import { VEC2WORD_COLLECTION_NAME } from './data' /** Toast shown when the bulk-import POST for `vec2word` fails. */ export const loadSampleDatasetFailedNotification = () => ({ - title: 'Failed to create vector set', - message: 'Please try again.', + title: i18n.t('notification.error.createVectorSet.title'), + message: i18n.t('notification.error.createVectorSet.message'), variant: 'danger' as ToastVariant, }) /** Green success toast shown after the bulk-import POST for `vec2word` succeeds. */ export const sampleDatasetLoadedNotification = () => ({ - title: 'Sample vector set added', - message: `The '${VEC2WORD_COLLECTION_NAME}' sample vector set has been successfully added.`, + title: i18n.t('notification.success.sampleVectorSetAdded.title'), + message: i18n.t('notification.success.sampleVectorSetAdded.message', { + keyName: VEC2WORD_COLLECTION_NAME, + }), showCloseButton: false, }) @@ -23,8 +26,10 @@ export const sampleDatasetLoadedNotification = () => ({ * stays generic. */ export const keyAlreadyExistsNotification = () => ({ - title: 'Key already exists', - message: `A key named '${VEC2WORD_COLLECTION_NAME}' already exists in this database.`, + title: i18n.t('notification.warning.keyExists.title'), + message: i18n.t('notification.warning.keyExists.message', { + keyName: VEC2WORD_COLLECTION_NAME, + }), variant: 'notice' as ToastVariant, showCloseButton: false, }) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/constants.ts b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/constants.ts index cdac053020..349f36c789 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/constants.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyVectorSet/constants.ts @@ -1,3 +1,4 @@ +import { ParseKeys } from 'i18next' import { PopulateOption } from './AddKeyVectorSet.types' export enum PopulateMode { @@ -5,19 +6,21 @@ export enum PopulateMode { Manual = 'manual', } +// label/description hold i18n keys, resolved with t() at render time. export const POPULATE_OPTIONS: PopulateOption[] = [ { value: PopulateMode.Sample, - label: 'Load sample dataset', - description: 'Explore vector sets with pre-loaded word embeddings', + label: 'browser.addKey.vectorSet.populate.sample.label', + description: 'browser.addKey.vectorSet.populate.sample.description', id: 'populate-sample', }, { value: PopulateMode.Manual, - label: 'Create manually', - description: 'Define your own key, elements, and vectors from scratch.', + label: 'browser.addKey.vectorSet.populate.manual.label', + description: 'browser.addKey.vectorSet.populate.manual.description', id: 'populate-manual', }, ] -export const POPULATE_LABEL = 'How would you like to populate this vector set?' +export const POPULATE_LABEL: ParseKeys = + 'browser.addKey.vectorSet.populateLabel' diff --git a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx index d692bbb1db..7e70d96752 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx @@ -16,7 +16,8 @@ import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { FormField } from 'uiSrc/components/base/forms/FormField' import { TextInput } from 'uiSrc/components/base/inputs' import { CreateZSetWithExpireDto } from 'apiClient' -import { AddZsetFormConfig as config } from '../constants/fields-config' +import { useTranslation } from 'uiSrc/i18n' +import { getAddZsetFormConfig } from '../constants/fields-config' export interface Props { keyName: string @@ -26,6 +27,8 @@ export interface Props { const AddKeyZset = (props: Props) => { const { keyName = '', keyTTL, onCancel } = props + const { t } = useTranslation() + const config = getAddZsetFormConfig(t) const { loading } = useAppSelector(addKeyStateSelector) const [members, setMembers] = useState([ { ...INITIAL_ZSET_MEMBER_STATE }, @@ -229,7 +232,7 @@ const AddKeyZset = (props: Props) => { onCancel(true)} onAction={submitData} - actionText="Add Key" + actionText={t('browser.addKey.button.submit')} loading={loading} disabled={!isFormValid} actionTestId="add-key-zset-btn" diff --git a/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.spec.tsx b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.spec.tsx new file mode 100644 index 0000000000..4013a4cfca --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.spec.tsx @@ -0,0 +1,51 @@ +import React from 'react' +import { render, screen } from 'uiSrc/utils/test-utils' +import { KeyTypes } from 'uiSrc/constants' +import { KeyTypeOption, KeyTypeOptionProps } from './KeyTypeOption' + +const defaultProps: KeyTypeOptionProps = { + option: { + text: 'common.keyType.vectorSet', + value: KeyTypes.VectorSet, + color: 'blue', + minVersion: '8.0', + }, +} + +const renderComponent = (propsOverride?: Partial) => + render() + +describe('KeyTypeOption', () => { + it('should render only the label when enabled', () => { + renderComponent({ disabled: false }) + + expect(screen.getByTestId(KeyTypes.VectorSet)).toBeInTheDocument() + expect( + screen.queryByTestId(`${KeyTypes.VectorSet}-disabled`), + ).not.toBeInTheDocument() + }) + + it('should render a disabled row with the label when disabled', () => { + renderComponent({ disabled: true }) + + expect(screen.getByText('Vector Set')).toBeInTheDocument() + expect( + screen.getByTestId(`${KeyTypes.VectorSet}-disabled`), + ).toBeInTheDocument() + }) + + it('should not render the disabled row when the type has no minVersion', () => { + renderComponent({ + option: { + text: 'common.keyType.hash', + value: KeyTypes.Hash, + color: 'blue', + }, + disabled: true, + }) + + expect( + screen.queryByTestId(`${KeyTypes.Hash}-disabled`), + ).not.toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.styles.ts b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.styles.ts new file mode 100644 index 0000000000..c5ec00b0d4 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.styles.ts @@ -0,0 +1,11 @@ +import styled from 'styled-components' +import { Row } from 'uiSrc/components/base/layout/flex' +import { HealthText } from 'uiSrc/components/base/text' + +export const OptionRow = styled(Row)` + width: 100%; +` + +export const Label = styled(HealthText)` + line-height: inherit; +` diff --git a/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.tsx b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.tsx new file mode 100644 index 0000000000..c9e6a03e40 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/add-key/KeyTypeOption/KeyTypeOption.tsx @@ -0,0 +1,47 @@ +import React from 'react' + +import { useTranslation } from 'uiSrc/i18n' +import { RiTooltip } from 'uiSrc/components' +import { LockedIcon, RiHighlightedIcon } from 'uiSrc/components/base/icons' + +import { AddKeyTypeOption } from '../AddKey.types' +import * as S from './KeyTypeOption.styles' + +export interface KeyTypeOptionProps { + option: AddKeyTypeOption + disabled?: boolean +} + +export const KeyTypeOption = ({ option, disabled }: KeyTypeOptionProps) => { + const { t } = useTranslation() + const { text, value, color, minVersion } = option + + const label = ( + + {t(text)} + + ) + + if (!disabled || !minVersion) { + return label + } + + return ( + + {label} + + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/add-key/constants/fields-config.ts b/redisinsight/ui/src/pages/browser/components/add-key/constants/fields-config.ts index b07b730258..282e4b730b 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/constants/fields-config.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/constants/fields-config.ts @@ -1,3 +1,5 @@ +import { TFunction } from 'i18next' + interface IFormField { id?: string name: string @@ -11,119 +13,121 @@ export interface IAddCommonFieldsFormConfig { keyTTL: IFormField } -export const AddCommonFieldsFormConfig: IAddCommonFieldsFormConfig = { +export const getAddCommonFieldsFormConfig = ( + t: TFunction, +): IAddCommonFieldsFormConfig => ({ keyName: { name: 'keyName', isRequire: true, - label: 'Key Name', - placeholder: 'Enter Key Name', + label: t('browser.addKey.form.keyName.label'), + placeholder: t('browser.addKey.form.keyName.placeholder'), }, keyTTL: { name: 'keyTTL', isRequire: false, - label: 'TTL', - placeholder: 'No limit', + label: t('browser.addKey.form.keyTTL.label'), + placeholder: t('browser.addKey.form.keyTTL.placeholder'), }, -} +}) interface IAddHashFormConfig { fieldName: IFormField fieldValue: IFormField } -export const AddHashFormConfig: IAddHashFormConfig = { +export const getAddHashFormConfig = (t: TFunction): IAddHashFormConfig => ({ fieldName: { name: 'fieldName', isRequire: false, - label: 'Field', - placeholder: 'Enter Field', + label: t('browser.addKey.form.field.label'), + placeholder: t('browser.addKey.form.field.placeholder'), }, fieldValue: { name: 'fieldValue', isRequire: false, - label: 'Value', - placeholder: 'Enter Value', + label: t('browser.addKey.form.value.label'), + placeholder: t('browser.addKey.form.value.placeholder'), }, -} +}) interface IAddZsetFormConfig { score: IFormField member: IFormField } -export const AddZsetFormConfig: IAddZsetFormConfig = { +export const getAddZsetFormConfig = (t: TFunction): IAddZsetFormConfig => ({ score: { name: 'score', isRequire: true, - label: 'Score', - placeholder: 'Enter Score', + label: t('browser.addKey.form.score.label'), + placeholder: t('browser.addKey.form.score.placeholder'), }, member: { name: 'member', isRequire: false, - label: 'Member', - placeholder: 'Enter Member', + label: t('browser.addKey.form.member.label'), + placeholder: t('browser.addKey.form.member.placeholder'), }, -} +}) interface IAddSetFormConfig { member: IFormField } -export const AddSetFormConfig: IAddSetFormConfig = { +export const getAddSetFormConfig = (t: TFunction): IAddSetFormConfig => ({ member: { name: 'member', isRequire: false, - label: 'Member', - placeholder: 'Enter Member', + label: t('browser.addKey.form.member.label'), + placeholder: t('browser.addKey.form.member.placeholder'), }, -} +}) interface IAddStringFormConfig { value: IFormField } -export const AddStringFormConfig: IAddStringFormConfig = { +export const getAddStringFormConfig = (t: TFunction): IAddStringFormConfig => ({ value: { name: 'value', isRequire: false, - label: 'Value', - placeholder: 'Enter Value', + label: t('browser.addKey.form.value.label'), + placeholder: t('browser.addKey.form.value.placeholder'), }, -} +}) interface IAddListFormConfig { element: IFormField count: IFormField } -export const AddListFormConfig: IAddListFormConfig = { +export const getAddListFormConfig = (t: TFunction): IAddListFormConfig => ({ element: { name: 'element', isRequire: false, - label: 'Element', - placeholder: 'Enter Element', + label: t('browser.addKey.form.element.label'), + placeholder: t('browser.addKey.form.element.placeholder'), }, count: { name: 'count', isRequire: true, - label: 'Count', - placeholder: 'Enter Count', + label: t('browser.addKey.form.count.label'), + placeholder: t('browser.addKey.form.count.placeholder'), }, -} +}) interface IAddJSONFormConfig { value: IFormField } -export const AddJSONFormConfig: IAddJSONFormConfig = { +export const getAddJSONFormConfig = (t: TFunction): IAddJSONFormConfig => ({ value: { name: 'value', isRequire: true, - label: 'Value', - placeholder: 'Enter JSON', + label: t('browser.addKey.form.value.label'), + placeholder: t('browser.addKey.form.json.placeholder'), }, -} +}) interface IAddArrayFormConfig { startIndex: IFormField @@ -131,26 +135,26 @@ interface IAddArrayFormConfig { value: IFormField } -export const AddArrayFormConfig: IAddArrayFormConfig = { +export const getAddArrayFormConfig = (t: TFunction): IAddArrayFormConfig => ({ startIndex: { name: 'startIndex', isRequire: true, - label: 'Start Index', - placeholder: 'Enter Start Index', + label: t('browser.addKey.form.startIndex.label'), + placeholder: t('browser.addKey.form.startIndex.placeholder'), }, index: { name: 'index', isRequire: true, - label: 'Index', - placeholder: 'Enter Index', + label: t('browser.addKey.form.index.label'), + placeholder: t('browser.addKey.form.index.placeholder'), }, value: { name: 'value', isRequire: true, - label: 'Value', - placeholder: 'Enter Value', + label: t('browser.addKey.form.value.label'), + placeholder: t('browser.addKey.form.value.placeholder'), }, -} +}) interface IAddStreamFormConfig { entryId: IFormField @@ -158,6 +162,64 @@ interface IAddStreamFormConfig { value: IFormField } +// ponytail: legacy English configs kept for the key-details add/remove forms +// (list/set/zset/stream/string) and KeyDetailsHeaderName that still consume the +// static objects. Delete these once those areas migrate to the get*FormConfig(t) +// factories above (RI-8274 sub-areas C/D). +export const AddCommonFieldsFormConfig: IAddCommonFieldsFormConfig = { + keyName: { + name: 'keyName', + isRequire: true, + label: 'Key Name', + placeholder: 'Enter Key Name', + }, + keyTTL: { + name: 'keyTTL', + isRequire: false, + label: 'TTL', + placeholder: 'No limit', + }, +} + +export const AddZsetFormConfig: IAddZsetFormConfig = { + score: { + name: 'score', + isRequire: true, + label: 'Score', + placeholder: 'Enter Score', + }, + member: { + name: 'member', + isRequire: false, + label: 'Member', + placeholder: 'Enter Member', + }, +} + +export const AddStringFormConfig: IAddStringFormConfig = { + value: { + name: 'value', + isRequire: false, + label: 'Value', + placeholder: 'Enter Value', + }, +} + +export const AddListFormConfig: IAddListFormConfig = { + element: { + name: 'element', + isRequire: false, + label: 'Element', + placeholder: 'Enter Element', + }, + count: { + name: 'count', + isRequire: true, + label: 'Count', + placeholder: 'Enter Count', + }, +} + export const AddStreamFormConfig: IAddStreamFormConfig = { entryId: { id: 'entryId', diff --git a/redisinsight/ui/src/pages/browser/components/add-key/constants/key-type-options.ts b/redisinsight/ui/src/pages/browser/components/add-key/constants/key-type-options.ts index 0319d4669e..cf09d3a5ac 100644 --- a/redisinsight/ui/src/pages/browser/components/add-key/constants/key-type-options.ts +++ b/redisinsight/ui/src/pages/browser/components/add-key/constants/key-type-options.ts @@ -1,59 +1,55 @@ import { GROUP_TYPES_COLORS, KeyTypes } from 'uiSrc/constants' import { CommandsVersions } from 'uiSrc/constants/commandsVersions' -import { - isDevArrayEnabledSelector, - isVectorSetEnabledSelector, -} from 'uiSrc/slices/app/features' +import { isArrayEnabledSelector } from 'uiSrc/slices/app/features' import { AddKeyTypeOption } from '../AddKey.types' export const ADD_KEY_TYPE_OPTIONS: AddKeyTypeOption[] = [ { - text: 'Hash', + text: 'common.keyType.hash', value: KeyTypes.Hash, color: GROUP_TYPES_COLORS[KeyTypes.Hash], }, { - text: 'List', + text: 'common.keyType.list', value: KeyTypes.List, color: GROUP_TYPES_COLORS[KeyTypes.List], }, { - text: 'Array', + text: 'common.keyType.array', value: KeyTypes.Array, color: GROUP_TYPES_COLORS[KeyTypes.Array], minVersion: CommandsVersions.ARRAY.since, - isEnabledSelector: isDevArrayEnabledSelector, + isEnabledSelector: isArrayEnabledSelector, }, { - text: 'Set', + text: 'common.keyType.set', value: KeyTypes.Set, color: GROUP_TYPES_COLORS[KeyTypes.Set], }, { - text: 'Sorted Set', + text: 'common.keyType.sortedSet', value: KeyTypes.ZSet, color: GROUP_TYPES_COLORS[KeyTypes.ZSet], }, { - text: 'String', + text: 'common.keyType.string', value: KeyTypes.String, color: GROUP_TYPES_COLORS[KeyTypes.String], }, { - text: 'JSON', + text: 'common.keyType.json', value: KeyTypes.ReJSON, color: GROUP_TYPES_COLORS[KeyTypes.ReJSON], }, { - text: 'Stream', + text: 'common.keyType.stream', value: KeyTypes.Stream, color: GROUP_TYPES_COLORS[KeyTypes.Stream], }, { - text: 'Vector Set', + text: 'common.keyType.vectorSet', value: KeyTypes.VectorSet, color: GROUP_TYPES_COLORS[KeyTypes.VectorSet], minVersion: CommandsVersions.VECTOR_SET.since, - isEnabledSelector: isVectorSetEnabledSelector, }, ] diff --git a/redisinsight/ui/src/pages/browser/components/add-multiple-fields/AddMultipleFields.tsx b/redisinsight/ui/src/pages/browser/components/add-multiple-fields/AddMultipleFields.tsx index e29961d81c..699ba5b7ea 100644 --- a/redisinsight/ui/src/pages/browser/components/add-multiple-fields/AddMultipleFields.tsx +++ b/redisinsight/ui/src/pages/browser/components/add-multiple-fields/AddMultipleFields.tsx @@ -10,6 +10,7 @@ import { import { HorizontalSpacer } from 'uiSrc/components/base/layout' import { RiTooltip } from 'uiSrc/components' import { FormField } from 'uiSrc/components/base/forms/FormField' +import { useTranslation } from 'uiSrc/i18n' import { ItemsWrapper } from './AddMultipleFields.styles' export interface ColumnLabel { @@ -36,17 +37,21 @@ const AddMultipleFields = (props: Props) => { onClickAdd, columnLabels, } = props + const { t } = useTranslation() const renderItem = (child: React.ReactNode, item: T, index?: number) => ( {child} - + onClickRemove(item, index)} data-testid="remove-item" /> @@ -89,11 +94,15 @@ const AddMultipleFields = (props: Props) => { )} - + diff --git a/redisinsight/ui/src/pages/browser/components/browser-search-panel/BrowserSearchPanel.tsx b/redisinsight/ui/src/pages/browser/components/browser-search-panel/BrowserSearchPanel.tsx index fa51dedead..0e479192c9 100644 --- a/redisinsight/ui/src/pages/browser/components/browser-search-panel/BrowserSearchPanel.tsx +++ b/redisinsight/ui/src/pages/browser/components/browser-search-panel/BrowserSearchPanel.tsx @@ -34,6 +34,7 @@ import { Modal } from 'uiSrc/components/base/display' import { Row } from 'uiSrc/components/base/layout/flex' import { ButtonGroup } from 'uiSrc/components/base/forms/button-group/ButtonGroup' import { REDISEARCH_VERSION_REQUIRED_CONTENT } from 'uiSrc/components/messages' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' @@ -65,6 +66,7 @@ const SwitchSearchModeButtonGroup = styled(ButtonGroup)` ` const BrowserSearchPanel = (props: Props) => { + const { t } = useTranslation() const { handleCreateIndexPanel } = props const { viewType, searchMode } = useAppSelector(keysSelector) const { id: instanceId, modules } = useAppSelector(connectedInstanceSelector) @@ -87,8 +89,8 @@ const BrowserSearchPanel = (props: Props) => { const searchModes: ISwitchType[] = [ { type: SearchMode.Pattern, - tooltipText: 'Filter by Key Name or Pattern', - ariaLabel: 'Filter by Key Name or Pattern button', + tooltipText: t('browser.search.mode.pattern.tooltip'), + ariaLabel: t('browser.search.mode.pattern.aria'), dataTestId: 'search-mode-pattern-btn', isActiveView() { return searchMode === this.type @@ -102,8 +104,8 @@ const BrowserSearchPanel = (props: Props) => { }, { type: SearchMode.Redisearch, - tooltipText: 'Search by Values of Keys', - ariaLabel: 'Search by Values of Keys button', + tooltipText: t('browser.search.mode.redisearch.tooltip'), + ariaLabel: t('browser.search.mode.redisearch.aria'), dataTestId: 'search-mode-redisearch-btn', disabled: !hasRedisearch || !hasMinimumRedisearchVersion, isActiveView() { diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionSummary/BulkActionSummary.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionSummary/BulkActionSummary.tsx index 0e031624b9..ac381ecf5c 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionSummary/BulkActionSummary.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionSummary/BulkActionSummary.tsx @@ -5,6 +5,7 @@ import { millisecondsFormat } from 'uiSrc/utils' import { BulkActionsType } from 'uiSrc/constants' import { Text } from 'uiSrc/components/base/text' import { Col, FlexItem } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import { SummaryContainer, SummaryValue } from './BulkActionSummary.styles' export interface Props { @@ -23,46 +24,51 @@ const BulkActionSummary = ({ failed = 0, duration = 0, 'data-testid': testId, -}: Props) => ( - - - Results - - - - - {numberWithSpaces(processed)} - - - {type === BulkActionsType.Delete ? 'Keys' : 'Commands'} Processed - - - - - {numberWithSpaces(succeed)} - - - Success - - - - - {numberWithSpaces(failed)} - - - Errors - - - - - {millisecondsFormat(duration, 'H:mm:ss.SSS')} - - - Time Taken - - - - -) +}: Props) => { + const { t } = useTranslation() + return ( + + + {t('browser.bulkActions.summary.results')} + + + + + {numberWithSpaces(processed)} + + + {type === BulkActionsType.Delete + ? t('browser.bulkActions.summary.keysProcessed') + : t('browser.bulkActions.summary.commandsProcessed')} + + + + + {numberWithSpaces(succeed)} + + + {t('browser.bulkActions.summary.success')} + + + + + {numberWithSpaces(failed)} + + + {t('browser.bulkActions.summary.errors')} + + + + + {millisecondsFormat(duration, 'H:mm:ss.SSS')} + + + {t('browser.bulkActions.summary.timeTaken')} + + + + + ) +} export default BulkActionSummary diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActions.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActions.tsx index 8d4dca1589..fa2a175ee2 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActions.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActions.tsx @@ -24,6 +24,7 @@ import { Title } from 'uiSrc/components/base/text/Title' import BulkUpload from './BulkUpload' import BulkDelete from './BulkDelete' import BulkActionsTabs from './BulkActionsTabs' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' import { BulkActionsContainer, @@ -48,6 +49,7 @@ const BulkActions = (props: Props) => { onBulkActionsPanel, onToggleFullScreen, } = props + const { t } = useTranslation() const { instanceId = '' } = useParams<{ instanceId: string }>() const { filter, search } = useAppSelector(keysSelector) @@ -107,7 +109,7 @@ const BulkActions = (props: Props) => { - Bulk Actions + {t('browser.bulkActions.title')} {!arePanelsCollapsed && ( { )} {(!arePanelsCollapsed || isFullScreen) && ( diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsInfo/BulkActionsInfo.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsInfo/BulkActionsInfo.tsx index 364d2454ac..b63d3a87ad 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsInfo/BulkActionsInfo.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsInfo/BulkActionsInfo.tsx @@ -6,6 +6,7 @@ import { BulkActionsStatus, KeyTypes, RedisDataType } from 'uiSrc/constants' import GroupBadge from 'uiSrc/components/group-badge/GroupBadge' import { Col, Row } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import BulkActionsStatusDisplay from '../BulkActionsStatusDisplay' import { @@ -32,6 +33,7 @@ export interface Props { } const BulkActionsInfo = (props: Props) => { + const { t } = useTranslation() const { children, loading, @@ -39,7 +41,7 @@ const BulkActionsInfo = (props: Props) => { search, status, progress, - title = 'Delete Keys with', + title = t('browser.bulkActions.info.title'), subTitle, error, } = props @@ -67,7 +69,7 @@ const BulkActionsInfo = (props: Props) => { {filter && ( - Key type: + {t('browser.bulkActions.info.keyType')} @@ -75,7 +77,7 @@ const BulkActionsInfo = (props: Props) => { {search && ( - Pattern: + {t('browser.bulkActions.info.pattern')} {' '} diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsStatusDisplay/BulkActionsStatusDisplay.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsStatusDisplay/BulkActionsStatusDisplay.tsx index 138f9b133c..c90e9cbf69 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsStatusDisplay/BulkActionsStatusDisplay.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsStatusDisplay/BulkActionsStatusDisplay.tsx @@ -4,6 +4,7 @@ import { isUndefined } from 'lodash' import { BulkActionsStatus } from 'uiSrc/constants' import { getApproximatePercentage, Maybe } from 'uiSrc/utils' import { ColorText } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { isProcessedBulkAction } from '../utils' import { Props } from '../BulkActionsInfo/BulkActionsInfo' @@ -22,12 +23,13 @@ export const BulkActionsStatusDisplay = ({ scanned, error, }: BulkActionsStatusDisplayProps) => { + const { t } = useTranslation() if (!isUndefined(status) && !isProcessedBulkAction(status)) { return ( - In progress: + {t('browser.bulkActions.status.inProgress')} {` ${getApproximatePercentage(total, scanned)}`} } @@ -40,7 +42,9 @@ export const BulkActionsStatusDisplay = ({ return ( Stopped: {getApproximatePercentage(total, scanned)}} + message={t('browser.bulkActions.status.stopped', { + percentage: getApproximatePercentage(total, scanned), + })} data-testid="bulk-status-stopped" /> ) @@ -51,7 +55,7 @@ export const BulkActionsStatusDisplay = ({ ) @@ -61,7 +65,7 @@ export const BulkActionsStatusDisplay = ({ return ( ) @@ -71,7 +75,9 @@ export const BulkActionsStatusDisplay = ({ return ( ) diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsTabs/BulkActionsTabs.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsTabs/BulkActionsTabs.tsx index e0f5f8169a..3f2772d95a 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsTabs/BulkActionsTabs.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsTabs/BulkActionsTabs.tsx @@ -14,6 +14,7 @@ import { DEFAULT_SEARCH_MATCH } from 'uiSrc/constants/api' import { keysSelector } from 'uiSrc/slices/browser/keys' import { TabInfo } from 'uiSrc/components/base/layout/tabs' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { StyledTabs } from './BulkActionsTabs.styles' @@ -23,6 +24,7 @@ export interface Props { const BulkActionsTabs = (props: Props) => { const { onChangeType } = props + const { t } = useTranslation() const { id: instanceId } = useAppSelector(connectedInstanceSelector) const { filter, search } = useAppSelector(keysSelector) const { type } = useAppSelector(selectedBulkActionsSelector) @@ -54,16 +56,16 @@ const BulkActionsTabs = (props: Props) => { () => [ { value: BulkActionsType.Delete, - label: Delete Keys, + label: {t('browser.bulkActions.tab.deleteKeys')}, content: null, }, { value: BulkActionsType.Upload, - label: Upload Data, + label: {t('browser.bulkActions.tab.uploadData')}, content: null, }, ], - [], + [t], ) return ( diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDelete.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDelete.tsx index 9e69c54eea..e1f1ce5538 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDelete.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDelete.tsx @@ -9,6 +9,7 @@ import { } from 'uiSrc/slices/browser/bulkActions' import { Col } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import BulkDeleteFooter from './BulkDeleteFooter' import BulkDeleteSummary from './BulkDeleteSummary' import BulkActionsInfo from '../BulkActionsInfo' @@ -19,6 +20,7 @@ export interface Props { const BulkDelete = (props: Props) => { const { onCancel } = props + const { t } = useTranslation() const { filter, search, loading } = useAppSelector(bulkActionsDeleteSelector) const { status, @@ -66,10 +68,10 @@ const BulkDelete = (props: Props) => { data-testid="bulk-actions-placeholder" > - No pattern or key type set + {t('browser.bulkActions.placeholder.title')} - To perform a bulk action, set the pattern or select the key type + {t('browser.bulkActions.placeholder.description')} )} diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx index 43e70088d6..a0c586a32d 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx @@ -6,12 +6,14 @@ import { useAppSelector } from 'uiSrc/slices/hooks' import { MAX_BULK_ACTION_ERRORS_LENGTH } from 'uiSrc/constants' import { Text } from 'uiSrc/components/base/text' import { bulkActionsDeleteSummarySelector } from 'uiSrc/slices/browser/bulkActions' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' const MIN_ROW_HEIGHT = 30 const PROTRUDING_OFFSET = 2 const BulkDeleteContent = () => { + const { t } = useTranslation() const { errors = [] } = useAppSelector(bulkActionsDeleteSummarySelector) ?? {} const outerRef = useRef(null) @@ -56,16 +58,20 @@ const BulkDeleteContent = () => { return (
- Error list + + {t('browser.bulkActions.delete.errorList')} + {errors.length >= MAX_BULK_ACTION_ERRORS_LENGTH && ( - last {MAX_BULK_ACTION_ERRORS_LENGTH} errors are shown + {t('browser.bulkActions.delete.lastErrors', { + count: MAX_BULK_ACTION_ERRORS_LENGTH, + })} )}
- {({ width, height }) => ( + {({ width, height }: { width: number; height: number }) => ( { const { onCancel } = props + const { t } = useTranslation() const { instanceId = '' } = useParams<{ instanceId: string }>() const { scanned, total } = useAppSelector(keysDataSelector) const { loading, generateReport, filter, search } = useAppSelector( @@ -136,12 +138,12 @@ const BulkDeleteFooter = (props: Props) => { onChange={(e: React.ChangeEvent) => dispatch(setBulkDeleteGenerateReport(e.target.checked)) } - label="Download report" + label={t('browser.bulkActions.delete.downloadReport')} data-testid="download-report-checkbox" /> { onClick={handleCancel} data-testid="bulk-action-cancel-btn" > - {isProcessedBulkAction(status) ? 'Close' : 'Cancel'} + {isProcessedBulkAction(status) + ? t('browser.bulkActions.button.close') + : t('browser.bulkActions.button.cancel')} )} {loading && ( @@ -165,7 +169,7 @@ const BulkDeleteFooter = (props: Props) => { onClick={handleStop} data-testid="bulk-action-stop-btn" > - Stop + {t('browser.bulkActions.button.stop')} )} @@ -184,19 +188,16 @@ const BulkDeleteFooter = (props: Props) => { onClick={handleDeleteWarning} data-testid="bulk-action-warning-btn" > - Delete + {t('browser.bulkActions.button.delete')} } - title={'Are you sure you want to perform this action?'} - message={ - 'This will delete all keys matching the selected type and pattern.' - } + title={t('browser.bulkActions.confirmTitle')} + message={t('browser.bulkActions.delete.confirmMessage')} appendInfo={ - Bulk deletion may impact performance and cause memory spikes. - Avoid running in production. + {t('browser.bulkActions.delete.confirmWarning')} } @@ -206,7 +207,7 @@ const BulkDeleteFooter = (props: Props) => { onClick={handleDelete} data-testid="bulk-action-apply-btn" > - Delete + {t('browser.bulkActions.button.delete')} } /> @@ -219,20 +220,17 @@ const BulkDeleteFooter = (props: Props) => { onClick={handleOpenTypeToConfirm} data-testid="bulk-action-warning-btn" > - Delete + {t('browser.bulkActions.button.delete')} {isTypeToConfirmOpen && ( - This will delete all keys matching the selected type and - pattern. Bulk deletion may impact performance and cause - memory spikes. - - } + confirmButtonText={t('browser.bulkActions.button.delete')} + cancelButtonText={t('browser.bulkActions.button.cancel')} + actionDescription={t( + 'browser.bulkActions.delete.typeToConfirmDescription', + )} onConfirm={handleTypeToConfirm} onCancel={() => setIsTypeToConfirmOpen(false)} /> @@ -245,7 +243,7 @@ const BulkDeleteFooter = (props: Props) => { onClick={handleStartNew} data-testid="bulk-action-start-again-btn" > - Start New + {t('browser.bulkActions.button.startNew')} )} diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.spec.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.spec.tsx index 14b865bf10..756e99ccdc 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.spec.tsx @@ -75,7 +75,7 @@ describe('BulkDeleteSummary', () => { render() const summaryEl = screen.queryByTestId('bulk-delete-summary') - const expectedText = 'Scanned 10% (10/100) and found 1 keys' + const expectedText = 'Scanned 10% (10/100) and found 1 key' expect(summaryEl).toHaveTextContent(expectedText) }) @@ -151,6 +151,39 @@ describe('BulkDeleteSummary', () => { expect(screen.getByText('Expected amount: ~50 keys')).toBeInTheDocument() }) + it('should use the singular noun when the expected amount is exactly 1', () => { + const state: any = store.getState() + + ;(useAppSelector as jest.Mock).mockImplementation( + (callback: (arg0: RootState) => RootState) => + callback({ + ...state, + browser: { + ...state.browser, + keys: { + ...state.browser.keys, + data: { + ...state.browser.keys.data, + scanned: 100, + total: 100, + keys: [], + }, + }, + bulkActions: { + ...state.browser.bulkActions, + bulkDelete: { + ...state.browser.bulkActions.bulkDelete, + keyCount: 1, + }, + }, + }, + }), + ) + + render() + expect(screen.getByText('Expected amount: 1 key')).toBeInTheDocument() + }) + it('should show N/A when scanned is 0 (avoid division by zero)', () => { const state: any = store.getState() diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.tsx index a6f80a6485..33ce8ebc8e 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.tsx @@ -14,10 +14,12 @@ import BulkActionSummary from 'uiSrc/pages/browser/components/bulk-actions/BulkA import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' const BulkDeleteSummary = () => { + const { t } = useTranslation() const [title, setTitle] = useState('') const { scanned = 0, total = 0, keys } = useAppSelector(keysDataSelector) const { keyCount } = useAppSelector(bulkActionsDeleteSelector) @@ -32,7 +34,7 @@ const BulkDeleteSummary = () => { useEffect(() => { // If no keys have been scanned yet, can't calculate approximation (avoid division by zero) if (scanned === 0) { - setTitle('Expected amount: N/A') + setTitle(t('browser.bulkActions.delete.expectedAmountNa')) return } @@ -40,24 +42,32 @@ const BulkDeleteSummary = () => { if (isFolderDelete) { const approximateCount = scanned < total ? (keyCount * total) / scanned : keyCount + const rounded = Math.round(approximateCount) setTitle( - `Expected amount: ${scanned < total ? '~' : ''}${nullableNumberWithSpaces(Math.round(approximateCount))} keys`, + t('browser.bulkActions.delete.expectedAmount', { + count: rounded, + amount: `${scanned < total ? '~' : ''}${nullableNumberWithSpaces(rounded)}`, + }), ) return } // Otherwise, calculate from scanned keys (normal bulk delete) if (scanned < total && !keys.length) { - setTitle('Expected amount: N/A') + setTitle(t('browser.bulkActions.delete.expectedAmountNa')) return } const approximateCount = scanned < total ? (keys.length * total) / scanned : keys.length + const rounded = Math.round(approximateCount) setTitle( - `Expected amount: ${scanned < total ? '~' : ''}${nullableNumberWithSpaces(Math.round(approximateCount))} keys`, + t('browser.bulkActions.delete.expectedAmount', { + count: rounded, + amount: `${scanned < total ? '~' : ''}${nullableNumberWithSpaces(rounded)}`, + }), ) - }, [scanned, total, keys, keyCount, isFolderDelete]) + }, [scanned, total, keys, keyCount, isFolderDelete, t]) // For folder delete: use folder's key count for "found" // For normal bulk delete: use browser scan progress and found keys count @@ -75,9 +85,7 @@ const BulkDeleteSummary = () => { position="right" content={ - Expected amount is estimated based on the number of keys - scanned and the scan percentage. The final number may be - different. + {t('browser.bulkActions.delete.expectedAmountTooltip')} } > @@ -85,9 +93,13 @@ const BulkDeleteSummary = () => { - {`Scanned ${getApproximatePercentage(total, scanned)} `} - {`(${numberWithSpaces(scanned)}/${nullableNumberWithSpaces(total)}) `} - {`and found ${numberWithSpaces(displayFound)} keys`} + {t('browser.bulkActions.delete.scanned', { + count: displayFound, + percentage: getApproximatePercentage(total, scanned), + scanned: numberWithSpaces(scanned), + total: nullableNumberWithSpaces(total), + found: numberWithSpaces(displayFound), + })} )} diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx index 806227c800..88b606a9db 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx @@ -32,6 +32,7 @@ import { RefreshIcon } from 'uiSrc/components/base/icons' import { ColorText, Text } from 'uiSrc/components/base/text' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import { StyledContent, StyledFooter, @@ -49,6 +50,7 @@ const MAX_FILE_SIZE = MAX_MB_FILE * 1024 * 1024 const BulkUpload = (props: Props) => { const { onCancel } = props + const { t } = useTranslation() const { id: instanceId } = useAppSelector(connectedInstanceSelector) const { loading, fileName } = useAppSelector(bulkActionsUploadSelector) const { status, progress, duration } = @@ -116,7 +118,7 @@ const BulkUpload = (props: Props) => { - Upload the text file with the list of Redis commands + {t('browser.bulkActions.upload.instruction')} { {isInvalid && ( - File should not exceed {MAX_MB_FILE} MB + {t('browser.bulkActions.upload.fileSizeError', { + max: MAX_MB_FILE, + })} )} @@ -159,7 +163,7 @@ const BulkUpload = (props: Props) => { loading={loading} status={status} progress={progress} - title="Commands executed from file" + title={t('browser.bulkActions.upload.executedTitle')} subTitle={
{fileName}
} > { onClick={handleClickCancel} data-testid="bulk-action-cancel-btn" > - {isProcessedBulkAction(status) ? 'Close' : 'Cancel'} + {isProcessedBulkAction(status) + ? t('browser.bulkActions.button.close') + : t('browser.bulkActions.button.cancel')} {!isCompleted ? ( { loading={loading} data-testid="bulk-action-warning-btn" > - Upload + {t('browser.bulkActions.button.upload')} } > @@ -202,11 +208,10 @@ const BulkUpload = (props: Props) => { - Are you sure you want to perform this action? + {t('browser.bulkActions.confirmTitle')} - All commands from the file will be executed against your - database. + {t('browser.bulkActions.upload.confirmMessage')} @@ -215,7 +220,7 @@ const BulkUpload = (props: Props) => { onClick={handleUpload} data-testid="bulk-action-apply-btn" > - Upload + {t('browser.bulkActions.button.upload')} @@ -227,7 +232,7 @@ const BulkUpload = (props: Props) => { onClick={onStartAgain} data-testid="bulk-action-start-new-btn" > - Start New + {t('browser.bulkActions.button.startNew')} )} diff --git a/redisinsight/ui/src/pages/browser/components/create-redisearch-index/constants.ts b/redisinsight/ui/src/pages/browser/components/create-redisearch-index/constants.ts index 74ed056ae9..0c5444527e 100644 --- a/redisinsight/ui/src/pages/browser/components/create-redisearch-index/constants.ts +++ b/redisinsight/ui/src/pages/browser/components/create-redisearch-index/constants.ts @@ -30,26 +30,26 @@ export const FIELD_TYPE_OPTIONS = [ { text: 'TEXT', value: FieldTypes.TEXT, - description: 'Use TEXT for full-text search and indexing free-form text.', + descriptionKey: 'vectorSearch.fieldType.desc.text', }, { text: 'TAG', value: FieldTypes.TAG, - description: 'Use TAG for filtering by exact match values.', + descriptionKey: 'vectorSearch.fieldType.desc.tag', }, { text: 'NUMERIC', value: FieldTypes.NUMERIC, - description: 'Use NUMERIC for storing and querying numbers.', + descriptionKey: 'vectorSearch.fieldType.desc.numeric', }, { text: 'GEO', value: FieldTypes.GEO, - description: 'Use GEO for geographic coordinates (latitude and longitude).', + descriptionKey: 'vectorSearch.fieldType.desc.geo', }, { text: 'VECTOR', value: FieldTypes.VECTOR, - description: 'Use VECTOR for semantic search using vector embeddings.', + descriptionKey: 'vectorSearch.fieldType.desc.vector', }, ] diff --git a/redisinsight/ui/src/pages/browser/components/delete-key-popover/DeleteKeyPopover.tsx b/redisinsight/ui/src/pages/browser/components/delete-key-popover/DeleteKeyPopover.tsx index 5b1e0d8e6b..4abc7b974b 100644 --- a/redisinsight/ui/src/pages/browser/components/delete-key-popover/DeleteKeyPopover.tsx +++ b/redisinsight/ui/src/pages/browser/components/delete-key-popover/DeleteKeyPopover.tsx @@ -12,6 +12,7 @@ import { import { DeleteIcon } from 'uiSrc/components/base/icons' import ConfirmationPopover from 'uiSrc/components/confirmation-popover' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' +import { useTranslation } from 'uiSrc/i18n' export interface DeleteProps { nameString: string @@ -34,6 +35,7 @@ export const DeleteKeyPopover = ({ onDelete, onOpenPopover, }: DeleteProps) => { + const { t } = useTranslation() const { environment } = useDatabaseEnvironment() const bypassConfirmation = environment === Environment.Development @@ -59,13 +61,13 @@ export const DeleteKeyPopover = ({ } onClick={(e) => e.stopPropagation()} title={formatLongName(nameString)} - message="will be deleted." + message={t('browser.deletePopover.message')} confirmButton={ onDelete(name)} data-testid="submit-delete-key" > - Delete + {t('browser.deletePopover.button')} } /> diff --git a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx index cc49e9f2e5..21c15b12c6 100644 --- a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx @@ -195,62 +195,35 @@ describe('FilterKeyType', () => { expect(graphElement).not.toBeInTheDocument() }) - it('should show Vector Set when vector set feature flag is enabled and redis version >= 8.0', async () => { + it('should show Vector Set when redis version >= 8.0', async () => { connectedInstanceOverviewSelectorMock.mockImplementationOnce(() => ({ version: '8.0.0', })) - const initialStoreState = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.vectorSet}`, - { flag: true }, - ) - const { queryByText } = render(, { - store: mockStore(initialStoreState), - }) + const { queryByText } = render() await userEvent.click(screen.getByTestId(filterSelectId)) expect(queryByText('Vector Set')).toBeInTheDocument() }) - it('should hide Vector Set when vector set feature flag is disabled', () => { - // Ensure the version gate is satisfied so the assertion truly - // exercises the feature-flag path and not the version path. - connectedInstanceOverviewSelectorMock.mockImplementationOnce(() => ({ - version: '8.0.0', - })) - const { queryByText } = render() - - fireEvent.click(screen.getByTestId(filterSelectId)) - - expect(queryByText('Vector Set')).not.toBeInTheDocument() - }) - - it('should hide Vector Set when redis version < 8.0 even if feature flag is enabled', async () => { + it('should hide Vector Set when redis version < 8.0', async () => { connectedInstanceOverviewSelectorMock.mockImplementationOnce(() => ({ version: '7.4.0', })) - const initialStoreState = set( - cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.vectorSet}`, - { flag: true }, - ) - const { queryByText } = render(, { - store: mockStore(initialStoreState), - }) + const { queryByText } = render() await userEvent.click(screen.getByTestId(filterSelectId)) expect(queryByText('Vector Set')).not.toBeInTheDocument() }) - it('should show Array when dev-array feature flag is enabled and redis version >= 8.8', async () => { + it('should show Array when array feature flag is enabled and redis version >= 8.8', async () => { connectedInstanceOverviewSelectorMock.mockImplementationOnce(() => ({ version: '8.8.0', })) const initialStoreState = set( cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.devArray}`, + `app.features.featureFlags.features.${FeatureFlags.array}`, { flag: true }, ) const { queryByText } = render(, { @@ -262,7 +235,7 @@ describe('FilterKeyType', () => { expect(queryByText('Array')).toBeInTheDocument() }) - it('should hide Array when dev-array feature flag is disabled', () => { + it('should hide Array when array feature flag is disabled', () => { // Ensure the version gate is satisfied so the assertion truly // exercises the feature-flag path and not the version path. connectedInstanceOverviewSelectorMock.mockImplementationOnce(() => ({ @@ -281,7 +254,7 @@ describe('FilterKeyType', () => { })) const initialStoreState = set( cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.devArray}`, + `app.features.featureFlags.features.${FeatureFlags.array}`, { flag: true }, ) const { queryByText } = render(, { diff --git a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.tsx b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.tsx index 1ed2381f26..8cca80342e 100644 --- a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.tsx +++ b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.tsx @@ -33,6 +33,7 @@ import { RiSelect, } from 'uiSrc/components/base/forms/select/RiSelect' import { Modal } from 'uiSrc/components/base/display' +import { useTranslation } from 'uiSrc/i18n' import { FILTER_KEY_TYPE_OPTIONS } from './constants' import styles from './styles.module.scss' @@ -49,6 +50,7 @@ const FilterKeyTypeSelect = styled(RiSelect)` ` const FilterKeyType = ({ modules }: Props) => { + const { t } = useTranslation() const [isSelectOpen, setIsSelectOpen] = useState(false) const [typeSelected, setTypeSelected] = useState('all') const [isVersionSupported, setIsVersionSupported] = useState(true) @@ -104,6 +106,7 @@ const FilterKeyType = ({ modules }: Props) => { }) .map((item) => { const { value, color, text } = item + const label = t(text) return { value, inputDisplay: ( @@ -111,7 +114,7 @@ const FilterKeyType = ({ modules }: Props) => { color={color} data-test-subj={`filter-option-type-${value}`} > - {text} + {label} ), dropdownDisplay: ( @@ -119,7 +122,7 @@ const FilterKeyType = ({ modules }: Props) => { color={color} data-test-subj={`filter-option-type-${value}`} > - {text} + {label} ), 'data-test-subj': `filter-option-type-${value}`, @@ -130,10 +133,10 @@ const FilterKeyType = ({ modules }: Props) => { value: ALL_KEY_TYPES_VALUE, inputDisplay: (
- All Key Types + {t('browser.filter.allKeyTypes')}
), - dropdownDisplay: All Key Types, + dropdownDisplay: {t('browser.filter.allKeyTypes')}, }) const onChangeType = (initValue: string) => { diff --git a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.types.ts b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.types.ts index d2a25b6d38..599c6af88a 100644 --- a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.types.ts +++ b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.types.ts @@ -1,8 +1,9 @@ +import { ParseKeys } from 'i18next' import { FeatureFlags } from 'uiSrc/constants' import { RootState } from 'uiSrc/slices/store' export type FilterKeyTypeOption = { - text: string + text: ParseKeys value: string color: string minVersion?: string diff --git a/redisinsight/ui/src/pages/browser/components/filter-key-type/constants.ts b/redisinsight/ui/src/pages/browser/components/filter-key-type/constants.ts index f62ea6f380..8bf31fd7d5 100644 --- a/redisinsight/ui/src/pages/browser/components/filter-key-type/constants.ts +++ b/redisinsight/ui/src/pages/browser/components/filter-key-type/constants.ts @@ -5,72 +5,68 @@ import { FeatureFlags, } from 'uiSrc/constants' import { CommandsVersions } from 'uiSrc/constants/commandsVersions' -import { - isDevArrayEnabledSelector, - isVectorSetEnabledSelector, -} from 'uiSrc/slices/app/features' +import { isArrayEnabledSelector } from 'uiSrc/slices/app/features' import { RedisDefaultModules } from 'uiSrc/slices/interfaces' import { FilterKeyTypeOption } from './FilterKeyType.types' export const FILTER_KEY_TYPE_OPTIONS: FilterKeyTypeOption[] = [ { - text: 'Hash', + text: 'common.keyType.hash', value: KeyTypes.Hash, color: GROUP_TYPES_COLORS[KeyTypes.Hash], }, { - text: 'List', + text: 'common.keyType.list', value: KeyTypes.List, color: GROUP_TYPES_COLORS[KeyTypes.List], }, { - text: 'Array', + text: 'common.keyType.array', value: KeyTypes.Array, color: GROUP_TYPES_COLORS[KeyTypes.Array], minVersion: CommandsVersions.ARRAY.since, - isEnabledSelector: isDevArrayEnabledSelector, + isEnabledSelector: isArrayEnabledSelector, }, { - text: 'Set', + text: 'common.keyType.set', value: KeyTypes.Set, color: GROUP_TYPES_COLORS[KeyTypes.Set], }, { - text: 'Sorted Set', + text: 'common.keyType.sortedSet', value: KeyTypes.ZSet, color: GROUP_TYPES_COLORS[KeyTypes.ZSet], }, { - text: 'String', + text: 'common.keyType.string', value: KeyTypes.String, color: GROUP_TYPES_COLORS[KeyTypes.String], }, { - text: 'JSON', + text: 'common.keyType.json', value: KeyTypes.ReJSON, color: GROUP_TYPES_COLORS[KeyTypes.ReJSON], }, { - text: 'Stream', + text: 'common.keyType.stream', value: KeyTypes.Stream, color: GROUP_TYPES_COLORS[KeyTypes.Stream], }, { - text: 'Vector Set', + text: 'common.keyType.vectorSet', value: KeyTypes.VectorSet, color: GROUP_TYPES_COLORS[KeyTypes.VectorSet], minVersion: CommandsVersions.VECTOR_SET.since, - isEnabledSelector: isVectorSetEnabledSelector, }, { - text: 'Graph', + text: 'common.keyType.graph', value: ModulesKeyTypes.Graph, color: GROUP_TYPES_COLORS[ModulesKeyTypes.Graph], skipIfNoModule: RedisDefaultModules.Graph, featureFlag: FeatureFlags.envDependent, }, { - text: 'Time Series', + text: 'common.keyType.timeSeries', value: ModulesKeyTypes.TimeSeries, color: GROUP_TYPES_COLORS[ModulesKeyTypes.TimeSeries], }, diff --git a/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx b/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx index c97a020d6c..2f28ecc5e3 100644 --- a/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-list/KeyList.tsx @@ -10,6 +10,8 @@ import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { useParams } from 'react-router-dom' import { debounce, findIndex, isUndefined, orderBy, reject } from 'lodash' +import { useTranslation } from 'uiSrc/i18n' + import { CellMeasurerCache } from 'react-virtualized' import { bufferToString, @@ -86,6 +88,7 @@ const KeyList = forwardRef((props: Props, ref) => { sortedColumn, } = props + const { t } = useTranslation() const { instanceId = '' } = useParams<{ instanceId: string }>() const { handler: keyFormatConvertor } = useKeyFormat() @@ -431,7 +434,7 @@ const KeyList = forwardRef((props: Props, ref) => { const columns: ITableColumn[] = [ { id: 'type', - label: 'Type', + label: t('browser.keyList.column.type'), absoluteWidth: 'auto', minWidth: 126, render: (cellData: any, { nameString }: any) => ( @@ -440,7 +443,7 @@ const KeyList = forwardRef((props: Props, ref) => { }, { id: 'nameString', - label: 'Key', + label: t('browser.keyList.column.key'), minWidth: 94, truncateText: true, render: ( @@ -473,7 +476,7 @@ const KeyList = forwardRef((props: Props, ref) => { if (visibleColumns.includes(BrowserColumns.TTL)) { columns.push({ id: 'ttl', - label: 'TTL', + label: t('browser.keyList.column.ttl'), absoluteWidth: ttlColumnSize, minWidth: ttlColumnSize, truncateText: true, @@ -510,7 +513,7 @@ const KeyList = forwardRef((props: Props, ref) => { if (visibleColumns.includes(BrowserColumns.Size)) { columns.push({ id: 'size', - label: 'Size', + label: t('browser.keyList.column.size'), absoluteWidth: 90, minWidth: 90, alignment: TableCellAlignment.Right, diff --git a/redisinsight/ui/src/pages/browser/components/key-row-name/KeyRowName.tsx b/redisinsight/ui/src/pages/browser/components/key-row-name/KeyRowName.tsx index 32b9c959e6..d2c4a1b008 100644 --- a/redisinsight/ui/src/pages/browser/components/key-row-name/KeyRowName.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-row-name/KeyRowName.tsx @@ -5,6 +5,7 @@ import { LoadingContent } from 'uiSrc/components/base/layout' import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' import { Maybe, formatLongName, replaceSpaces } from 'uiSrc/utils' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -14,6 +15,7 @@ export interface Props { const KeyRowName = (props: Props) => { const { nameString, shortName } = props + const { t } = useTranslation() if (isUndefined(shortName)) { return ( @@ -42,7 +44,7 @@ const KeyRowName = (props: Props) => { data-testid={`key-${shortName}`} > { const { size, nameString, deletePopoverId, rowId } = props + const { t } = useTranslation() if (isUndefined(size)) { return ( @@ -58,7 +60,7 @@ const KeyRowSize = (props: Props) => { data-testid={`size-${nameString}`} > { const { ttl, nameString, deletePopoverId, rowId } = props + const { t } = useTranslation() if (isUndefined(ttl)) { return ( @@ -41,7 +43,7 @@ const KeyRowTTL = (props: Props) => { color="secondary" data-testid={`ttl-${nameString}`} > - No limit + {t('browser.keyList.ttl.noLimit')} ) } @@ -60,7 +62,7 @@ const KeyRowTTL = (props: Props) => { data-testid={`ttl-${nameString}`} > ({ describe('KeyTree', () => { it('should be rendered', () => { - expect( - render( - - - , - ), - ).toBeTruthy() + expect(render()).toBeTruthy() }) it('"setBrowserTreeNodesOpen" to be called after click on folder', () => { const onSelectedKeyMock = jest.fn() const { getByTestId } = render( - - - , + , ) // set open state @@ -158,9 +149,7 @@ describe('KeyTree', () => { it('"selectKey" to be called after click on leaf', async () => { const onSelectedKeyMock = jest.fn() const { getByTestId } = render( - - - , + , ) // open parent folder @@ -182,11 +171,7 @@ describe('KeyTree', () => { selectedKeyDataSelectorMock, ) - const { getByTestId } = render( - - - , - ) + const { getByTestId } = render() expect(getByTestId(`node-item_${leaf2FullName}`)).toBeInTheDocument() }) diff --git a/redisinsight/ui/src/pages/browser/components/key-tree/KeyTreeSettings/KeyTreeSettings.tsx b/redisinsight/ui/src/pages/browser/components/key-tree/KeyTreeSettings/KeyTreeSettings.tsx index bedc9081c5..18d9377099 100644 --- a/redisinsight/ui/src/pages/browser/components/key-tree/KeyTreeSettings/KeyTreeSettings.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-tree/KeyTreeSettings/KeyTreeSettings.tsx @@ -17,6 +17,7 @@ import { setBrowserTreeSort, } from 'uiSrc/slices/app/context' import { comboBoxToArray } from 'uiSrc/utils' +import { useTranslation } from 'uiSrc/i18n' import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { @@ -47,16 +48,17 @@ const TreeViewSettingsButton = styled(IconButton)<{ export interface Props { loading: boolean } -const sortOptions = [SortOrder.ASC, SortOrder.DESC].map((value) => ({ - value, - inputDisplay: ( - - Key name {value} - - ), -})) const KeyTreeSettings = ({ loading }: Props) => { + const { t } = useTranslation() + const sortOptions = [SortOrder.ASC, SortOrder.DESC].map((value) => ({ + value, + inputDisplay: ( + + {t('browser.tree.settings.sortOption', { order: value })} + + ), + })) const { instanceId = '' } = useParams<{ instanceId: string }>() const { treeViewDelimiter = [DEFAULT_DELIMITER], @@ -100,7 +102,7 @@ const KeyTreeSettings = ({ loading }: Props) => { icon={SettingsIcon} onClick={onButtonClick} disabled={loading} - aria-label="open tree view settings" + aria-label={t('browser.tree.settings.aria')} data-testid="tree-view-settings-btn" /> ) @@ -162,7 +164,7 @@ const KeyTreeSettings = ({ loading }: Props) => { { /> - + option.inputDisplay ?? option.value} @@ -192,13 +197,13 @@ const KeyTreeSettings = ({ loading }: Props) => { data-testid="tree-view-cancel-btn" onClick={closePopover} > - Cancel + {t('browser.tree.settings.button.cancel')} - Apply + {t('browser.tree.settings.button.apply')} diff --git a/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Footer.tsx b/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Footer.tsx index f6d9d78276..6d890d1d34 100644 --- a/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Footer.tsx +++ b/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Footer.tsx @@ -6,10 +6,12 @@ import ScanMore from 'uiSrc/components/scan-more' import { numberWithSpaces, nullableNumberWithSpaces } from 'uiSrc/utils/numbers' import { Text, ColorText } from 'uiSrc/components/base/text' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import { useKeysBrowserPanel } from '../contexts/Context' const Footer = () => { + const { t } = useTranslation() const { viewType, searchMode, @@ -51,12 +53,12 @@ const Footer = () => { {headerLoading && !keysState.total && !isNull(keysState.total) && ( - Scanning... + {t('browser.keysBrowser.scanning')} )} {!!footerScanned && ( - {'Results: '} + {t('browser.keysBrowser.results')} {numberWithSpaces(keysState.keys.length)} @@ -64,7 +66,7 @@ const Footer = () => { )} {!footerScanned && (!!keysState.total || isNull(keysState.total)) && ( - {'Total: '} + {t('browser.keysBrowser.total')} {nullableNumberWithSpaces(keysState.total)} )} @@ -73,7 +75,7 @@ const Footer = () => { {!!footerScanned && ( - {'Scanned '} + {t('browser.keysBrowser.scannedPrefix')} {footerNotAccurateScanned} {numberWithSpaces(footerScannedDisplay)} diff --git a/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Header.tsx b/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Header.tsx index e0a31a7e7a..c3472df5c9 100644 --- a/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Header.tsx +++ b/redisinsight/ui/src/pages/browser/components/keys-browser-panel/components/Header.tsx @@ -8,6 +8,7 @@ import { ActionIconButton } from 'uiSrc/components/base/forms/buttons' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { ViewSwitch, ColumnsMenu } from 'uiSrc/components/browser' +import { useTranslation } from 'uiSrc/i18n' import { KeyTreeSettings } from '../../key-tree' import { useKeysBrowserPanel } from '../contexts/Context' @@ -15,6 +16,7 @@ import { useKeysBrowserPanel } from '../contexts/Context' const HIDE_REFRESH_LABEL_WIDTH = 640 const Header = () => { + const { t } = useTranslation() const { viewType, searchMode, @@ -34,7 +36,7 @@ const Header = () => { return ( - {({ width }) => ( + {({ width }: { width: number }) => ( @@ -42,7 +44,9 @@ const Header = () => { disabled={ searchMode === SearchMode.Redisearch && !selectedIndex } - disabledRefreshButtonMessage="Select an index to refresh keys." + disabledRefreshButtonMessage={t( + 'browser.keysBrowser.refreshDisabledMessage', + )} iconSize="S" postfix="keys" loading={loading} @@ -71,7 +75,7 @@ const Header = () => { diff --git a/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx b/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx index b499fed897..69925cedcd 100644 --- a/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx +++ b/redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx @@ -1,6 +1,7 @@ /* eslint-disable react/destructuring-assignment */ /* eslint-disable react/no-this-in-sfc */ import React, { Ref, useEffect, useRef, useState } from 'react' +import { ParseKeys } from 'i18next' import { Environment } from 'apiClient' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import AutoSizer from 'react-virtualized-auto-sizer' @@ -60,6 +61,7 @@ import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { Text } from 'uiSrc/components/base/text' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' import { localStorageService } from 'uiSrc/services' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' import * as S from './KeysHeader.styles' @@ -87,14 +89,26 @@ export interface Props { onChangeSorting?: (column: string | null, order: SortOrder | null) => void } -const SORTABLE_COLUMNS = [ +const SORTABLE_COLUMNS: { + id: string + label: ParseKeys + requiresColumn: BrowserColumns | null +}[] = [ { id: 'nameString', - label: 'Key', + label: 'browser.keyList.column.key', requiresColumn: null as BrowserColumns | null, }, - { id: 'ttl', label: 'TTL', requiresColumn: BrowserColumns.TTL }, - { id: 'size', label: 'Size', requiresColumn: BrowserColumns.Size }, + { + id: 'ttl', + label: 'browser.keyList.column.ttl', + requiresColumn: BrowserColumns.TTL, + }, + { + id: 'size', + label: 'browser.keyList.column.size', + requiresColumn: BrowserColumns.Size, + }, ] const KeysHeader = (props: Props) => { @@ -108,6 +122,7 @@ const KeysHeader = (props: Props) => { sortedColumn, onChangeSorting, } = props + const { t } = useTranslation() const { id: instanceId, keyNameFormat } = useAppSelector( connectedInstanceSelector, @@ -154,8 +169,8 @@ const KeysHeader = (props: Props) => { const viewTypes: ISwitchType[] = [ { type: KeyViewType.Browser, - tooltipText: 'List View', - ariaLabel: 'List view button', + tooltipText: t('browser.keysHeader.view.listTooltip'), + ariaLabel: t('browser.keysHeader.view.listAria'), dataTestId: 'view-type-browser-btn', isActiveView() { return viewType === this.type @@ -170,9 +185,9 @@ const KeysHeader = (props: Props) => { { type: KeyViewType.Tree, tooltipText: isTreeViewDisabled - ? 'Tree View is unavailable when the HEX key name format is selected.' - : 'Tree View', - ariaLabel: 'Tree view button', + ? t('browser.keysHeader.view.treeDisabledTooltip') + : t('browser.keysHeader.view.treeTooltip'), + ariaLabel: t('browser.keysHeader.view.treeAria'), dataTestId: 'view-type-list-btn', disabled: isTreeViewDisabled, isActiveView() { @@ -360,7 +375,7 @@ const KeysHeader = (props: Props) => { return (
- {({ width }) => ( + {({ width }: { width: number }) => ( { onPressedChange={toggleColumnsConfigVisibility} className={styles.columnsButton} data-testid="btn-columns-actions" - aria-label="columns" + aria-label={t('browser.keysHeader.columnsAria')} pressed={columnsConfigShown} > - Columns + {t('browser.keysHeader.columns')} } > @@ -433,7 +448,7 @@ const KeysHeader = (props: Props) => { { @@ -468,7 +483,7 @@ const KeysHeader = (props: Props) => { changeColumnsShown( @@ -486,7 +501,7 @@ const KeysHeader = (props: Props) => { - Sort by: + {t('browser.keysHeader.sortBy')} {SORTABLE_COLUMNS.filter( @@ -500,7 +515,7 @@ const KeysHeader = (props: Props) => { justify="between" > - {col.label} + {t(col.label)} @@ -519,7 +534,9 @@ const KeysHeader = (props: Props) => { ) } data-testid={`sort-asc-${col.id}`} - title={`Sort ${col.label} ascending`} + title={t('browser.keysHeader.sortAsc', { + column: t(col.label), + })} > @@ -540,7 +557,10 @@ const KeysHeader = (props: Props) => { ) } data-testid={`sort-desc-${col.id}`} - title={`Sort ${col.label} descending`} + title={t( + 'browser.keysHeader.sortDesc', + { column: t(col.label) }, + )} > diff --git a/redisinsight/ui/src/pages/browser/components/load-sample-data/LoadSampleData.tsx b/redisinsight/ui/src/pages/browser/components/load-sample-data/LoadSampleData.tsx index d1922dc7fd..1d4a5b50bf 100644 --- a/redisinsight/ui/src/pages/browser/components/load-sample-data/LoadSampleData.tsx +++ b/redisinsight/ui/src/pages/browser/components/load-sample-data/LoadSampleData.tsx @@ -21,6 +21,7 @@ import { RiPopover, RiTooltip } from 'uiSrc/components/base' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' import { Environment } from 'apiClient' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -30,6 +31,7 @@ export interface Props { const LoadSampleData = (props: Props) => { const { anchorClassName, onSuccess } = props + const { t } = useTranslation() const [isConfirmationOpen, setIsConfirmationOpen] = useState(false) const { id } = useAppSelector(connectedInstanceSelector) @@ -65,7 +67,7 @@ const LoadSampleData = (props: Props) => { { disabled={loading || isProduction} data-testid="load-sample-data-btn" > - Load sample data + {t('browser.loadSampleData.button')} } @@ -88,12 +90,11 @@ const LoadSampleData = (props: Props) => { - Execute commands in bulk - - - All commands from the file will be automatically executed against - your database. Avoid executing them in production databases. + + {t('browser.loadSampleData.confirm.title')} + + {t('browser.loadSampleData.confirm.message')} @@ -105,7 +106,7 @@ const LoadSampleData = (props: Props) => { onClick={handleSampleData} data-testid="load-sample-data-btn-confirm" > - Execute + {t('browser.loadSampleData.confirm.execute')} diff --git a/redisinsight/ui/src/pages/browser/components/make-searchable-button/MakeSearchableButton.tsx b/redisinsight/ui/src/pages/browser/components/make-searchable-button/MakeSearchableButton.tsx index 8dc04654b6..31788b4c0a 100644 --- a/redisinsight/ui/src/pages/browser/components/make-searchable-button/MakeSearchableButton.tsx +++ b/redisinsight/ui/src/pages/browser/components/make-searchable-button/MakeSearchableButton.tsx @@ -3,6 +3,7 @@ import { useAppSelector } from 'uiSrc/slices/hooks' import { PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { RiTooltip } from 'uiSrc/components' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { KEY_TYPE_MAP } from 'uiSrc/pages/vector-search/constants' import { extractNamespace } from 'uiSrc/pages/vector-search/utils' import { useMakeSearchableModal } from 'uiSrc/pages/browser/components/make-searchable-modal' @@ -17,6 +18,7 @@ export const MakeSearchableButton = ({ keyNameString, keyType, }: MakeSearchableButtonProps) => { + const { t } = useTranslation() const { openMakeSearchableModal } = useMakeSearchableModal() const { id: instanceId } = useAppSelector(connectedInstanceSelector) @@ -52,9 +54,11 @@ export const MakeSearchableButton = ({ position="top" content={ - Index data with the "{prefix}" prefix so you can - query it using full-text, vector, exact matching, and geospatial - search. + }} + /> } > @@ -63,7 +67,7 @@ export const MakeSearchableButton = ({ onClick={handleOpen} data-testid="make-searchable-btn" > - Make searchable + {t('browser.makeSearchable.button.trigger')} ) diff --git a/redisinsight/ui/src/pages/browser/components/make-searchable-modal/MakeSearchableModal.tsx b/redisinsight/ui/src/pages/browser/components/make-searchable-modal/MakeSearchableModal.tsx index 6f6d3c903c..45de8fd68c 100644 --- a/redisinsight/ui/src/pages/browser/components/make-searchable-modal/MakeSearchableModal.tsx +++ b/redisinsight/ui/src/pages/browser/components/make-searchable-modal/MakeSearchableModal.tsx @@ -10,6 +10,8 @@ import { import { CancelIcon } from 'uiSrc/components/base/icons' import { Row } from 'uiSrc/components/base/layout/flex' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' + import MakeSearchableImg from 'uiSrc/assets/img/vector-search/make-searchable-modal-img.svg?react' import MakeSearchableImgDark from 'uiSrc/assets/img/vector-search/make-searchable-modal-img-dark.svg?react' @@ -24,6 +26,7 @@ export const MakeSearchableModal = ({ onConfirm, onCancel, }: MakeSearchableModalProps) => { + const { t } = useTranslation() const theme = useTheme() const Illustration = theme.name === 'dark' ? MakeSearchableImgDark : MakeSearchableImg @@ -49,23 +52,29 @@ export const MakeSearchableModal = ({ color="primary" data-testid={`${TEST_ID}-heading`} > - Make this data searchable + {t('browser.makeSearchable.title')} - We’ll take you to the Search workspace to set up the index. + {t('browser.makeSearchable.description.intro')} {prefix != null && ( <> {' '} - All keys starting with{' '} - - '{prefix}' - {' '} - will be included. + + {''} + + ), + }} + /> )}{' '} - You can review and adjust the schema before creating the index. + {t('browser.makeSearchable.description.outro')} @@ -75,14 +84,14 @@ export const MakeSearchableModal = ({ onClick={onCancel} data-testid={`${TEST_ID}-cancel`} > - Cancel + {t('browser.makeSearchable.button.cancel')} - Continue + {t('browser.makeSearchable.button.continue')} diff --git a/redisinsight/ui/src/pages/browser/components/no-keys-found/NoKeysFound.tsx b/redisinsight/ui/src/pages/browser/components/no-keys-found/NoKeysFound.tsx index 233d677132..2bf4fc0a93 100644 --- a/redisinsight/ui/src/pages/browser/components/no-keys-found/NoKeysFound.tsx +++ b/redisinsight/ui/src/pages/browser/components/no-keys-found/NoKeysFound.tsx @@ -22,6 +22,7 @@ import { Spacer } from 'uiSrc/components/base/layout/spacer' import { Title } from 'uiSrc/components/base/text/Title' import { Col, Row } from 'uiSrc/components/base/layout/flex' import { PlusIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import LoadSampleData from '../load-sample-data' import { AddKeysManuallyButton, StyledImage } from './NoKeysFound.styles' @@ -32,6 +33,7 @@ export interface Props { const NoKeysFound = (props: Props) => { const { onAddKeyPanel } = props + const { t } = useTranslation() const { openedPanel } = useAppSelector(sidePanelsSelector) const { viewType } = useAppSelector(keysSelector) @@ -61,10 +63,10 @@ const NoKeysFound = (props: Props) => { return ( - + - Let's start working + {t('browser.noKeysFound.title')} @@ -74,7 +76,7 @@ const NoKeysFound = (props: Props) => { onClick={() => onAddKeyPanel(true)} data-testid="add-key-msg-btn" > - Add key manually + {t('browser.noKeysFound.addKeyManually')} diff --git a/redisinsight/ui/src/pages/browser/components/no-keys-message/NoKeysMessage.tsx b/redisinsight/ui/src/pages/browser/components/no-keys-message/NoKeysMessage.tsx index 69a0ca0a4d..f785e10826 100644 --- a/redisinsight/ui/src/pages/browser/components/no-keys-message/NoKeysMessage.tsx +++ b/redisinsight/ui/src/pages/browser/components/no-keys-message/NoKeysMessage.tsx @@ -3,15 +3,11 @@ import React from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' import { SearchMode } from 'uiSrc/slices/interfaces/keys' -import { - FullScanNoResultsFoundText, - LoadingText, - NoResultsFoundText, - NoSelectedIndexText, - ScanNoResultsFoundText, -} from 'uiSrc/constants/texts' import { keysSelector } from 'uiSrc/slices/browser/keys' import { redisearchSelector } from 'uiSrc/slices/browser/redisearch' +import { Text } from 'uiSrc/components/base/text' +import { Spacer } from 'uiSrc/components/base/layout/spacer' +import { Trans, useTranslation } from 'uiSrc/i18n' import NoKeysFound from '../no-keys-found' @@ -24,6 +20,7 @@ export interface Props { const NoKeysMessage = (props: Props) => { const { total, scanned, onAddKeyPanel, isLoading } = props + const { t } = useTranslation() const { selectedIndex, isSearched: redisearchIsSearched } = useAppSelector(redisearchSelector) @@ -33,26 +30,69 @@ const NoKeysMessage = (props: Props) => { searchMode, } = useAppSelector(keysSelector) + const noResultsFoundText = ( + + {t('browser.noResults.title')} + + ) + + const loadingText = ( + + {t('browser.noResults.loading')} + + ) + + const noSelectedIndexText = ( + + {t('browser.noResults.selectIndex')} + + ) + + const fullScanNoResultsFoundText = ( + <> + + {t('browser.noResults.title')} + + + + }} + /> + + + ) + + const scanNoResultsFoundText = ( + <> + + {t('browser.noResults.title')} + +
+ {t('browser.noResults.scanMore')} + + ) + if (searchMode === SearchMode.Redisearch) { if (!selectedIndex) { - return NoSelectedIndexText + return noSelectedIndexText } if (isLoading) { - return LoadingText + return loadingText } if (total === 0) { - return NoResultsFoundText + return noResultsFoundText } if (redisearchIsSearched) { - return scanned < total ? NoResultsFoundText : FullScanNoResultsFoundText + return scanned < total ? noResultsFoundText : fullScanNoResultsFoundText } } if (isLoading) { - return LoadingText + return loadingText } if (total === 0) { @@ -60,14 +100,14 @@ const NoKeysMessage = (props: Props) => { } if (patternIsSearched) { - return scanned < total ? ScanNoResultsFoundText : FullScanNoResultsFoundText + return scanned < total ? scanNoResultsFoundText : fullScanNoResultsFoundText } if (isFiltered && scanned < total) { - return ScanNoResultsFoundText + return scanNoResultsFoundText } - return NoResultsFoundText + return noResultsFoundText } export default NoKeysMessage diff --git a/redisinsight/ui/src/pages/browser/components/onboarding-start-popover/OnboardingStartPopover.tsx b/redisinsight/ui/src/pages/browser/components/onboarding-start-popover/OnboardingStartPopover.tsx index 1ad0751ddb..54f8bc6b60 100644 --- a/redisinsight/ui/src/pages/browser/components/onboarding-start-popover/OnboardingStartPopover.tsx +++ b/redisinsight/ui/src/pages/browser/components/onboarding-start-popover/OnboardingStartPopover.tsx @@ -15,9 +15,11 @@ import { Title } from 'uiSrc/components/base/text/Title' import { Text } from 'uiSrc/components/base/text' import { RiPopover } from 'uiSrc/components/base' import { Row } from 'uiSrc/components/base/layout/flex' +import { Trans, useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' const OnboardingStartPopover = () => { + const { t } = useTranslation() const { id: connectedInstanceId = '' } = useAppSelector( connectedInstanceSelector, ) @@ -54,13 +56,13 @@ const OnboardingStartPopover = () => { anchorPosition="downRight" data-testid="onboarding-start-popover" > - Take a quick tour of Redis Insight? + {t('browser.onboarding.title')} - Hi! Redis Insight has many tools that can help you to optimize the - development process. -
- Would you like us to show them to you? + }} + />
@@ -69,7 +71,7 @@ const OnboardingStartPopover = () => { size="small" data-testid="skip-tour-btn" > - Skip tour + {t('browser.onboarding.button.skip')} { size="s" data-testid="start-tour-btn" > - Show me around + {t('browser.onboarding.button.start')} diff --git a/redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx b/redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx index 5246674ecf..36b46d6cfa 100644 --- a/redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx +++ b/redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx @@ -12,6 +12,7 @@ import { } from 'uiSrc/components/base/forms/buttons' import styles from './styles.module.scss' import ConfirmationPopover from 'uiSrc/components/confirmation-popover' +import { useTranslation } from 'uiSrc/i18n' export interface Props { header?: JSX.Element | string @@ -49,10 +50,12 @@ const PopoverDelete = (props: Props) => { appendInfo, testid = '', buttonLabel, - ariaLabel = 'Remove field', + ariaLabel, persistent, customOutsideDetector, } = props + const { t } = useTranslation() + const removeAriaLabel = ariaLabel ?? t('browser.popoverDelete.removeAria') const isDisabled = isTruncatedString(item) @@ -71,7 +74,7 @@ const PopoverDelete = (props: Props) => { const deleteButton = buttonLabel ? ( {} : onButtonClick} data-testid={testid ? `${testid}-icon` : 'remove-icon'} @@ -82,7 +85,7 @@ const PopoverDelete = (props: Props) => { {} : onButtonClick} data-testid={testid ? `${testid}-icon` : 'remove-icon'} @@ -121,7 +124,7 @@ const PopoverDelete = (props: Props) => { onClick={() => handleDeleteItem(itemRaw || item)} data-testid={testid || 'remove'} > - Remove + {t('browser.popoverDelete.button')} } customOutsideDetector={customOutsideDetector} diff --git a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx index 40c229062a..266ce19a01 100644 --- a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx @@ -29,7 +29,7 @@ import { localStorageService } from 'uiSrc/services' import { SearchMode } from 'uiSrc/slices/interfaces/keys' import { RedisDefaultModules } from 'uiSrc/slices/interfaces' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' -import { BrowserStorageItem, FeatureFlags } from 'uiSrc/constants' +import { BrowserStorageItem } from 'uiSrc/constants' import RediSearchIndexesList, { Props } from './RediSearchIndexesList' import { INSTANCE_ID_MOCK } from 'uiSrc/mocks/handlers/instances/instancesHandlers' import { setStoreRef } from 'uiSrc/utils/test-store' @@ -123,19 +123,6 @@ describe('RediSearchIndexesList', () => { }, }, }, - app: { - ...state.app, - features: { - ...state.app.features, - featureFlags: { - ...state.app.features.featureFlags, - features: { - ...state.app.features.featureFlags?.features, - [FeatureFlags.vectorSearchV2]: { flag: true }, - }, - }, - }, - }, }), ) ;(connectedInstanceSelector as jest.Mock).mockImplementation(() => ({ @@ -235,6 +222,27 @@ describe('RediSearchIndexesList', () => { expect(fetchKeysMock).toHaveBeenCalled() }) + it('should filter the options by the drop-down search, keeping Create Index', async () => { + ;(redisearchListSelector as jest.Mock).mockReturnValue({ + data: [stringToBuffer('products-idx'), stringToBuffer('users-idx')], + loading: false, + error: '', + selectedIndex: null, + }) + + renderRediSearchIndexesList(instance(mockedProps)) + + await userEvent.click(screen.getByTestId('select-search-mode')) + await userEvent.type( + screen.getByLabelText('Search', { selector: 'input' }), + 'USERS', + ) + + expect(screen.getByText('users-idx')).toBeInTheDocument() + expect(screen.queryByText('products-idx')).not.toBeInTheDocument() + expect(screen.getByText('Create Index')).toBeInTheDocument() + }) + it('should load indexes after click on refresh', () => { ;(connectedInstanceSelector as jest.Mock).mockImplementation(() => ({ host: '123.23.1.1', diff --git a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.tsx b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.tsx index 21f27f0e9e..0457e073f7 100644 --- a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.tsx +++ b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect } from 'react' +import React, { useCallback, useEffect, useMemo } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { useHistory, useLocation } from 'react-router-dom' @@ -19,18 +19,13 @@ import { } from 'uiSrc/slices/browser/keys' import { setBrowserSelectedKey } from 'uiSrc/slices/app/context' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { - bufferToString, - formatLongName, - isRedisearchAvailable, -} from 'uiSrc/utils' +import { bufferToString, isRedisearchAvailable } from 'uiSrc/utils' import { SCAN_COUNT_DEFAULT, SCAN_TREE_COUNT_DEFAULT, } from 'uiSrc/constants/api' import { localStorageService } from 'uiSrc/services' -import { BrowserStorageItem, FeatureFlags } from 'uiSrc/constants' -import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features' +import { BrowserStorageItem } from 'uiSrc/constants' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { PlusIcon, ResetIcon } from 'uiSrc/components/base/icons' @@ -41,8 +36,13 @@ import { } from 'uiSrc/components/base/forms/select/RiSelect' import { Text } from 'uiSrc/components/base/text' import { Row } from 'uiSrc/components/base/layout/flex' -import { getIndexDisplayName } from 'uiSrc/pages/vector-search/utils' +import { useTranslation } from 'uiSrc/i18n' import * as S from './RediSearchIndexesList.styles' +import { + getIndexOptionLabel, + getIndexOptionsWidth, + matchesIndexSearch, +} from './RediSearchIndexesList.utils' export const CREATE = JSON.stringify('create') @@ -51,6 +51,7 @@ export interface Props { } const RediSearchIndexesList = (props: Props) => { + const { t } = useTranslation() const { onCreateIndex } = props const { viewType, searchMode } = useAppSelector(keysSelector) @@ -63,9 +64,6 @@ const RediSearchIndexesList = (props: Props) => { } = useAppSelector(connectedInstanceSelector) const selectedValue = selectedIndex ? bufferToString(selectedIndex) : '' - const featureFlags = useAppSelector(appFeatureFlagsFeaturesSelector) - const isVectorSearch = - featureFlags?.[FeatureFlags.vectorSearchV2]?.flag ?? false const dispatch = useAppDispatch() const location = useLocation() @@ -131,13 +129,14 @@ const RediSearchIndexesList = (props: Props) => { [], ) + const contentWidth = useMemo( + () => getIndexOptionsWidth(list.map((item) => bufferToString(item))), + [list], + ) + const options = list.map((item) => { const stringValue = bufferToString(item) - const displayValue = formatLongName( - getIndexDisplayName(stringValue), - 100, - 10, - ) + const displayValue = getIndexOptionLabel(stringValue) return { value: stringValue, @@ -157,25 +156,23 @@ const RediSearchIndexesList = (props: Props) => { } }) - if (isVectorSearch) { - options.push({ - value: CREATE, - inputDisplay: CREATE, - dropdownDisplay: ( - - - - Create Index - - - ), - }) - } + options.push({ + value: CREATE, + inputDisplay: CREATE, + dropdownDisplay: ( + + + + {t('browser.redisearch.createIndex')} + + + ), + }) const onChangeIndex = (value: string) => { if (value === CREATE) { @@ -226,30 +223,37 @@ const RediSearchIndexesList = (props: Props) => { options={options} value={selectedValue} onChange={onChangeIndex} + customCompare={(option, search) => + option.value === CREATE || matchesIndexSearch(option.value, search) + } >
- + e.stopPropagation()} />
- + ) diff --git a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.spec.ts b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.spec.ts new file mode 100644 index 0000000000..a1027f9151 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.spec.ts @@ -0,0 +1,63 @@ +import { faker } from '@faker-js/faker' + +import { + getIndexOptionLabel, + getIndexOptionsWidth, + matchesIndexSearch, +} from './RediSearchIndexesList.utils' + +describe('getIndexOptionLabel', () => { + it('should return the index name unchanged when it is short', () => { + const name = `idx:${faker.word.noun()}` + + expect(getIndexOptionLabel(name)).toEqual(name) + }) + + it('should label an unnamed index instead of rendering nothing', () => { + expect(getIndexOptionLabel('')).not.toEqual('') + }) +}) + +describe('matchesIndexSearch', () => { + it('should match on the index name, case-insensitively', () => { + expect(matchesIndexSearch('idx:Restaurant', 'restaur')).toBe(true) + expect(matchesIndexSearch('idx:Restaurant', 'bicycle')).toBe(false) + }) + + it('should match an unnamed index by its displayed label', () => { + expect(matchesIndexSearch('', 'empty')).toBe(true) + }) + + it('should keep an unnamed index reachable for any term it displays', () => { + // '' matches no term by name alone, which would hide the option entirely + expect(matchesIndexSearch('', 'name')).toBe(true) + expect(matchesIndexSearch('', 'bicycle')).toBe(false) + }) + + it('should treat a whitespace-only term as no filter', () => { + expect(matchesIndexSearch('idx:bicycle', ' ')).toBe(true) + expect(matchesIndexSearch('idx:bicycle', ' ')).toBe(true) + }) + + it('should ignore padding around a real term', () => { + expect(matchesIndexSearch('idx:bicycle', ' bicycle ')).toBe(true) + }) +}) + +describe('getIndexOptionsWidth', () => { + it('should fall back to the trigger width when there are no indexes', () => { + expect(getIndexOptionsWidth([])).toEqual( + 'max(var(--radix-select-trigger-width), 6ch)', + ) + }) + + it('should size to the longest name so filtering cannot resize the popover', () => { + const names = ['idx:a', 'idx:abcdefghij', 'idx:abc'] + + const width = getIndexOptionsWidth(names) + + expect(width).toEqual('max(var(--radix-select-trigger-width), 20ch)') + // narrowing the list to any subset keeps the width the longest name asked for + expect(getIndexOptionsWidth(['idx:abcdefghij'])).toEqual(width) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.ts b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.ts new file mode 100644 index 0000000000..472d08975d --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.utils.ts @@ -0,0 +1,44 @@ +import { formatLongName } from 'uiSrc/utils' +import { getIndexDisplayName } from 'uiSrc/pages/vector-search/utils' + +const MAX_LABEL_LENGTH = 100 +const LABEL_END_PART_LENGTH = 10 + +// Characters reserved for option padding and the selection indicator +const OPTION_CHROME_CH = 6 + +export const getIndexOptionLabel = (indexName: string) => + formatLongName( + getIndexDisplayName(indexName), + MAX_LABEL_LENGTH, + LABEL_END_PART_LENGTH, + ) + +/** + * Matches an index against a drop-down search term by both its name and its displayed + * label, so an index whose label differs from its name — an unnamed index renders as + * "(empty name)" — stays reachable. + */ +export const matchesIndexSearch = (indexName: string, search: string) => { + const term = search.trim().toLowerCase() + if (!term) return true + + return ( + indexName.toLowerCase().includes(term) || + getIndexOptionLabel(indexName).toLowerCase().includes(term) + ) +} + +/** + * Width for the index drop-down, derived from the longest label in the whole list so + * that filtering the options never resizes the popover. `ch` approximates the label + * width; the popover floor stays the trigger width. + */ +export const getIndexOptionsWidth = (indexNames: string[]) => { + const longestLabel = Math.max( + 0, + ...indexNames.map((name) => getIndexOptionLabel(name).length), + ) + + return `max(var(--radix-select-trigger-width), ${longestLabel + OPTION_CHROME_CH}ch)` +} diff --git a/redisinsight/ui/src/pages/browser/components/search-key-list/SearchKeyList.tsx b/redisinsight/ui/src/pages/browser/components/search-key-list/SearchKeyList.tsx index 2bb7236355..3044b5e2fb 100644 --- a/redisinsight/ui/src/pages/browser/components/search-key-list/SearchKeyList.tsx +++ b/redisinsight/ui/src/pages/browser/components/search-key-list/SearchKeyList.tsx @@ -45,14 +45,15 @@ import { FeatureFlags } from 'uiSrc/constants' import { FeatureFlagComponent } from 'uiSrc/components' import { EmptyButton } from 'uiSrc/components/base/forms/buttons' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' -const placeholders = { - [SearchMode.Pattern]: 'Filter by Key Name or Pattern', - [SearchMode.Redisearch]: 'Search per Values of Keys', -} - const SearchKeyList = () => { + const { t } = useTranslation() + const placeholders = { + [SearchMode.Pattern]: t('browser.search.placeholder.pattern'), + [SearchMode.Redisearch]: t('browser.search.placeholder.redisearch'), + } const { id } = useAppSelector(connectedInstanceSelector) const { search, filter, viewType, searchMode } = useAppSelector(keysSelector) const { search: redisearchQuery, selectedIndex } = @@ -196,7 +197,7 @@ const SearchKeyList = () => { ? searchHistory : rediSearchHistory, ), - buttonTooltipTitle: 'Show History', + buttonTooltipTitle: t('browser.search.showHistory'), loading: searchMode === SearchMode.Pattern ? searchHistoryLoading diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.styles.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.styles.ts new file mode 100644 index 0000000000..a1c841d0f2 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.styles.ts @@ -0,0 +1,7 @@ +import styled from 'styled-components' + +import { EmptyButton } from 'uiSrc/components/base/forms/buttons' + +export const ConfigButton = styled(EmptyButton)` + font-size: ${({ theme }) => theme.core.font.fontSize.s12}; +` diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.tsx new file mode 100644 index 0000000000..7f74aecab4 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ConfigValueDecoderButton.tsx @@ -0,0 +1,30 @@ +import React, { useCallback } from 'react' + +import { RiTooltip } from 'uiSrc/components' + +import { useValueDecoder } from './ValueDecoderProvider' +import { VALUE_DECODER_TEST_ID } from './constants' +import * as S from './ConfigValueDecoderButton.styles' + +export const ConfigValueDecoderButton = () => { + const { openValueDecoderModal } = useValueDecoder() + + const handleOpen = useCallback(() => { + openValueDecoderModal() + }, [openValueDecoderModal]) + + return ( + + + Value Decoders + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.styles.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.styles.ts new file mode 100644 index 0000000000..9014a913d8 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.styles.ts @@ -0,0 +1,8 @@ +import styled from 'styled-components' + +export const DecodedValueTooltipContent = styled.span` + display: inline-block; + width: max-content; + max-width: 90vw; + white-space: pre-wrap; +` diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.tsx new file mode 100644 index 0000000000..10a5812c75 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/DecodedValueDisplay.tsx @@ -0,0 +1,79 @@ +import React, { useMemo } from 'react' + +import { Text } from 'uiSrc/components/base/text' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' +import FormattedValue from 'uiSrc/pages/browser/modules/key-details/shared/formatted-value/FormattedValue' + +import * as S from './DecodedValueDisplay.styles' +import { useValueDecoder } from './ValueDecoderProvider' +import { + formatParsedFields, + formatParsedFieldsInline, + parseBufferWithRule, +} from './utils' + +export interface DecodedValueDisplayProps { + buffer: RedisResponseBuffer + fallback: React.ReactNode + expanded?: boolean +} + +export const DecodedValueDisplay = ({ + buffer, + fallback, + expanded, +}: DecodedValueDisplayProps) => { + const { matchedRule, isDecodeEnabled } = useValueDecoder() + + const decodedNodes = useMemo(() => { + if (!isDecodeEnabled || !matchedRule) return null + return parseBufferWithRule(buffer, matchedRule.schema) + }, [buffer, isDecodeEnabled, matchedRule]) + + const formattedInline = useMemo( + () => (decodedNodes ? formatParsedFieldsInline(decodedNodes) : ''), + [decodedNodes], + ) + + const formattedMultiline = useMemo( + () => (decodedNodes ? formatParsedFields(decodedNodes) : ''), + [decodedNodes], + ) + + if (!decodedNodes) { + return <>{fallback} + } + + if (decodedNodes.length === 0) { + return ( + + No decoded fields + + ) + } + + if (expanded) { + return ( + + {formattedMultiline} + + ) + } + + return ( + + {formattedMultiline} + + } + maxWidth="min(90vw, max-content)" + title="Value" + /> + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/DecoderEditor.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/DecoderEditor.tsx new file mode 100644 index 0000000000..792a1ea483 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/DecoderEditor.tsx @@ -0,0 +1,158 @@ +import React, { useCallback } from 'react' + +import { Text } from 'uiSrc/components/base/text' +import { ActionIconButton } from 'uiSrc/components/base/forms/buttons' +import { DeleteIcon } from 'uiSrc/components/base/icons' +import { Col } from 'uiSrc/components/base/layout/flex' +import { FormField } from 'uiSrc/components/base/forms/FormField' +import TextInput from 'uiSrc/components/base/inputs/TextInput' +import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' +import { CopyButton } from 'uiSrc/components/copy-button/CopyButton' + +import { DECODER_TYPE_OPTIONS, VALUE_DECODER_TEST_ID } from './constants' +import { serializeDecoderForClipboard } from './decoderClipboard' +import { + DECODER_TYPE_DESCRIPTIONS, + KEY_PATTERN_FIELD_DESCRIPTION, +} from './descriptions' +import { createDescriptionSelectValueRender } from './DescriptionSelectValueRender' +import { FieldsSchemaEditor } from './FieldsSchemaEditor' +import { KeyPatternsEditor } from './KeyPatternsEditor' +import { isDecoderValid } from './schemaUtils' +import { DecoderType, SchemaNode, ValueDecoderRule } from './types' +import * as S from './ValueDecoderModal.styles' + +const decoderTypeOptions = DECODER_TYPE_OPTIONS.map((option) => ({ + value: option.value, + label: option.content, +})) + +const decoderTypeValueRender = createDescriptionSelectValueRender( + DECODER_TYPE_DESCRIPTIONS, +) + +export interface DecoderEditorProps { + decoder: ValueDecoderRule + isExpanded: boolean + onToggle: () => void + onChange: (decoder: ValueDecoderRule) => void + onRemove: () => void + canRemove: boolean + summary: string + matchesCurrentKey?: boolean +} + +export const DecoderEditor = ({ + decoder, + isExpanded, + onToggle, + onChange, + onRemove, + canRemove, + summary, + matchesCurrentKey, +}: DecoderEditorProps) => { + const handleFieldChange = useCallback( + (key: K, value: ValueDecoderRule[K]) => { + onChange({ ...decoder, [key]: value }) + }, + [decoder, onChange], + ) + + const isValid = isDecoderValid(decoder) + + return ( + + + + + {summary} + + {matchesCurrentKey && ( + Matches current key + )} + {!isValid && ( + Incomplete + )} + + + + + + + + {isExpanded && ( + + + handleFieldChange('name', value)} + placeholder="Chunk state decoder" + data-testid={`${VALUE_DECODER_TEST_ID}-decoder-name-${decoder.id}`} + /> + + + + 0 ? decoder.keyPatterns : [''] + } + onChange={(keyPatterns) => + handleFieldChange('keyPatterns', keyPatterns) + } + /> + + + + + handleFieldChange('decoderType', value as DecoderType) + } + valueRender={decoderTypeValueRender} + data-testid={`${VALUE_DECODER_TEST_ID}-decoder-type-${decoder.id}`} + /> + + + + Fields + + handleFieldChange('schema', schema) + } + /> + + + )} + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/DescriptionSelectValueRender.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/DescriptionSelectValueRender.tsx new file mode 100644 index 0000000000..ac881f24bd --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/DescriptionSelectValueRender.tsx @@ -0,0 +1,31 @@ +import React from 'react' + +import { RiTooltip } from 'uiSrc/components' + +import { + SelectValueRender, + SelectValueRenderParams, +} from 'uiSrc/components/base/forms/select/RiSelect' + +import * as S from './ValueDecoderModal.styles' + +export const createDescriptionSelectValueRender = ( + descriptions: Record, +): SelectValueRender => { + return ({ option, isOptionValue }: SelectValueRenderParams) => { + const description = descriptions[String(option.value)] ?? '' + const label = option.label ?? option.value + + return ( + + + {label} + + + ) + } +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/EyeIcon.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/EyeIcon.tsx new file mode 100644 index 0000000000..1c691bf1ce --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/EyeIcon.tsx @@ -0,0 +1,41 @@ +import React from 'react' + +type EyeIconProps = { + size?: number + className?: string +} + +export const EyeIcon = ({ size = 16, className }: EyeIconProps) => ( + + + + +) + +export const EyeOffIcon = ({ size = 16, className }: EyeIconProps) => ( + + + +) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/FieldRow.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldRow.tsx new file mode 100644 index 0000000000..3a7a9de807 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldRow.tsx @@ -0,0 +1,80 @@ +import React from 'react' + +import { ActionIconButton } from 'uiSrc/components/base/forms/buttons' +import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' +import { DeleteIcon } from 'uiSrc/components/base/icons' +import TextInput from 'uiSrc/components/base/inputs/TextInput' + +import { BINARY_DATA_TYPES, VALUE_DECODER_TEST_ID } from './constants' +import { createDescriptionSelectValueRender } from './DescriptionSelectValueRender' +import { DATA_TYPE_DESCRIPTIONS } from './descriptions' +import { FieldSizeEditor } from './FieldSizeEditor' +import { + getPriorNumericFieldsInScope, + NumericFieldRef, + toNumericOptions, +} from './schemaUtils' +import { BinaryFieldDefinition, SchemaNode } from './types' +import * as S from './ValueDecoderModal.styles' + +const dataTypeOptions = BINARY_DATA_TYPES.map((type) => ({ + value: type, + label: type, +})) + +const dataTypeValueRender = createDescriptionSelectValueRender( + DATA_TYPE_DESCRIPTIONS, +) + +export interface FieldRowProps { + field: BinaryFieldDefinition + index: number + nodes: SchemaNode[] + priorNumericFields: NumericFieldRef[] + onFieldChange: (id: string, patch: Partial) => void + onRemove: (id: string) => void +} + +export const FieldRow = ({ + field, + index, + nodes, + priorNumericFields, + onFieldChange, + onRemove, +}: FieldRowProps) => { + const sizeSource = field.sizeSource ?? 'fixed' + const sizeRefs = toNumericOptions( + getPriorNumericFieldsInScope(priorNumericFields, nodes, index), + ) + + return ( + + onFieldChange(field.id, { name: value })} + placeholder="fieldName" + data-testid={`${VALUE_DECODER_TEST_ID}-field-name-${field.id}`} + /> + onFieldChange(field.id, { dataType: value })} + valueRender={dataTypeValueRender} + data-testid={`${VALUE_DECODER_TEST_ID}-field-type-${field.id}`} + /> + + onRemove(field.id)} + data-testid={`${VALUE_DECODER_TEST_ID}-remove-field-${field.id}`} + /> + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/FieldSizeEditor.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldSizeEditor.tsx new file mode 100644 index 0000000000..55bb90349e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldSizeEditor.tsx @@ -0,0 +1,95 @@ +import React from 'react' + +import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' +import NumericInput from 'uiSrc/components/base/inputs/NumericInput' + +import { SIZE_SOURCE_OPTIONS, VALUE_DECODER_TEST_ID } from './constants' +import { NumericFieldOption } from './schemaUtils' +import { BinaryFieldDefinition, FieldSizeSource } from './types' +import { getFixedSize, getSizeUnit } from './utils' +import * as S from './ValueDecoderModal.styles' + +const sizeSourceOptions = SIZE_SOURCE_OPTIONS.map((option) => ({ + value: option.value, + label: option.label, +})) + +export interface FieldSizeEditorProps { + field: BinaryFieldDefinition + sizeSource: FieldSizeSource + sizeRefs: NumericFieldOption[] + onFieldChange: (id: string, patch: Partial) => void +} + +export const FieldSizeEditor = ({ + field, + sizeSource, + sizeRefs, + onFieldChange, +}: FieldSizeEditorProps) => { + const fixedSize = getFixedSize(field.dataType) + const isCustomSize = fixedSize === 'custom' + + if (!isCustomSize) { + return ( + + {}} + disabled + data-testid={`${VALUE_DECODER_TEST_ID}-field-size-${field.id}`} + /> + + {getSizeUnit(field.size)} + + + ) + } + + return ( + + + onFieldChange(field.id, { + sizeSource: value as FieldSizeSource, + sizeFieldRef: value === 'field' ? field.sizeFieldRef : undefined, + }) + } + data-testid={`${VALUE_DECODER_TEST_ID}-field-size-source-${field.id}`} + /> + {sizeSource === 'field' ? ( + + onFieldChange(field.id, { sizeFieldRef: value ?? '' }) + } + placeholder="Select size field" + data-testid={`${VALUE_DECODER_TEST_ID}-field-size-ref-${field.id}`} + /> + ) : ( + + + onFieldChange(field.id, { + size: value == null || Number.isNaN(value) ? '' : value, + }) + } + min={1} + data-testid={`${VALUE_DECODER_TEST_ID}-field-size-${field.id}`} + /> + + {getSizeUnit(field.size)} + + + )} + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/FieldsSchemaEditor.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldsSchemaEditor.tsx new file mode 100644 index 0000000000..4f4fa78df2 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/FieldsSchemaEditor.tsx @@ -0,0 +1,124 @@ +import React from 'react' + +import { SecondaryButton } from 'uiSrc/components/base/forms/buttons' +import { Row } from 'uiSrc/components/base/layout/flex' + +import { isRepeatNode, VALUE_DECODER_TEST_ID } from './constants' +import { FieldRow } from './FieldRow' +import { RepeatBlockEditor } from './RepeatBlockEditor' +import { getPriorNumericFieldsInScope, NumericFieldRef } from './schemaUtils' +import { SortableItem } from './SortableItem' +import { SchemaNode } from './types' +import { useSchemaEditor } from './useSchemaEditor' +import * as S from './ValueDecoderModal.styles' + +export interface FieldsSchemaEditorProps { + sortListId: string + nodes: SchemaNode[] + onChange: (nodes: SchemaNode[]) => void + priorNumericFields?: NumericFieldRef[] + depth?: number +} + +export const FieldsSchemaEditor = ({ + sortListId, + nodes, + onChange, + priorNumericFields = [], + depth = 0, +}: FieldsSchemaEditorProps) => { + const { + handleFieldChange, + handleRepeatChange, + handleRepeatFieldsChange, + handleRemoveNode, + handleReorder, + handleAddField, + handleAddRepeat, + } = useSchemaEditor({ nodes, onChange }) + + const renderNode = (node: SchemaNode, index: number) => { + const repeatScopeNumeric = getPriorNumericFieldsInScope( + priorNumericFields, + nodes, + index, + ) + + const content = isRepeatNode(node) ? ( + + handleRepeatFieldsChange(node.id, fields)} + priorNumericFields={repeatScopeNumeric} + depth={depth + 1} + /> + + ) : ( + + ) + + return ( + + {content} + + ) + } + + const hasFieldNodes = nodes.some((node) => !isRepeatNode(node)) + + return ( + <> + {hasFieldNodes && ( + + Field Name + Data Type + Size + + + )} + + {nodes.map((node, index) => renderNode(node, index))} + + + + + Add Field + + + Add Repeat + + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/KeyPatternsEditor.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/KeyPatternsEditor.tsx new file mode 100644 index 0000000000..b5a98a917d --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/KeyPatternsEditor.tsx @@ -0,0 +1,105 @@ +import React, { useCallback } from 'react' + +import { + ActionIconButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' +import { DeleteIcon } from 'uiSrc/components/base/icons' +import TextInput from 'uiSrc/components/base/inputs/TextInput' + +import { VALUE_DECODER_TEST_ID } from './constants' +import { reorderList } from './reorderList' +import { SortableItem } from './SortableItem' +import * as S from './ValueDecoderModal.styles' + +export interface KeyPatternsEditorProps { + listId: string + patterns: string[] + onChange: (patterns: string[]) => void +} + +export const KeyPatternsEditor = ({ + listId, + patterns, + onChange, +}: KeyPatternsEditorProps) => { + const handlePatternChange = useCallback( + (index: number, value: string) => { + onChange(patterns.map((pattern, i) => (i === index ? value : pattern))) + }, + [onChange, patterns], + ) + + const handleRemovePattern = useCallback( + (index: number) => { + const next = patterns.filter((_, i) => i !== index) + onChange(next.length > 0 ? next : ['']) + }, + [onChange, patterns], + ) + + const handleAddPattern = useCallback(() => { + onChange([...patterns, '']) + }, [onChange, patterns]) + + const handleReorder = useCallback( + (fromIndex: number, toIndex: number) => { + onChange(reorderList(patterns, fromIndex, toIndex)) + }, + [onChange, patterns], + ) + + return ( + + {patterns.map((pattern, index) => { + const isLast = index === patterns.length - 1 + const patternRow = ( + + handlePatternChange(index, value)} + placeholder="room:chunk-state:*" + data-testid={`${VALUE_DECODER_TEST_ID}-key-pattern-${index}`} + /> + handleRemovePattern(index)} + disabled={patterns.length === 1 && !pattern.trim()} + data-testid={`${VALUE_DECODER_TEST_ID}-remove-key-pattern-${index}`} + /> + + ) + + const sortableRow = ( + + {patternRow} + + ) + + if (!isLast) { + return sortableRow + } + + return ( + + {sortableRow} + + Add Pattern + + + ) + })} + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/RepeatBlockEditor.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/RepeatBlockEditor.tsx new file mode 100644 index 0000000000..bc0cabbb1e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/RepeatBlockEditor.tsx @@ -0,0 +1,73 @@ +import React, { ReactNode } from 'react' + +import { ActionIconButton } from 'uiSrc/components/base/forms/buttons' +import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' +import { DeleteIcon } from 'uiSrc/components/base/icons' + +import { VALUE_DECODER_TEST_ID } from './constants' +import { + getPriorNumericFieldsInScope, + NumericFieldRef, + toNumericOptions, +} from './schemaUtils' +import { RepeatBlockDefinition, SchemaNode } from './types' +import * as S from './ValueDecoderModal.styles' + +export interface RepeatBlockEditorProps { + repeat: RepeatBlockDefinition + index: number + nodes: SchemaNode[] + priorNumericFields: NumericFieldRef[] + depth: number + onRepeatChange: ( + id: string, + patch: Partial<{ countFieldRef: string }>, + ) => void + onRemove: (id: string) => void + children: ReactNode +} + +export const RepeatBlockEditor = ({ + repeat, + index, + nodes, + priorNumericFields, + depth, + onRepeatChange, + onRemove, + children, +}: RepeatBlockEditorProps) => { + const repeatScopeNumeric = getPriorNumericFieldsInScope( + priorNumericFields, + nodes, + index, + ) + + return ( + + + Repeat + + onRepeatChange(repeat.id, { countFieldRef: value ?? '' }) + } + placeholder="Select count field" + data-testid={`${VALUE_DECODER_TEST_ID}-repeat-count-${repeat.id}`} + /> + onRemove(repeat.id)} + data-testid={`${VALUE_DECODER_TEST_ID}-remove-repeat-${repeat.id}`} + /> + + + {children} + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/SortableItem.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/SortableItem.tsx new file mode 100644 index 0000000000..f68e08e6f2 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/SortableItem.tsx @@ -0,0 +1,108 @@ +import React, { useCallback, useMemo } from 'react' + +import { ThreeDotsIcon } from 'uiSrc/components/base/icons' + +import * as S from './ValueDecoderModal.styles' + +const getSortMimeType = (listId: string) => + `application/x-value-decoder-sort-${listId}` + +const parseSortIndexFromDataTransfer = ( + dataTransfer: DataTransfer, + listId: string, +): number | null => { + const mimeType = getSortMimeType(listId) + if (!dataTransfer.types.includes(mimeType)) { + return null + } + + const raw = dataTransfer.getData(mimeType) + if (raw === '') { + return null + } + + const fromIndex = Number(raw) + if (!Number.isInteger(fromIndex) || fromIndex < 0) { + return null + } + + return fromIndex +} + +export interface SortableItemProps { + listId: string + index: number + onReorder: (fromIndex: number, toIndex: number) => void + children: React.ReactNode + testId?: string +} + +export const SortableItem = ({ + listId, + index, + onReorder, + children, + testId, +}: SortableItemProps) => { + const sortMimeType = useMemo(() => getSortMimeType(listId), [listId]) + + const handleDragStart = useCallback( + (event: React.DragEvent) => { + event.stopPropagation() + event.dataTransfer.setData(sortMimeType, String(index)) + event.dataTransfer.effectAllowed = 'move' + }, + [index, sortMimeType], + ) + + const handleDragOver = useCallback( + (event: React.DragEvent) => { + if (!event.dataTransfer.types.includes(sortMimeType)) { + return + } + + event.preventDefault() + event.stopPropagation() + event.dataTransfer.dropEffect = 'move' + }, + [sortMimeType], + ) + + const handleDrop = useCallback( + (event: React.DragEvent) => { + const fromIndex = parseSortIndexFromDataTransfer( + event.dataTransfer, + listId, + ) + if (fromIndex === null) { + return + } + + event.preventDefault() + event.stopPropagation() + + if (fromIndex !== index) { + onReorder(fromIndex, index) + } + }, + [index, listId, onReorder], + ) + + return ( + + + + + {children} + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderHeaderLabel.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderHeaderLabel.tsx new file mode 100644 index 0000000000..becdc7b9e0 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderHeaderLabel.tsx @@ -0,0 +1,65 @@ +import React from 'react' +import styled from 'styled-components' + +import { RiTooltip } from 'uiSrc/components' +import { EmptyButton } from 'uiSrc/components/base/forms/buttons' +import { Text } from 'uiSrc/components/base/text' +import { Row } from 'uiSrc/components/base/layout/flex' + +import { EyeIcon, EyeOffIcon } from './EyeIcon' +import { useValueDecoder } from './ValueDecoderProvider' +import { VALUE_DECODER_TEST_ID } from './constants' + +const ToggleButton = styled(EmptyButton)<{ $active?: boolean }>` + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 24px; + min-height: 24px; + padding: 0; + color: ${({ theme, $active }) => + $active + ? theme.components.typography.colors.primary + : theme.components.typography.colors.secondary}; +` + +export interface ValueDecoderHeaderLabelProps { + label?: string +} + +export const ValueDecoderHeaderLabel = ({ + label = 'Value', +}: ValueDecoderHeaderLabelProps) => { + const { hasMatchingRule, isDecodeEnabled, toggleDecodeEnabled } = + useValueDecoder() + + if (!hasMatchingRule) { + return <>{label} + } + + return ( + + + {label} + + + + {isDecodeEnabled ? : } + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.styles.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.styles.ts new file mode 100644 index 0000000000..580b230c8c --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.styles.ts @@ -0,0 +1,243 @@ +import React from 'react' +import styled from 'styled-components' +import { Modal } from 'uiSrc/components/base/display/modal' + +export const ModalContent = styled(Modal.Content.Compose)` + width: ${({ theme }) => + `calc(100vw - ${theme.core.space.space800} - ${theme.core.space.space150})`}; + min-width: ${({ theme }) => `calc(${theme.core.space.space500} * 15)`}; + max-width: ${({ theme }) => + `calc(100vw - ${theme.core.space.space800} - ${theme.core.space.space150})`}; + max-height: ${({ theme }) => + `calc(100vh - ${theme.core.space.space800} - ${theme.core.space.space150})`}; +` + +export const ModalBody = styled(Modal.Content.Body)` + flex: 1; + min-height: 0; + overflow-y: auto; +` + +export const FieldTableHeader = styled.div` + display: grid; + grid-template-columns: 1.2fr 1fr 1.4fr auto; + gap: ${({ theme }) => theme.core.space.space100}; + padding: ${({ theme }) => theme.core.space.space100}; + padding-left: calc( + ${({ theme }) => theme.core.space.space100} + 1.2rem + + ${({ theme }) => theme.core.space.space050} + ); + color: ${({ theme }) => theme.components.typography.colors.secondary}; + font-weight: 600; +` + +export const FieldRowGrid = styled.div` + display: grid; + grid-template-columns: 1.2fr 1fr 1.4fr auto; + gap: ${({ theme }) => theme.core.space.space100}; + align-items: center; + flex: 1; + min-width: 0; +` + +export const DragHandle = styled.div<{ + children?: React.ReactNode + draggable?: boolean + onDragStart?: React.DragEventHandler +}>` + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.2rem; + flex-shrink: 0; + opacity: 0; + cursor: grab; + color: ${({ theme }) => theme.components.typography.colors.secondary}; + + &:active { + cursor: grabbing; + } +` + +export const SortableRow = styled.div<{ + children?: React.ReactNode + onDragOver?: React.DragEventHandler + onDrop?: React.DragEventHandler +}>` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space050}; + padding: ${({ theme }) => theme.core.space.space100}; + border-top: 1px solid ${({ theme }) => theme.semantic.color.border.neutral400}; + + &:hover ${DragHandle} { + opacity: 1; + } +` + +export const SortableContent = styled.div` + flex: 1; + min-width: 0; +` + +export const KeyPatternsWrapper = styled.div` + display: flex; + flex-direction: column; + gap: ${({ theme }) => theme.core.space.space050}; + + ${SortableRow}:first-of-type { + border-top: none; + padding-top: 0; + } +` + +export const KeyPatternRow = styled.div` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space050}; + flex: 1; + min-width: 0; +` + +export const KeyPatternLastRow = styled.div<{ + children?: React.ReactNode +}>` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space100}; + + ${SortableRow} { + flex: 1; + min-width: 0; + } +` + +export const SizeInputWrapper = styled.div` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space050}; + min-width: 120px; +` + +export const SizeSourceWrapper = styled.div` + display: flex; + flex-direction: column; + gap: ${({ theme }) => theme.core.space.space050}; + min-width: 180px; +` + +export const SizeUnit = styled.span<{ children?: React.ReactNode }>` + color: ${({ theme }) => theme.components.typography.colors.secondary}; + font-size: ${({ theme }) => theme.core.font.fontSize.s12}; + white-space: nowrap; +` + +export const RepeatBlock = styled.div<{ + $depth: number + children?: React.ReactNode +}>` + margin-top: ${({ theme }) => theme.core.space.space100}; + margin-bottom: ${({ theme }) => theme.core.space.space100}; + padding: ${({ theme }) => theme.core.space.space100}; + padding-left: ${({ theme, $depth }) => + `calc(${theme.core.space.space100} + ${$depth * 16}px)`}; + border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral400}; + border-radius: ${({ theme }) => theme.core.space.space100}; + background: ${({ theme }) => theme.semantic.color.background.neutral100}; + flex: 1; + min-width: 0; +` + +export const RepeatHeader = styled.div` + display: grid; + grid-template-columns: auto 1fr auto; + gap: ${({ theme }) => theme.core.space.space100}; + align-items: center; + margin-bottom: ${({ theme }) => theme.core.space.space100}; +` + +export const RowActions = styled.div` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space025}; + justify-content: flex-end; +` + +export const SchemaActions = styled.div` + display: flex; + gap: ${({ theme }) => theme.core.space.space050}; +` + +export const RepeatLabel = styled.span` + color: ${({ theme }) => theme.components.typography.colors.secondary}; + font-size: ${({ theme }) => theme.core.font.fontSize.s12}; + font-weight: 600; + white-space: nowrap; +` + +export const SelectOptionAnchor = styled.span<{ + $fullWidth?: boolean + children?: React.ReactNode +}>` + display: inline-flex; + align-items: center; + width: ${({ $fullWidth }) => ($fullWidth ? '100%' : 'auto')}; +` + +export const DecoderSection = styled.div<{ + $expanded: boolean + children?: React.ReactNode +}>` + border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral400}; + border-radius: ${({ theme }) => theme.core.space.space100}; + background: ${({ theme, $expanded }) => + $expanded + ? theme.semantic.color.background.neutral100 + : theme.semantic.color.background.neutral200}; +` + +export const DecoderHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + gap: ${({ theme }) => theme.core.space.space100}; + padding: ${({ theme }) => theme.core.space.space100}; +` + +export const DecoderSummaryButton = styled.button<{ + children?: React.ReactNode + type?: 'button' | 'submit' | 'reset' + onClick?: React.MouseEventHandler +}>` + display: inline-flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space100}; + flex: 1; + min-width: 0; + padding: 0; + border: 0; + background: transparent; + text-align: left; + cursor: pointer; + color: inherit; +` + +export const DecoderBody = styled.div` + display: flex; + flex-direction: column; + gap: ${({ theme }) => theme.core.space.space200}; + padding: 0 ${({ theme }) => theme.core.space.space100} + ${({ theme }) => theme.core.space.space100}; +` + +export const DecoderMatchBadge = styled.span<{ + $warning?: boolean + children?: React.ReactNode +}>` + color: ${({ theme, $warning }) => + $warning + ? theme.components.typography.colors.attention + : theme.components.typography.colors.informative}; + font-size: ${({ theme }) => theme.core.font.fontSize.s12}; + white-space: nowrap; +` diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.tsx new file mode 100644 index 0000000000..49a5b7093e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderModal.tsx @@ -0,0 +1,302 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react' + +import { Modal } from 'uiSrc/components/base/display' +import { Text } from 'uiSrc/components/base/text' +import { + PrimaryButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' +import { CancelIcon } from 'uiSrc/components/base/icons' +import { Row, Col } from 'uiSrc/components/base/layout/flex' +import { CopyButton } from 'uiSrc/components/copy-button/CopyButton' + +import { createEmptyDecoder, VALUE_DECODER_TEST_ID } from './constants' +import { DecoderEditor } from './DecoderEditor' +import { + parseDecodersFromClipboard, + serializeDecodersForClipboard, +} from './decoderClipboard' +import { areDecodersValid, getDecoderLabel, normalizeRule } from './schemaUtils' +import { ValueDecoderRule } from './types' +import { + findMatchingDecoderRule, + getDefaultKeyPattern, + matchKeyPattern, +} from './utils' +import * as S from './ValueDecoderModal.styles' + +export interface ValueDecoderModalConfig { + keyName: string +} + +export interface ValueDecoderModalProps { + isOpen: boolean + decoders: ValueDecoderRule[] + config: ValueDecoderModalConfig | null + onSave: (decoders: ValueDecoderRule[]) => void + onCancel: () => void +} + +const buildInitialDecoders = ( + decoders: ValueDecoderRule[], + keyName: string, +): ValueDecoderRule[] => { + const normalized = decoders.map(normalizeRule) + if (normalized.length > 0) { + return normalized + } + return [createEmptyDecoder(keyName ? getDefaultKeyPattern(keyName) : '')] +} + +export const ValueDecoderModal = ({ + isOpen, + decoders, + config, + onSave, + onCancel, +}: ValueDecoderModalProps) => { + const keyName = config?.keyName ?? '' + const [localDecoders, setLocalDecoders] = useState(() => + buildInitialDecoders(decoders, keyName), + ) + const [expandedId, setExpandedId] = useState(null) + const [pasteMessage, setPasteMessage] = useState(null) + + useEffect(() => { + if (!isOpen) { + return + } + + const initial = buildInitialDecoders(decoders, keyName) + setLocalDecoders(initial) + + const matched = keyName ? findMatchingDecoderRule(initial, keyName) : null + setExpandedId(matched?.id ?? initial[0]?.id ?? null) + }, [decoders, isOpen, keyName]) + + const isValid = useMemo( + () => areDecodersValid(localDecoders), + [localDecoders], + ) + + const handleAddDecoder = useCallback(() => { + const nextDecoder = createEmptyDecoder( + keyName ? getDefaultKeyPattern(keyName) : '', + ) + setLocalDecoders((current) => [...current, nextDecoder]) + setExpandedId(nextDecoder.id) + }, [keyName]) + + const handleUpdateDecoder = useCallback( + (decoderId: string, nextDecoder: ValueDecoderRule) => { + setLocalDecoders((current) => + current.map((decoder) => + decoder.id === decoderId ? nextDecoder : decoder, + ), + ) + }, + [], + ) + + const handleRemoveDecoder = useCallback((decoderId: string) => { + setLocalDecoders((current) => + current.filter((decoder) => decoder.id !== decoderId), + ) + setExpandedId((current) => (current === decoderId ? null : current)) + }, []) + + const importDecodersFromText = useCallback((text: string): boolean => { + const imported = parseDecodersFromClipboard(text) + + if (!imported?.length) { + setPasteMessage('No decoder configuration found in clipboard') + return false + } + + setLocalDecoders((current) => [...current, ...imported]) + setExpandedId(imported[imported.length - 1].id) + setPasteMessage( + imported.length === 1 + ? 'Pasted 1 decoder' + : `Pasted ${imported.length} decoders`, + ) + return true + }, []) + + const handlePasteFromClipboard = useCallback(async () => { + try { + const text = await navigator.clipboard.readText() + importDecodersFromText(text) + } catch { + setPasteMessage('Unable to read clipboard') + } + }, [importDecodersFromText]) + + useEffect(() => { + if (!pasteMessage) { + return undefined + } + + const timeout = setTimeout(() => { + setPasteMessage(null) + }, 2500) + + return () => clearTimeout(timeout) + }, [pasteMessage]) + + useEffect(() => { + if (!isOpen) { + return undefined + } + + const handlePaste = (event: ClipboardEvent) => { + const target = event.target + + if ( + target instanceof HTMLElement && + target.closest('input, textarea, [contenteditable="true"]') + ) { + return + } + + const text = event.clipboardData?.getData('text/plain') ?? '' + + if (importDecodersFromText(text)) { + event.preventDefault() + } + } + + document.addEventListener('paste', handlePaste) + + return () => { + document.removeEventListener('paste', handlePaste) + } + }, [importDecodersFromText, isOpen]) + + const handleSave = useCallback(() => { + if (!isValid) { + return + } + + onSave(localDecoders.map(normalizeRule)) + }, [isValid, localDecoders, onSave]) + + if (!isOpen) { + return null + } + + return ( + + + + + + + Value Decoders + + + + + + Decoders are shared across all hash keys in this database. Add + multiple decoders and key patterns; matching hash values can be + decoded in the Value Preview. Copy decoders as JSON and paste + them here or into another Redis Insight connection. + + + + Decoders + + {pasteMessage && ( + + {pasteMessage} + + )} + + + Paste + + + Add Decoder + + + + + + {localDecoders.map((decoder) => { + const normalized = normalizeRule(decoder) + const patternCount = normalized.keyPatterns.length + const summary = `${getDecoderLabel(decoder)} · ${patternCount} pattern${patternCount === 1 ? '' : 's'}` + + return ( + + setExpandedId((current) => + current === decoder.id ? null : decoder.id, + ) + } + onChange={(nextDecoder) => + handleUpdateDecoder(decoder.id, nextDecoder) + } + onRemove={() => handleRemoveDecoder(decoder.id)} + canRemove + summary={summary} + matchesCurrentKey={Boolean( + keyName && + normalized.keyPatterns.some((pattern) => + matchKeyPattern(pattern, keyName), + ), + )} + /> + ) + })} + + + } + /> + + + + + Cancel + + + Save + + + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderProvider.tsx b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderProvider.tsx new file mode 100644 index 0000000000..65ffdd7d1f --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/ValueDecoderProvider.tsx @@ -0,0 +1,135 @@ +import React, { + createContext, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react' + +import { useAppSelector } from 'uiSrc/slices/hooks' +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' +import { bufferToString } from 'uiSrc/utils' + +import { ValueDecoderModal, ValueDecoderModalConfig } from './ValueDecoderModal' +import { normalizeRule } from './schemaUtils' +import { ValueDecoderRule } from './types' +import { + getValueDecoderRules, + setValueDecoderRules, +} from './valueDecoderStorage' +import { findMatchingDecoderRule } from './utils' + +export interface ValueDecoderContextValue { + decoders: ValueDecoderRule[] + matchedRule: ValueDecoderRule | null + isDecodeEnabled: boolean + hasMatchingRule: boolean + openValueDecoderModal: () => void + toggleDecodeEnabled: () => void + setDecodeEnabled: (enabled: boolean) => void +} + +const ValueDecoderContext = createContext(null) + +const NOOP_CONTEXT: ValueDecoderContextValue = { + decoders: [], + matchedRule: null, + isDecodeEnabled: false, + hasMatchingRule: false, + openValueDecoderModal: () => {}, + toggleDecodeEnabled: () => {}, + setDecodeEnabled: () => {}, +} + +export const useValueDecoder = () => { + const ctx = useContext(ValueDecoderContext) + return ctx ?? NOOP_CONTEXT +} + +export const ValueDecoderProvider = ({ + children, + keyProp, +}: { + children: React.ReactNode + keyProp: RedisResponseBuffer | null +}) => { + const { id: instanceId = '' } = useAppSelector(connectedInstanceSelector) + const [decoders, setDecoders] = useState(() => + getValueDecoderRules(instanceId), + ) + const [modalConfig, setModalConfig] = + useState(null) + const [isDecodeEnabled, setIsDecodeEnabled] = useState(false) + + const keyName = keyProp ? bufferToString(keyProp) : '' + const matchedRule = useMemo( + () => (keyName ? findMatchingDecoderRule(decoders, keyName) : null), + [decoders, keyName], + ) + + useEffect(() => { + setDecoders(getValueDecoderRules(instanceId)) + setModalConfig(null) + setIsDecodeEnabled(false) + }, [instanceId]) + + useEffect(() => { + setIsDecodeEnabled(false) + }, [keyName, matchedRule?.id ?? null]) + + const openValueDecoderModal = useCallback(() => { + setModalConfig({ keyName }) + }, [keyName]) + + const handleSaveDecoders = useCallback( + (nextDecoders: ValueDecoderRule[]) => { + const normalized = nextDecoders.map(normalizeRule) + setDecoders(normalized) + setValueDecoderRules(instanceId, normalized) + setModalConfig(null) + }, + [instanceId], + ) + + const handleCancelModal = useCallback(() => { + setModalConfig(null) + }, []) + + const toggleDecodeEnabled = useCallback(() => { + setIsDecodeEnabled((current) => !current) + }, []) + + const contextValue = useMemo( + () => ({ + decoders, + matchedRule, + isDecodeEnabled, + hasMatchingRule: matchedRule !== null, + openValueDecoderModal, + toggleDecodeEnabled, + setDecodeEnabled: setIsDecodeEnabled, + }), + [ + decoders, + isDecodeEnabled, + matchedRule, + openValueDecoderModal, + toggleDecodeEnabled, + ], + ) + + return ( + + {children} + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/constants.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/constants.ts new file mode 100644 index 0000000000..a182c19b9c --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/constants.ts @@ -0,0 +1,101 @@ +import { + BinaryFieldDefinition, + RepeatBlockDefinition, + SchemaNode, + ValueDecoderRule, + DecoderType, +} from './types' + +export const VALUE_DECODER_TEST_ID = 'value-decoder' + +export const MAX_REPEAT_DECODE_ITERATIONS = 1000 + +export const BINARY_DATA_TYPES = [ + 'uint8', + 'int8', + 'boolean', + 'uint16le', + 'uint16be', + 'int16le', + 'int16be', + 'uint32le', + 'uint32be', + 'int32le', + 'int32be', + 'floatle', + 'floatbe', + 'bigint64le', + 'bigint64be', + 'biguint64le', + 'biguint64be', + 'doublele', + 'doublebe', + 'string', + 'hex', +] as const + +export type BinaryDataType = (typeof BINARY_DATA_TYPES)[number] + +export const NUMERIC_COUNT_DATA_TYPES = [ + 'uint8', + 'int8', + 'uint16le', + 'uint16be', + 'int16le', + 'int16be', + 'uint32le', + 'uint32be', + 'int32le', + 'int32be', + 'bigint64le', + 'bigint64be', + 'biguint64le', + 'biguint64be', +] as const + +export const SIZE_SOURCE_OPTIONS = [ + { value: 'fixed', label: 'Fixed bytes' }, + { value: 'field', label: 'From field' }, +] + +export const DECODER_TYPE_OPTIONS = [ + { value: DecoderType.Binary, content: 'Binary Decoder' }, +] + +let fieldIdCounter = 0 + +const nextId = (prefix: string) => { + fieldIdCounter += 1 + return `${prefix}-${fieldIdCounter}-${Date.now()}` +} + +export const createEmptyField = (): BinaryFieldDefinition => ({ + id: nextId('field'), + kind: 'field', + name: '', + dataType: 'uint8', + size: 1, + sizeSource: 'fixed', +}) + +export const createEmptyRepeatBlock = (): RepeatBlockDefinition => ({ + id: nextId('repeat'), + kind: 'repeat', + name: '', + countFieldRef: '', + fields: [createEmptyField()], +}) + +export const createEmptyDecoder = (keyName = ''): ValueDecoderRule => ({ + id: nextId('decoder'), + name: '', + keyPatterns: keyName ? [keyName] : [''], + decoderType: DecoderType.Binary, + schema: [createEmptyField()], +}) + +export const isRepeatNode = (node: SchemaNode): node is RepeatBlockDefinition => + node.kind === 'repeat' + +export const isFieldNode = (node: SchemaNode): node is BinaryFieldDefinition => + node.kind === 'field' || !('kind' in node) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.spec.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.spec.ts new file mode 100644 index 0000000000..e2ea37a72a --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.spec.ts @@ -0,0 +1,101 @@ +import { createEmptyDecoder } from './constants' +import { DecoderType } from './types' +import { + cloneDecoderRule, + parseDecodersFromClipboard, + serializeDecoderForClipboard, + serializeDecodersForClipboard, + VALUE_DECODER_CLIPBOARD_TYPE, +} from './decoderClipboard' + +describe('decoderClipboard', () => { + const sampleDecoder = () => { + const countField = { + id: 'field-count', + kind: 'field' as const, + name: 'count', + dataType: 'uint8', + size: 1, + sizeSource: 'fixed' as const, + } + + return { + id: 'decoder-1', + name: 'Chunk decoder', + keyPatterns: ['room:*'], + decoderType: DecoderType.Binary, + schema: [ + countField, + { + id: 'repeat-1', + kind: 'repeat' as const, + name: 'items', + countFieldRef: 'field-count', + fields: [ + { + id: 'field-value', + kind: 'field' as const, + name: 'value', + dataType: 'uint16le', + size: 2, + sizeSource: 'fixed' as const, + }, + ], + }, + ], + } + } + + it('serializes decoders with a clipboard envelope', () => { + const decoder = sampleDecoder() + const serialized = serializeDecoderForClipboard(decoder) + const parsed = JSON.parse(serialized) + + expect(parsed.type).toBe(VALUE_DECODER_CLIPBOARD_TYPE) + expect(parsed.decoders).toHaveLength(1) + expect(parsed.decoders[0].name).toBe('Chunk decoder') + }) + + it('clones a decoder with fresh ids and remapped schema refs', () => { + const cloned = cloneDecoderRule(sampleDecoder()) + + expect(cloned.id).not.toBe('decoder-1') + expect(cloned.schema[1].kind).toBe('repeat') + if (cloned.schema[1].kind === 'repeat') { + expect(cloned.schema[1].countFieldRef).toBe(cloned.schema[0].id) + } + }) + + it('parses a clipboard payload and returns cloned decoders', () => { + const decoder = sampleDecoder() + const text = serializeDecodersForClipboard([decoder]) + const parsed = parseDecodersFromClipboard(text) + + expect(parsed).toHaveLength(1) + expect(parsed?.[0].name).toBe('Chunk decoder') + expect(parsed?.[0].id).not.toBe(decoder.id) + }) + + it('parses a single decoder object without an envelope', () => { + const decoder = sampleDecoder() + const parsed = parseDecodersFromClipboard(JSON.stringify(decoder)) + + expect(parsed).toHaveLength(1) + expect(parsed?.[0].keyPatterns).toEqual(['room:*']) + }) + + it('returns null for invalid clipboard content', () => { + expect(parseDecodersFromClipboard('not json')).toBeNull() + expect(parseDecodersFromClipboard('{"foo":"bar"}')).toBeNull() + expect(parseDecodersFromClipboard('')).toBeNull() + }) + + it('normalizes legacy decoders on import', () => { + const parsed = parseDecodersFromClipboard( + JSON.stringify(createEmptyDecoder('user:*')), + ) + + expect(parsed).toHaveLength(1) + expect(parsed?.[0].keyPatterns).toEqual(['user:*']) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.ts new file mode 100644 index 0000000000..8cc6c114b0 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/decoderClipboard.ts @@ -0,0 +1,161 @@ +import { isObjectLike } from 'lodash' + +import { isFieldNode, isRepeatNode } from './constants' +import { normalizeRule } from './schemaUtils' +import { SchemaNode, ValueDecoderRule } from './types' + +export const VALUE_DECODER_CLIPBOARD_TYPE = 'redisinsight/value-decoder' +export const VALUE_DECODER_CLIPBOARD_VERSION = 1 + +export interface ValueDecoderClipboardPayload { + type: typeof VALUE_DECODER_CLIPBOARD_TYPE + version: typeof VALUE_DECODER_CLIPBOARD_VERSION + decoders: ValueDecoderRule[] +} + +let idCounter = 0 + +const createId = (prefix: string) => { + idCounter += 1 + return `${prefix}-${idCounter}-${Date.now()}` +} + +const collectSchemaIds = ( + nodes: SchemaNode[], + idMap: Map, +): void => { + nodes.forEach((node) => { + if (!idMap.has(node.id)) { + idMap.set(node.id, createId(isRepeatNode(node) ? 'repeat' : 'field')) + } + + if (isRepeatNode(node)) { + collectSchemaIds(node.fields, idMap) + } + }) +} + +const remapSchemaIds = ( + nodes: SchemaNode[], + idMap: Map, +): SchemaNode[] => + nodes.map((node) => { + if (isFieldNode(node)) { + return { + ...node, + id: idMap.get(node.id) ?? node.id, + kind: 'field', + sizeFieldRef: node.sizeFieldRef + ? (idMap.get(node.sizeFieldRef) ?? node.sizeFieldRef) + : undefined, + } + } + + return { + ...node, + id: idMap.get(node.id) ?? node.id, + kind: 'repeat', + countFieldRef: idMap.get(node.countFieldRef) ?? node.countFieldRef, + fields: remapSchemaIds(node.fields, idMap), + } + }) + +export const cloneDecoderRule = (rule: ValueDecoderRule): ValueDecoderRule => { + const normalized = normalizeRule(rule) + const idMap = new Map() + + collectSchemaIds(normalized.schema, idMap) + + return { + ...normalized, + id: createId('decoder'), + schema: remapSchemaIds(normalized.schema, idMap), + } +} + +const toClipboardDecoder = (decoder: ValueDecoderRule): ValueDecoderRule => + normalizeRule(decoder) + +export const serializeDecodersForClipboard = ( + decoders: ValueDecoderRule[], +): string => { + const payload: ValueDecoderClipboardPayload = { + type: VALUE_DECODER_CLIPBOARD_TYPE, + version: VALUE_DECODER_CLIPBOARD_VERSION, + decoders: decoders.map(toClipboardDecoder), + } + + return JSON.stringify(payload, null, 2) +} + +export const serializeDecoderForClipboard = ( + decoder: ValueDecoderRule, +): string => serializeDecodersForClipboard([decoder]) + +const isRecordLike = (value: unknown): value is Record => + isObjectLike(value) + +const isDecoderLike = (value: unknown): value is Record => { + if (!isRecordLike(value)) { + return false + } + + return ( + Array.isArray(value.keyPatterns) || + typeof value.keyPattern === 'string' || + Array.isArray(value.schema) || + Array.isArray(value.fields) + ) +} + +const parseDecoderCandidates = (parsed: unknown): unknown[] => { + if (Array.isArray(parsed)) { + return parsed + } + + if (!isRecordLike(parsed)) { + return [] + } + + if ( + parsed.type === VALUE_DECODER_CLIPBOARD_TYPE && + Array.isArray(parsed.decoders) + ) { + return parsed.decoders + } + + if (isDecoderLike(parsed)) { + return [parsed] + } + + return [] +} + +export const parseDecodersFromClipboard = ( + text: string, +): ValueDecoderRule[] | null => { + const trimmed = text.trim() + + if (!trimmed) { + return null + } + + try { + const parsed = JSON.parse(trimmed) as unknown + const candidates = parseDecoderCandidates(parsed) + + if (!candidates.length) { + return null + } + + const decoders = candidates + .filter(isDecoderLike) + .map((candidate) => + cloneDecoderRule(candidate as unknown as ValueDecoderRule), + ) + + return decoders.length > 0 ? decoders : null + } catch { + return null + } +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/descriptions.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/descriptions.ts new file mode 100644 index 0000000000..4a42ad3f94 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/descriptions.ts @@ -0,0 +1,34 @@ +import { DecoderType } from './types' +import { BinaryDataType } from './constants' + +export const KEY_PATTERN_FIELD_DESCRIPTION = + 'Add one or more glob patterns to match Redis keys (e.g. user:items:*, room:chunk-state:*). A decoder applies when any pattern matches.' + +export const DECODER_TYPE_DESCRIPTIONS: Record = { + [DecoderType.Binary]: + 'Parses the value as a sequential binary structure using the field layout defined below.', +} + +export const DATA_TYPE_DESCRIPTIONS: Record = { + uint8: 'Unsigned 8-bit integer (1 byte).', + int8: 'Signed 8-bit integer (1 byte).', + boolean: 'Boolean stored as 1 byte (0 = false, non-zero = true).', + uint16le: 'Unsigned 16-bit integer, little-endian (2 bytes).', + uint16be: 'Unsigned 16-bit integer, big-endian (2 bytes).', + int16le: 'Signed 16-bit integer, little-endian (2 bytes).', + int16be: 'Signed 16-bit integer, big-endian (2 bytes).', + uint32le: 'Unsigned 32-bit integer, little-endian (4 bytes).', + uint32be: 'Unsigned 32-bit integer, big-endian (4 bytes).', + int32le: 'Signed 32-bit integer, little-endian (4 bytes).', + int32be: 'Signed 32-bit integer, big-endian (4 bytes).', + floatle: '32-bit IEEE 754 float, little-endian (4 bytes).', + floatbe: '32-bit IEEE 754 float, big-endian (4 bytes).', + bigint64le: 'Signed 64-bit integer, little-endian (8 bytes).', + bigint64be: 'Signed 64-bit integer, big-endian (8 bytes).', + biguint64le: 'Unsigned 64-bit integer, little-endian (8 bytes).', + biguint64be: 'Unsigned 64-bit integer, big-endian (8 bytes).', + doublele: '64-bit IEEE 754 double, little-endian (8 bytes).', + doublebe: '64-bit IEEE 754 double, big-endian (8 bytes).', + string: 'UTF-8 string with a custom byte length.', + hex: 'Raw bytes rendered as uppercase hexadecimal bytes separated by spaces.', +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/index.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/index.ts new file mode 100644 index 0000000000..ea24d8ad96 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/index.ts @@ -0,0 +1,26 @@ +export { ConfigValueDecoderButton } from './ConfigValueDecoderButton' +export { DecodedValueDisplay } from './DecodedValueDisplay' +export { ValueDecoderHeaderLabel } from './ValueDecoderHeaderLabel' +export { ValueDecoderProvider, useValueDecoder } from './ValueDecoderProvider' +export { ValueDecoderModal } from './ValueDecoderModal' +export type { + ValueDecoderRule, + BinaryFieldDefinition, + SchemaNode, + RepeatBlockDefinition, + ParsedBinaryNode, + ParsedBinaryField, + ParsedBinaryGroup, +} from './types' +export { + findMatchingDecoderRule, + formatParsedFieldLine, + formatParsedFields, + formatParsedFieldsInline, + getDefaultKeyPattern, + getFixedSize, + getSizeUnit, + matchKeyPattern, + parseBinaryBuffer, + parseBufferWithRule, +} from './utils' diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/reorderList.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/reorderList.ts new file mode 100644 index 0000000000..68f9ed9986 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/reorderList.ts @@ -0,0 +1,20 @@ +export const reorderList = ( + items: T[], + fromIndex: number, + toIndex: number, +): T[] => { + if ( + fromIndex === toIndex || + fromIndex < 0 || + toIndex < 0 || + fromIndex >= items.length || + toIndex >= items.length + ) { + return items + } + + const next = [...items] + const [item] = next.splice(fromIndex, 1) + next.splice(toIndex, 0, item) + return next +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.spec.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.spec.ts new file mode 100644 index 0000000000..9dee96bd73 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.spec.ts @@ -0,0 +1,137 @@ +import { + createEmptyDecoder, + createEmptyField, + createEmptyRepeatBlock, +} from './constants' +import { + isDecoderValid, + isSchemaValid, + areDecodersValid, + normalizeRule, + toNumericOptions, +} from './schemaUtils' +import { BinaryFieldDefinition } from './types' + +describe('schemaUtils validation', () => { + const validField = (): BinaryFieldDefinition => ({ + ...createEmptyField(), + name: 'flag', + dataType: 'uint8', + size: 1, + }) + + describe('toNumericOptions', () => { + it('labels unique names with type only', () => { + expect( + toNumericOptions([ + { id: 'a', name: 'len', dataType: 'uint8' }, + { id: 'b', name: 'count', dataType: 'uint16le' }, + ]), + ).toEqual([ + { value: 'a', label: 'len (uint8)' }, + { value: 'b', label: 'count (uint16le)' }, + ]) + }) + + it('disambiguates duplicate names with id', () => { + expect( + toNumericOptions([ + { id: 'a', name: 'len', dataType: 'uint8' }, + { id: 'b', name: 'len', dataType: 'uint16le' }, + ]), + ).toEqual([ + { value: 'a', label: 'len (uint8) · a' }, + { value: 'b', label: 'len (uint16le) · b' }, + ]) + }) + }) + + describe('normalizeRule', () => { + it('preserves spaces in key patterns while removing blank rows', () => { + const decoder = createEmptyDecoder(' user ') + decoder.keyPatterns = [' user ', 'room:*', ''] + + expect(normalizeRule(decoder).keyPatterns).toEqual([' user ', 'room:*']) + }) + + it('migrates legacy numeric field name references to ids', () => { + const lenField = { + ...createEmptyField(), + name: 'len', + dataType: 'uint16le', + size: 2, + } + const textField = { + ...createEmptyField(), + name: 'text', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: 'len', + } satisfies BinaryFieldDefinition + + const normalized = normalizeRule({ + ...createEmptyDecoder(), + schema: [lenField, textField], + }) + + expect(normalized.schema[1]).toMatchObject({ + sizeFieldRef: lenField.id, + }) + }) + }) + + describe('isSchemaValid', () => { + it('requires every top-level node to be complete', () => { + expect(isSchemaValid([validField()])).toBe(true) + expect(isSchemaValid([validField(), createEmptyField()])).toBe(false) + expect(isSchemaValid([])).toBe(false) + }) + + it('requires every repeat child to be complete', () => { + const countField = { + ...createEmptyField(), + name: 'count', + dataType: 'uint16le', + size: 2, + } + const repeat = createEmptyRepeatBlock() + repeat.countFieldRef = countField.id + repeat.fields = [validField(), createEmptyField()] + + expect(isSchemaValid([countField, repeat])).toBe(false) + }) + }) + + describe('isDecoderValid', () => { + it('rejects decoders with incomplete schema rows', () => { + const decoder = createEmptyDecoder('room:state:*') + decoder.keyPatterns = ['room:state:*'] + decoder.schema = [validField(), createEmptyField()] + + expect(isDecoderValid(decoder)).toBe(false) + }) + + it('rejects fractional fixed byte sizes', () => { + const decoder = createEmptyDecoder('room:state:*') + decoder.keyPatterns = ['room:state:*'] + decoder.schema = [ + { + ...createEmptyField(), + name: 'payload', + dataType: 'string', + size: 1.5, + sizeSource: 'fixed', + }, + ] + + expect(isDecoderValid(decoder)).toBe(false) + }) + }) + + describe('areDecodersValid', () => { + it('allows saving an empty decoder list', () => { + expect(areDecodersValid([])).toBe(true) + }) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.ts new file mode 100644 index 0000000000..12beb0cdff --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/schemaUtils.ts @@ -0,0 +1,360 @@ +import { + NUMERIC_COUNT_DATA_TYPES, + createEmptyField, + isFieldNode, + isRepeatNode, +} from './constants' +import { + BinaryFieldDefinition, + FieldSizeSource, + RepeatBlockDefinition, + SchemaNode, + ValueDecoderRule, +} from './types' + +export interface NumericFieldRef { + id: string + name: string + dataType: string +} + +export type NumericFieldOption = { + value: string + label: string +} + +/** Select options for numeric field refs; disambiguates duplicate names with id. */ +export const toNumericOptions = ( + fields: NumericFieldRef[], +): NumericFieldOption[] => { + const nameCounts = fields.reduce>((counts, item) => { + counts[item.name] = (counts[item.name] ?? 0) + 1 + return counts + }, {}) + + return fields.map((item) => ({ + value: item.id, + label: + nameCounts[item.name] > 1 + ? `${item.name} (${item.dataType}) · ${item.id}` + : `${item.name} (${item.dataType})`, + })) +} + +export const isNumericCountType = (dataType: string): boolean => + NUMERIC_COUNT_DATA_TYPES.includes( + dataType as (typeof NUMERIC_COUNT_DATA_TYPES)[number], + ) + +export const normalizeFieldNode = ( + field: Partial & { id: string }, +): BinaryFieldDefinition => ({ + id: field.id, + kind: 'field', + name: field.name ?? '', + dataType: field.dataType ?? 'uint8', + size: field.size ?? '', + sizeSource: field.sizeSource ?? 'fixed', + sizeFieldRef: field.sizeFieldRef, +}) + +export const normalizeSchemaNode = (node: SchemaNode): SchemaNode => { + if (isRepeatNode(node)) { + return { + ...node, + kind: 'repeat', + fields: (node.fields ?? []).map(normalizeSchemaNode), + } + } + + return normalizeFieldNode(node as BinaryFieldDefinition) +} + +const normalizeKeyPatterns = (patterns: string[]): string[] => + patterns.filter((pattern) => pattern !== '') + +export const getDecoderLabel = (decoder: ValueDecoderRule): string => { + const normalized = normalizeRule(decoder) + if (normalized.name.trim()) { + return normalized.name.trim() + } + return normalized.keyPatterns[0] ?? 'Untitled decoder' +} + +export const getPriorNumericFields = ( + schema: SchemaNode[], + beforeNodeId: string, +): NumericFieldRef[] => { + const result: NumericFieldRef[] = [] + + const walk = (nodes: SchemaNode[]): boolean => { + for (const node of nodes) { + if (node.id === beforeNodeId) { + return true + } + + if (isFieldNode(node)) { + if (node.name.trim() && isNumericCountType(node.dataType)) { + result.push({ + id: node.id, + name: node.name.trim(), + dataType: node.dataType, + }) + } + } else if (isRepeatNode(node)) { + if (walk(node.fields)) { + return true + } + } + } + return false + } + + walk(schema) + return result +} + +export const getPriorNumericFieldsForRepeat = ( + schema: SchemaNode[], + repeatId: string, +): NumericFieldRef[] => getPriorNumericFields(schema, repeatId) + +export const getPriorNumericFieldsInScope = ( + priorFields: NumericFieldRef[], + siblingNodes: SchemaNode[], + beforeIndex: number, +): NumericFieldRef[] => { + const siblings = siblingNodes.slice(0, beforeIndex).flatMap((node) => { + if (!isFieldNode(node) || !node.name.trim()) { + return [] + } + if (!isNumericCountType(node.dataType)) { + return [] + } + return [ + { + id: node.id, + name: node.name.trim(), + dataType: node.dataType, + }, + ] + }) + + return [...priorFields, ...siblings] +} + +const resolveNumericFieldRef = ( + ref: string | undefined, + priorFields: NumericFieldRef[], +): string | undefined => { + if (!ref) { + return ref + } + + if (priorFields.some((item) => item.id === ref)) { + return ref + } + + const trimmedRef = ref.trim() + const matchesByName = priorFields.filter((item) => item.name === trimmedRef) + if (matchesByName.length === 1) { + return matchesByName[0].id + } + + return ref +} + +const normalizeSchemaRefs = ( + nodes: SchemaNode[], + priorFields: NumericFieldRef[] = [], +): SchemaNode[] => + nodes.map((node, index) => { + const scopeNumeric = getPriorNumericFieldsInScope(priorFields, nodes, index) + + if (isFieldNode(node)) { + if (node.sizeSource !== 'field') { + return node + } + + return { + ...node, + sizeFieldRef: resolveNumericFieldRef(node.sizeFieldRef, scopeNumeric), + } + } + + if (isRepeatNode(node)) { + return { + ...node, + countFieldRef: + resolveNumericFieldRef(node.countFieldRef, scopeNumeric) ?? '', + fields: normalizeSchemaRefs(node.fields, scopeNumeric), + } + } + + return node + }) + +export const normalizeRule = (rule: ValueDecoderRule): ValueDecoderRule => { + const schemaNodes = + (rule.schema?.length ?? 0) > 0 + ? rule.schema!.map(normalizeSchemaNode) + : (rule.fields ?? []).map((field) => + normalizeFieldNode({ + ...field, + id: field.id ?? `field-legacy-${field.name}`, + }), + ) + const schema = normalizeSchemaRefs(schemaNodes) + + const keyPatterns = + (rule.keyPatterns?.length ?? 0) > 0 + ? normalizeKeyPatterns(rule.keyPatterns) + : rule.keyPattern != null && rule.keyPattern !== '' + ? [rule.keyPattern] + : [] + + return { + ...rule, + name: rule.name ?? '', + keyPatterns, + schema, + keyPattern: undefined, + fields: undefined, + } +} + +const isPositiveIntegerSize = (size: number | ''): boolean => { + const numericSize = Number(size) + return Number.isInteger(numericSize) && numericSize > 0 +} + +const isFieldValid = ( + field: BinaryFieldDefinition, + priorNumeric: NumericFieldRef[], +): boolean => { + if (!field.name.trim()) { + return false + } + + if (field.dataType === 'string' || field.dataType === 'hex') { + if (field.sizeSource === 'field') { + return Boolean( + field.sizeFieldRef && + priorNumeric.some((item) => item.id === field.sizeFieldRef), + ) + } + return isPositiveIntegerSize(field.size) + } + + return isPositiveIntegerSize(field.size) +} + +const isRepeatValid = ( + repeat: RepeatBlockDefinition, + priorNumeric: NumericFieldRef[], +): boolean => { + if (!repeat.countFieldRef) { + return false + } + + if (!priorNumeric.some((item) => item.id === repeat.countFieldRef)) { + return false + } + + return ( + repeat.fields.length > 0 && + repeat.fields.every((child, childIndex) => + isSchemaNodeValid(child, priorNumeric, repeat.fields, childIndex), + ) + ) +} + +export const isSchemaNodeValid = ( + node: SchemaNode, + priorNumeric: NumericFieldRef[], + siblingNodes: SchemaNode[], + index: number, +): boolean => { + const scopeNumeric = getPriorNumericFieldsInScope( + priorNumeric, + siblingNodes, + index, + ) + + if (isFieldNode(node)) { + return isFieldValid(node, scopeNumeric) + } + + if (isRepeatNode(node)) { + return isRepeatValid(node, scopeNumeric) + } + + return false +} + +export const isSchemaValid = (schema: SchemaNode[]): boolean => + schema.length > 0 && + schema.every((node, index) => isSchemaNodeValid(node, [], schema, index)) + +export const isDecoderValid = (decoder: ValueDecoderRule): boolean => { + const normalized = normalizeRule(decoder) + return normalized.keyPatterns.length > 0 && isSchemaValid(normalized.schema) +} + +export const areDecodersValid = (decoders: ValueDecoderRule[]): boolean => + decoders.length === 0 || decoders.every(isDecoderValid) + +export const updateSchemaNode = ( + nodes: SchemaNode[], + nodeId: string, + updater: (node: SchemaNode) => SchemaNode, +): SchemaNode[] => + nodes.map((node) => { + if (node.id === nodeId) { + return updater(node) + } + if (isRepeatNode(node)) { + return { + ...node, + fields: updateSchemaNode(node.fields, nodeId, updater), + } + } + return node + }) + +export const removeSchemaNode = ( + nodes: SchemaNode[], + nodeId: string, +): SchemaNode[] => { + const filtered = nodes.filter((node) => node.id !== nodeId) + + if (filtered.length !== nodes.length) { + return filtered.length > 0 ? filtered : [createEmptyField()] + } + + return nodes.map((node) => { + if (isRepeatNode(node)) { + const nextFields = removeSchemaNode(node.fields, nodeId) + return { ...node, fields: nextFields } + } + return node + }) +} + +export const insertSchemaNodeAt = ( + nodes: SchemaNode[], + index: number, + newNode: SchemaNode, +): SchemaNode[] => { + const next = [...nodes] + next.splice(index, 0, newNode) + return next +} + +export const isCustomSizeType = (dataType: string): boolean => + dataType === 'string' || dataType === 'hex' + +export const resolveSizeSource = ( + field: BinaryFieldDefinition, +): FieldSizeSource => + isCustomSizeType(field.dataType) ? (field.sizeSource ?? 'fixed') : 'fixed' diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/types.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/types.ts new file mode 100644 index 0000000000..76285d3110 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/types.ts @@ -0,0 +1,54 @@ +export enum DecoderType { + Binary = 'binary', +} + +export type FieldSizeSource = 'fixed' | 'field' + +export interface BinaryFieldDefinition { + id: string + kind: 'field' + name: string + dataType: string + size: number | '' + sizeSource?: FieldSizeSource + /** Field id of a prior numeric field used as dynamic byte length */ + sizeFieldRef?: string +} + +export interface RepeatBlockDefinition { + id: string + kind: 'repeat' + name: string + /** Field id of a prior numeric field used as repeat count */ + countFieldRef: string + fields: SchemaNode[] +} + +export type SchemaNode = BinaryFieldDefinition | RepeatBlockDefinition + +export interface ValueDecoderRule { + id: string + name: string + keyPatterns: string[] + decoderType: DecoderType + schema: SchemaNode[] + /** @deprecated Legacy single pattern — migrated to keyPatterns on load */ + keyPattern?: string + /** @deprecated Legacy flat fields — migrated to schema on load */ + fields?: Omit[] +} + +export interface ParsedBinaryField { + kind: 'field' + name: string + size: number + value: string +} + +export interface ParsedBinaryGroup { + kind: 'group' + label: string + children: ParsedBinaryNode[] +} + +export type ParsedBinaryNode = ParsedBinaryField | ParsedBinaryGroup diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.spec.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.spec.ts new file mode 100644 index 0000000000..df6b9597e7 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.spec.ts @@ -0,0 +1,282 @@ +import { act, renderHook } from '@testing-library/react-hooks' + +import { + createEmptyField, + createEmptyRepeatBlock, + isFieldNode, + isRepeatNode, +} from './constants' +import { BinaryFieldDefinition, SchemaNode } from './types' +import { + applyAddField, + applyAddRepeat, + applyFieldChange, + applyRemoveNode, + applyReorder, + applyRepeatChange, + applyRepeatFieldsChange, + useSchemaEditor, +} from './useSchemaEditor' + +const field = ( + overrides: Partial & { id: string }, +): BinaryFieldDefinition => ({ + ...createEmptyField(), + ...overrides, + kind: 'field', +}) + +describe('schema editor mutations', () => { + describe('applyAddField / applyAddRepeat', () => { + it('appends an empty field', () => { + const nodes = [field({ id: 'a', name: 'a' })] + const next = applyAddField(nodes) + + expect(next).toHaveLength(2) + expect(next[0]).toBe(nodes[0]) + expect(isFieldNode(next[1])).toBe(true) + expect(next[1]).toMatchObject({ name: '', dataType: 'uint8', size: 1 }) + }) + + it('appends an empty repeat block with one child field', () => { + const nodes = [field({ id: 'a', name: 'a' })] + const next = applyAddRepeat(nodes) + + expect(next).toHaveLength(2) + expect(isRepeatNode(next[1])).toBe(true) + if (isRepeatNode(next[1])) { + expect(next[1].countFieldRef).toBe('') + expect(next[1].fields).toHaveLength(1) + expect(isFieldNode(next[1].fields[0])).toBe(true) + } + }) + }) + + describe('applyRemoveNode', () => { + it('removes a top-level node', () => { + const a = field({ id: 'a', name: 'a' }) + const b = field({ id: 'b', name: 'b' }) + expect(applyRemoveNode([a, b], 'a')).toEqual([b]) + }) + + it('keeps a placeholder field when removing the last top-level node', () => { + const a = field({ id: 'a', name: 'a' }) + const next = applyRemoveNode([a], 'a') + + expect(next).toHaveLength(1) + expect(isFieldNode(next[0])).toBe(true) + expect(next[0].id).not.toBe('a') + }) + + it('removes a nested field inside a repeat block', () => { + const count = field({ id: 'count', name: 'count', dataType: 'uint8' }) + const innerA = field({ id: 'inner-a', name: 'innerA' }) + const innerB = field({ id: 'inner-b', name: 'innerB' }) + const repeat = { + ...createEmptyRepeatBlock(), + id: 'repeat-1', + countFieldRef: count.id, + fields: [innerA, innerB], + } + + const next = applyRemoveNode([count, repeat], 'inner-a') + expect(isRepeatNode(next[1])).toBe(true) + if (isRepeatNode(next[1])) { + expect(next[1].fields).toEqual([innerB]) + } + }) + }) + + describe('applyReorder', () => { + it('reorders sibling nodes', () => { + const a = field({ id: 'a', name: 'a' }) + const b = field({ id: 'b', name: 'b' }) + const c = field({ id: 'c', name: 'c' }) + + expect(applyReorder([a, b, c], 0, 2).map((n) => n.id)).toEqual([ + 'b', + 'c', + 'a', + ]) + }) + + it('returns the same array for an invalid move', () => { + const nodes = [ + field({ id: 'a', name: 'a' }), + field({ id: 'b', name: 'b' }), + ] + expect(applyReorder(nodes, 0, 0)).toBe(nodes) + expect(applyReorder(nodes, -1, 1)).toBe(nodes) + }) + }) + + describe('applyFieldChange', () => { + it('patches field name without changing size', () => { + const target = field({ + id: 'f1', + name: 'old', + dataType: 'uint8', + size: 1, + }) + const next = applyFieldChange([target], 'f1', { name: 'new' }) + + expect(next[0]).toMatchObject({ + id: 'f1', + name: 'new', + dataType: 'uint8', + size: 1, + }) + }) + + it('resets size when changing to a fixed-width type', () => { + const target = field({ + id: 'f1', + name: 'payload', + dataType: 'string', + size: 8, + sizeSource: 'fixed', + }) + const next = applyFieldChange([target], 'f1', { dataType: 'uint32le' }) + + expect(next[0]).toMatchObject({ + dataType: 'uint32le', + size: 4, + sizeSource: 'fixed', + sizeFieldRef: undefined, + }) + }) + + it('clears size when changing to a custom-size type', () => { + const target = field({ id: 'f1', name: 'x', dataType: 'uint8', size: 1 }) + const next = applyFieldChange([target], 'f1', { dataType: 'string' }) + + expect(next[0]).toMatchObject({ + dataType: 'string', + size: '', + }) + }) + + it('updates a nested field inside a repeat', () => { + const count = field({ id: 'count', name: 'count' }) + const inner = field({ id: 'inner', name: 'inner', dataType: 'uint8' }) + const repeat = { + ...createEmptyRepeatBlock(), + id: 'repeat-1', + countFieldRef: count.id, + fields: [inner], + } + + const next = applyFieldChange([count, repeat], 'inner', { + name: 'renamed', + }) + + expect(isRepeatNode(next[1])).toBe(true) + if (isRepeatNode(next[1])) { + expect(next[1].fields[0]).toMatchObject({ + id: 'inner', + name: 'renamed', + }) + } + }) + }) + + describe('applyRepeatChange / applyRepeatFieldsChange', () => { + it('updates countFieldRef on a repeat block', () => { + const count = field({ id: 'count', name: 'count' }) + const repeat = { + ...createEmptyRepeatBlock(), + id: 'repeat-1', + countFieldRef: '', + } + + const next = applyRepeatChange([count, repeat], 'repeat-1', { + countFieldRef: count.id, + }) + + expect(next[1]).toMatchObject({ + id: 'repeat-1', + countFieldRef: 'count', + }) + }) + + it('replaces nested fields for a repeat block', () => { + const count = field({ id: 'count', name: 'count' }) + const repeat = { + ...createEmptyRepeatBlock(), + id: 'repeat-1', + countFieldRef: count.id, + fields: [field({ id: 'old', name: 'old' })], + } + const replacement: SchemaNode[] = [ + field({ id: 'new-a', name: 'newA' }), + field({ id: 'new-b', name: 'newB' }), + ] + + const next = applyRepeatFieldsChange( + [count, repeat], + 'repeat-1', + replacement, + ) + + expect(isRepeatNode(next[1])).toBe(true) + if (isRepeatNode(next[1])) { + expect(next[1].fields).toEqual(replacement) + } + }) + + it('supports nested repeat field replacement', () => { + const count = field({ id: 'count', name: 'count' }) + const nestedInner = field({ id: 'nested-inner', name: 'nestedInner' }) + const nestedRepeat = { + ...createEmptyRepeatBlock(), + id: 'nested-repeat', + countFieldRef: count.id, + fields: [nestedInner], + } + const outerRepeat = { + ...createEmptyRepeatBlock(), + id: 'outer-repeat', + countFieldRef: count.id, + fields: [nestedRepeat], + } + + const replacement = [field({ id: 'replacement', name: 'replacement' })] + const next = applyRepeatFieldsChange( + [count, outerRepeat], + 'nested-repeat', + replacement, + ) + + expect(isRepeatNode(next[1])).toBe(true) + if (isRepeatNode(next[1])) { + expect(isRepeatNode(next[1].fields[0])).toBe(true) + if (isRepeatNode(next[1].fields[0])) { + expect(next[1].fields[0].fields).toEqual(replacement) + } + } + }) + }) +}) + +describe('useSchemaEditor', () => { + it('wires handlers through onChange', () => { + const onChange = jest.fn() + const nodes = [field({ id: 'a', name: 'a' })] + + const { result } = renderHook(() => useSchemaEditor({ nodes, onChange })) + + act(() => { + result.current.handleAddField() + }) + + expect(onChange).toHaveBeenCalledTimes(1) + expect(onChange.mock.calls[0][0]).toHaveLength(2) + expect(isFieldNode(onChange.mock.calls[0][0][1])).toBe(true) + + act(() => { + result.current.handleReorder(0, 0) + }) + expect(onChange).toHaveBeenCalledTimes(2) + expect(onChange.mock.calls[1][0]).toBe(nodes) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.ts new file mode 100644 index 0000000000..55c5466a09 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/useSchemaEditor.ts @@ -0,0 +1,154 @@ +import { useCallback } from 'react' + +import { createEmptyField, createEmptyRepeatBlock } from './constants' +import { reorderList } from './reorderList' +import { + isCustomSizeType, + removeSchemaNode, + updateSchemaNode, +} from './schemaUtils' +import { BinaryFieldDefinition, SchemaNode } from './types' +import { getFixedSize } from './utils' + +export const applyFieldChange = ( + nodes: SchemaNode[], + id: string, + patch: Partial, +): SchemaNode[] => + updateSchemaNode(nodes, id, (node) => { + if (node.kind !== 'field') { + return node + } + + const nextField = { ...node, ...patch } + if (patch.dataType) { + const fixedSize = getFixedSize(patch.dataType) + nextField.size = fixedSize === 'custom' ? '' : fixedSize + if (!isCustomSizeType(patch.dataType)) { + nextField.sizeSource = 'fixed' + nextField.sizeFieldRef = undefined + } + } + return nextField + }) + +export const applyRepeatChange = ( + nodes: SchemaNode[], + id: string, + patch: Partial<{ countFieldRef: string }>, +): SchemaNode[] => + updateSchemaNode(nodes, id, (node) => { + if (node.kind !== 'repeat') { + return node + } + return { ...node, ...patch } + }) + +export const applyRepeatFieldsChange = ( + nodes: SchemaNode[], + repeatId: string, + fields: SchemaNode[], +): SchemaNode[] => + updateSchemaNode(nodes, repeatId, (node) => { + if (node.kind !== 'repeat') { + return node + } + return { ...node, fields } + }) + +export const applyRemoveNode = ( + nodes: SchemaNode[], + id: string, +): SchemaNode[] => removeSchemaNode(nodes, id) + +export const applyReorder = ( + nodes: SchemaNode[], + fromIndex: number, + toIndex: number, +): SchemaNode[] => reorderList(nodes, fromIndex, toIndex) + +export const applyAddField = (nodes: SchemaNode[]): SchemaNode[] => [ + ...nodes, + createEmptyField(), +] + +export const applyAddRepeat = (nodes: SchemaNode[]): SchemaNode[] => [ + ...nodes, + createEmptyRepeatBlock(), +] + +export interface UseSchemaEditorParams { + nodes: SchemaNode[] + onChange: (nodes: SchemaNode[]) => void +} + +export interface UseSchemaEditorResult { + handleFieldChange: (id: string, patch: Partial) => void + handleRepeatChange: ( + id: string, + patch: Partial<{ countFieldRef: string }>, + ) => void + handleRepeatFieldsChange: (repeatId: string, fields: SchemaNode[]) => void + handleRemoveNode: (id: string) => void + handleReorder: (fromIndex: number, toIndex: number) => void + handleAddField: () => void + handleAddRepeat: () => void +} + +export const useSchemaEditor = ({ + nodes, + onChange, +}: UseSchemaEditorParams): UseSchemaEditorResult => { + const handleFieldChange = useCallback( + (id: string, patch: Partial) => { + onChange(applyFieldChange(nodes, id, patch)) + }, + [nodes, onChange], + ) + + const handleRepeatChange = useCallback( + (id: string, patch: Partial<{ countFieldRef: string }>) => { + onChange(applyRepeatChange(nodes, id, patch)) + }, + [nodes, onChange], + ) + + const handleRepeatFieldsChange = useCallback( + (repeatId: string, fields: SchemaNode[]) => { + onChange(applyRepeatFieldsChange(nodes, repeatId, fields)) + }, + [nodes, onChange], + ) + + const handleRemoveNode = useCallback( + (id: string) => { + onChange(applyRemoveNode(nodes, id)) + }, + [nodes, onChange], + ) + + const handleReorder = useCallback( + (fromIndex: number, toIndex: number) => { + onChange(applyReorder(nodes, fromIndex, toIndex)) + }, + [nodes, onChange], + ) + + const handleAddField = useCallback(() => { + onChange(applyAddField(nodes)) + }, [nodes, onChange]) + + const handleAddRepeat = useCallback(() => { + onChange(applyAddRepeat(nodes)) + }, [nodes, onChange]) + + return { + handleFieldChange, + handleRepeatChange, + handleRepeatFieldsChange, + handleRemoveNode, + handleReorder, + handleAddField, + handleAddRepeat, + } +} diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/utils.spec.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/utils.spec.ts new file mode 100644 index 0000000000..9e111194fb --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/utils.spec.ts @@ -0,0 +1,663 @@ +import { + findMatchingDecoderRule, + formatHexBytes, + formatParsedFields, + formatParsedFieldsInline, + getDefaultKeyPattern, + getFixedSize, + getKeyPatternSpecificity, + getSizeUnit, + matchKeyPattern, + parseBinaryBuffer, + resolveRepeatCount, +} from './utils' +import { + createEmptyField, + createEmptyRepeatBlock, + MAX_REPEAT_DECODE_ITERATIONS, +} from './constants' +import { DecoderType, ParsedBinaryNode, ValueDecoderRule } from './types' + +const countGroupNodes = (nodes: ParsedBinaryNode[]): number => + nodes.reduce((count, node) => { + if (node.kind === 'group') { + return count + 1 + countGroupNodes(node.children) + } + + return count + }, 0) + +const toUint16leBytes = (value: number) => [ + value % 256, + Math.floor(value / 256), +] + +describe('value-decoder utils', () => { + describe('getFixedSize', () => { + it('returns fixed sizes for known types', () => { + expect(getFixedSize('uint8')).toBe(1) + expect(getFixedSize('uint16le')).toBe(2) + expect(getFixedSize('uint32be')).toBe(4) + expect(getFixedSize('doublele')).toBe(8) + expect(getFixedSize('string')).toBe('custom') + }) + }) + + describe('getDefaultKeyPattern', () => { + it('returns the actual key name', () => { + expect( + getDefaultKeyPattern('room:chunk-state:678729695330336:1:36'), + ).toBe('room:chunk-state:678729695330336:1:36') + }) + + it('escapes glob metacharacters for exact-key matching', () => { + expect(getDefaultKeyPattern('user:*')).toBe('user:\\*') + expect(getDefaultKeyPattern('user:?')).toBe('user:\\?') + expect(getDefaultKeyPattern('user\\*')).toBe('user\\\\\\*') + expect(getDefaultKeyPattern('user:[0-9]')).toBe('user:\\[0-9\\]') + }) + }) + + describe('getSizeUnit', () => { + it('returns singular or plural byte labels', () => { + expect(getSizeUnit(1)).toBe('byte') + expect(getSizeUnit(2)).toBe('bytes') + expect(getSizeUnit('')).toBe('bytes') + }) + }) + + describe('matchKeyPattern', () => { + it('matches glob patterns', () => { + expect(matchKeyPattern('user:items:*', 'user:items:42')).toBe(true) + expect(matchKeyPattern('user:items:*', 'user:other:42')).toBe(false) + expect(matchKeyPattern('user:?', 'user:a')).toBe(true) + expect(matchKeyPattern('user:?', 'user:ab')).toBe(false) + }) + + it('treats regex-like strings as literal glob patterns', () => { + expect(matchKeyPattern('^user:items:.*$', 'user:items:42')).toBe(false) + expect(matchKeyPattern('^user:items:.*$', '^user:items:.*$')).toBe(true) + }) + + it('matches exact key names', () => { + expect( + matchKeyPattern( + 'room:chunk-state:678729695330336:1:36', + 'room:chunk-state:678729695330336:1:36', + ), + ).toBe(true) + }) + + it('matches escaped glob metacharacters literally', () => { + expect(matchKeyPattern('user:\\*', 'user:*')).toBe(true) + expect(matchKeyPattern('user:\\*', 'user:123')).toBe(false) + expect(matchKeyPattern('user:\\?', 'user:?')).toBe(true) + expect(matchKeyPattern('user:\\?', 'user:a')).toBe(false) + }) + + it('matches glob character classes', () => { + expect(matchKeyPattern('user:[0-9]*', 'user:3')).toBe(true) + expect(matchKeyPattern('user:[0-9]*', 'user:42')).toBe(true) + expect(matchKeyPattern('user:[0-9]*', 'user:a')).toBe(false) + expect(matchKeyPattern('h[ae]llo', 'hello')).toBe(true) + expect(matchKeyPattern('h[ae]llo', 'hallo')).toBe(true) + expect(matchKeyPattern('h[ae]llo', 'hillo')).toBe(false) + expect(matchKeyPattern('h[^e]llo', 'hallo')).toBe(true) + expect(matchKeyPattern('h[^e]llo', 'hello')).toBe(false) + expect(matchKeyPattern('h[a-b]llo', 'hallo')).toBe(true) + expect(matchKeyPattern('h[a-b]llo', 'hbllo')).toBe(true) + expect(matchKeyPattern('h[a-b]llo', 'hcllo')).toBe(false) + expect(matchKeyPattern('user:\\[0-9\\]', 'user:[0-9]')).toBe(true) + expect(matchKeyPattern('user:\\[0-9\\]', 'user:3')).toBe(false) + expect(matchKeyPattern('key:[A-Z\\-_]*', 'key:ABC')).toBe(true) + expect(matchKeyPattern('key:[A-Z\\-_]*', 'key:A-B_')).toBe(true) + expect(matchKeyPattern('key:[A-Z\\-_]*', 'key:0AB')).toBe(false) + }) + }) + + describe('findMatchingDecoderRule', () => { + const rules: ValueDecoderRule[] = [ + { + id: '1', + name: '', + keyPatterns: ['user:*'], + decoderType: DecoderType.Binary, + schema: [], + }, + ] + + it('returns the matching rule when only one rule applies', () => { + expect(findMatchingDecoderRule(rules, 'user:123')?.id).toBe('1') + expect(findMatchingDecoderRule(rules, 'other:123')).toBeNull() + }) + + it('prefers the most specific matching rule over broader patterns', () => { + const overlappingRules: ValueDecoderRule[] = [ + { + id: 'broad', + name: 'Broad', + keyPatterns: ['*'], + decoderType: DecoderType.Binary, + schema: [], + }, + { + id: 'specific', + name: 'Specific', + keyPatterns: ['user:123'], + decoderType: DecoderType.Binary, + schema: [], + }, + ] + + expect(findMatchingDecoderRule(overlappingRules, 'user:123')?.id).toBe( + 'specific', + ) + expect(findMatchingDecoderRule(overlappingRules, 'other:key')?.id).toBe( + 'broad', + ) + }) + + it('prefers a longer literal prefix over a shorter wildcard pattern', () => { + const overlappingRules: ValueDecoderRule[] = [ + { + id: 'user-wide', + name: 'User wide', + keyPatterns: ['user:*'], + decoderType: DecoderType.Binary, + schema: [], + }, + { + id: 'user-items', + name: 'User items', + keyPatterns: ['user:items:*'], + decoderType: DecoderType.Binary, + schema: [], + }, + ] + + expect( + findMatchingDecoderRule(overlappingRules, 'user:items:42')?.id, + ).toBe('user-items') + expect( + findMatchingDecoderRule(overlappingRules, 'user:profile:42')?.id, + ).toBe('user-wide') + }) + + it('scores exact key patterns higher than wildcard patterns', () => { + expect(getKeyPatternSpecificity('*')).toBeLessThan( + getKeyPatternSpecificity('user:123'), + ) + expect(getKeyPatternSpecificity('user:*')).toBeLessThan( + getKeyPatternSpecificity('user:123'), + ) + }) + }) + + describe('resolveRepeatCount', () => { + it('caps repeat count to prevent unbounded decode loops', () => { + expect(resolveRepeatCount(2)).toBe(2) + expect(resolveRepeatCount(Number.MAX_SAFE_INTEGER)).toBe( + MAX_REPEAT_DECODE_ITERATIONS, + ) + expect(resolveRepeatCount(Infinity)).toBe(0) + expect(resolveRepeatCount(undefined)).toBe(0) + expect(resolveRepeatCount(-1)).toBe(0) + }) + }) + + describe('formatHexBytes', () => { + it('formats bytes as uppercase hex pairs separated by spaces', () => { + expect( + formatHexBytes([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe]), + ).toBe('DE AD BE EF CA FE BA BE') + }) + }) + + describe('parseBinaryBuffer', () => { + it('parses hex fields as spaced uppercase byte pairs', () => { + const buffer = new Uint8Array([ + 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe, + ]) + + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'payload', + dataType: 'hex', + size: 8, + }, + ]) + + expect(parsed).toEqual([ + { + kind: 'field', + name: 'payload', + size: 8, + value: 'DE AD BE EF CA FE BA BE', + }, + ]) + }) + + it('parses sequential binary fields', () => { + const buffer = new Uint8Array([1, 2, 0, 3, 4]) + const parsed = parseBinaryBuffer(buffer, [ + { id: '1', kind: 'field', name: 'flag', dataType: 'uint8', size: 1 }, + { + id: '2', + kind: 'field', + name: 'count', + dataType: 'uint16le', + size: 2, + }, + { + id: '3', + kind: 'field', + name: 'value', + dataType: 'uint16be', + size: 2, + }, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'flag', size: 1, value: '1' }, + { kind: 'field', name: 'count', size: 2, value: '2' }, + { kind: 'field', name: 'value', size: 2, value: '772' }, + ]) + }) + + it('uses a prior numeric field as string size', () => { + const buffer = new Uint8Array([3, 0, 97, 98, 99]) + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'len', + dataType: 'uint16le', + size: 2, + }, + { + id: '2', + kind: 'field', + name: 'text', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: '1', + }, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'len', size: 2, value: '3' }, + { kind: 'field', name: 'text', size: 3, value: 'abc' }, + ]) + }) + + it('resolves dynamic size by field id when numeric names duplicate', () => { + const buffer = new Uint8Array([ + 3, 0, 5, 97, 98, 99, 104, 101, 108, 108, 111, + ]) + const parsed = parseBinaryBuffer(buffer, [ + { + id: 'len-a', + kind: 'field', + name: 'len', + dataType: 'uint16le', + size: 2, + }, + { + id: 'len-b', + kind: 'field', + name: 'len', + dataType: 'uint8', + size: 1, + }, + { + id: 'text-a', + kind: 'field', + name: 'textA', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: 'len-a', + }, + { + id: 'text-b', + kind: 'field', + name: 'textB', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: 'len-b', + }, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'len', size: 2, value: '3' }, + { kind: 'field', name: 'len', size: 1, value: '5' }, + { kind: 'field', name: 'textA', size: 3, value: 'abc' }, + { kind: 'field', name: 'textB', size: 5, value: 'hello' }, + ]) + }) + + it('preserves zero-length dynamic string fields', () => { + const buffer = new Uint8Array([0, 0, 42]) + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'len', + dataType: 'uint16le', + size: 2, + }, + { + id: '2', + kind: 'field', + name: 'text', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: '1', + }, + { + id: '3', + kind: 'field', + name: 'flag', + dataType: 'uint8', + size: 1, + }, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'len', size: 2, value: '0' }, + { kind: 'field', name: 'text', size: 0, value: '' }, + { kind: 'field', name: 'flag', size: 1, value: '42' }, + ]) + }) + + it('parses repeat blocks using a count field', () => { + const buffer = new Uint8Array([2, 0, 1, 0, 2, 0, 3, 0, 4, 0]) + const repeatBlock = createEmptyRepeatBlock() + repeatBlock.countFieldRef = '1' + repeatBlock.fields = [ + { + ...createEmptyField(), + name: 'anchor', + dataType: 'uint16le', + size: 2, + }, + { ...createEmptyField(), name: 'focus', dataType: 'uint16le', size: 2 }, + ] + + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'range_count', + dataType: 'uint16le', + size: 2, + }, + repeatBlock, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'range_count', size: 2, value: '2' }, + { + kind: 'group', + label: '0', + children: [ + { kind: 'field', name: 'anchor', size: 2, value: '1' }, + { kind: 'field', name: 'focus', size: 2, value: '2' }, + ], + }, + { + kind: 'group', + label: '1', + children: [ + { kind: 'field', name: 'anchor', size: 2, value: '3' }, + { kind: 'field', name: 'focus', size: 2, value: '4' }, + ], + }, + ]) + }) + + it('uses safe integer limits for bigint dynamic field sizes', () => { + const buffer = new Uint8Array(10) + const view = new DataView( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ) + view.setBigUint64(0, 9223372036854775807n, true) + + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'len', + dataType: 'biguint64le', + size: 8, + }, + { + id: '2', + kind: 'field', + name: 'text', + dataType: 'string', + size: '', + sizeSource: 'field', + sizeFieldRef: '1', + }, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'len', size: 8, value: '9223372036854775807' }, + { + kind: 'field', + name: 'text', + size: Number.MAX_SAFE_INTEGER, + value: '', + }, + ]) + }) + + it('stops parsing sibling fields when repeat decoding is capped', () => { + const repeatCount = MAX_REPEAT_DECODE_ITERATIONS + 1 + const bufferParts = [ + ...toUint16leBytes(repeatCount), + ...Array.from({ length: repeatCount }, () => 0xaa), + 0xbb, + ] + + const repeatBlock = createEmptyRepeatBlock() + repeatBlock.countFieldRef = 'count' + repeatBlock.fields = [ + { + ...createEmptyField(), + id: 'item', + name: 'item', + dataType: 'uint8', + size: 1, + }, + ] + + const parsed = parseBinaryBuffer(new Uint8Array(bufferParts), [ + { + id: 'count', + kind: 'field', + name: 'count', + dataType: 'uint16le', + size: 2, + }, + repeatBlock, + { + id: 'tail', + kind: 'field', + name: 'tail', + dataType: 'uint8', + size: 1, + }, + ]) + + expect(countGroupNodes(parsed)).toBe(MAX_REPEAT_DECODE_ITERATIONS) + expect( + parsed.some((node) => node.kind === 'field' && node.name === 'tail'), + ).toBe(false) + }) + + it('caps nested repeat decoding with a shared global budget', () => { + const outerCount = 100 + const innerCount = 100 + const bufferParts = [...toUint16leBytes(outerCount)] + + for (let outer = 0; outer < outerCount; outer += 1) { + bufferParts.push(innerCount) + for (let inner = 0; inner < innerCount; inner += 1) { + bufferParts.push(1) + } + } + + const innerRepeat = createEmptyRepeatBlock() + innerRepeat.id = 'inner-repeat' + innerRepeat.countFieldRef = 'inner-count' + innerRepeat.fields = [ + { + ...createEmptyField(), + id: 'inner-value', + name: 'value', + dataType: 'uint8', + size: 1, + }, + ] + + const outerRepeat = createEmptyRepeatBlock() + outerRepeat.id = 'outer-repeat' + outerRepeat.countFieldRef = 'outer-count' + outerRepeat.fields = [ + { + id: 'inner-count', + kind: 'field', + name: 'inner_count', + dataType: 'uint8', + size: 1, + }, + innerRepeat, + ] + + const parsed = parseBinaryBuffer(new Uint8Array(bufferParts), [ + { + id: 'outer-count', + kind: 'field', + name: 'outer_count', + dataType: 'uint16le', + size: 2, + }, + outerRepeat, + ]) + + expect(countGroupNodes(parsed)).toBe(MAX_REPEAT_DECODE_ITERATIONS) + expect(countGroupNodes(parsed)).toBeLessThan(outerCount * innerCount) + }) + + it('reports insufficient data when repeat count exceeds available bytes', () => { + const buffer = new Uint8Array([2, 0, 1, 0, 2, 0]) + const repeatBlock = createEmptyRepeatBlock() + repeatBlock.countFieldRef = '1' + repeatBlock.fields = [ + { + ...createEmptyField(), + name: 'anchor', + dataType: 'uint16le', + size: 2, + }, + { ...createEmptyField(), name: 'focus', dataType: 'uint16le', size: 2 }, + ] + + const parsed = parseBinaryBuffer(buffer, [ + { + id: '1', + kind: 'field', + name: 'range_count', + dataType: 'uint16le', + size: 2, + }, + repeatBlock, + ]) + + expect(parsed).toEqual([ + { kind: 'field', name: 'range_count', size: 2, value: '2' }, + { + kind: 'group', + label: '0', + children: [ + { kind: 'field', name: 'anchor', size: 2, value: '1' }, + { kind: 'field', name: 'focus', size: 2, value: '2' }, + ], + }, + { + kind: 'group', + label: '1', + children: [ + { + kind: 'field', + name: 'anchor', + size: 2, + value: '', + }, + ], + }, + ]) + }) + + it('formats parsed rows with grouped repeat indentation', () => { + expect( + formatParsedFields([ + { kind: 'field', name: 'range_count', size: 2, value: '1' }, + { + kind: 'group', + label: '0', + children: [ + { + kind: 'field', + name: 'anchor_chunk_id', + size: 8, + value: '769274194308128', + }, + ], + }, + ]), + ).toBe( + '[range_count] [2] [1]\n [0]\n [anchor_chunk_id] [8] [769274194308128]', + ) + }) + + it('formats flat parsed rows', () => { + expect( + formatParsedFields([ + { kind: 'field', name: 'id', size: 1, value: '7' }, + ]), + ).toBe('[id] [1] [7]') + }) + + it('formats parsed rows as a single inline line', () => { + expect( + formatParsedFieldsInline([ + { kind: 'field', name: 'range_count', size: 2, value: '1' }, + { + kind: 'group', + label: '0', + children: [ + { + kind: 'field', + name: 'anchor_chunk_id', + size: 8, + value: '769274194308128', + }, + ], + }, + ]), + ).toBe( + '[range_count] [2] [1] [0] [anchor_chunk_id] [8] [769274194308128]', + ) + }) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/utils.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/utils.ts new file mode 100644 index 0000000000..32f1fc1d0f --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/utils.ts @@ -0,0 +1,602 @@ +import { bufferToUint8Array } from 'uiSrc/utils/formatters/bufferFormatters' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' + +import { + BinaryDataType, + isRepeatNode, + MAX_REPEAT_DECODE_ITERATIONS, +} from './constants' +import { isNumericCountType } from './schemaUtils' +import { + BinaryFieldDefinition, + ParsedBinaryField, + ParsedBinaryNode, + SchemaNode, + ValueDecoderRule, +} from './types' + +export const getFixedSize = (type: string): number | 'custom' => { + if (['uint8', 'int8', 'boolean'].includes(type)) return 1 + if (['uint16le', 'uint16be', 'int16le', 'int16be'].includes(type)) return 2 + if ( + [ + 'uint32le', + 'uint32be', + 'int32le', + 'int32be', + 'floatle', + 'floatbe', + ].includes(type) + ) { + return 4 + } + if ( + [ + 'bigint64le', + 'bigint64be', + 'biguint64le', + 'biguint64be', + 'doublele', + 'doublebe', + ].includes(type) + ) { + return 8 + } + return 'custom' +} + +export const formatHexBytes = (bytes: Uint8Array | Iterable): string => + Array.from(bytes) + .map((byte) => byte.toString(16).padStart(2, '0').toUpperCase()) + .join(' ') + +const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g + +const GLOB_ESCAPABLE_CHARS = new Set(['*', '?', '\\', '[', ']']) + +const escapeRegexLiteral = (char: string): string => + char.replace(REGEX_SPECIAL_CHARS, '\\$&') + +const escapeRegexCharacterClassMember = (char: string): string => { + if (char === '-' || char === ']' || char === '\\' || char === '^') { + return `\\${char}` + } + + return escapeRegexLiteral(char) +} + +export const escapeGlobPattern = (literal: string): string => + literal.replace(/[\\*?\[\]]/g, '\\$&') + +const parseGlobCharacterClass = ( + pattern: string, + startIndex: number, +): { regex: string; nextIndex: number } | null => { + let index = startIndex + 1 + if (index >= pattern.length) { + return null + } + + let negated = false + if (pattern[index] === '^') { + negated = true + index += 1 + } + + if (index >= pattern.length) { + return null + } + + const classParts: string[] = [] + let closed = false + + if (pattern[index] === ']') { + classParts.push(escapeRegexCharacterClassMember(']')) + index += 1 + } + + while (index < pattern.length) { + const char = pattern[index] + + if (char === '\\' && index + 1 < pattern.length) { + classParts.push(escapeRegexCharacterClassMember(pattern[index + 1])) + index += 2 + continue + } + + if (char === ']') { + index += 1 + closed = true + break + } + + if ( + index + 2 < pattern.length && + pattern[index + 1] === '-' && + pattern[index + 2] !== ']' + ) { + const rangeStart = pattern[index] + const rangeEnd = pattern[index + 2] + classParts.push( + `${escapeRegexLiteral(rangeStart)}-${escapeRegexLiteral(rangeEnd)}`, + ) + index += 3 + continue + } + + classParts.push(escapeRegexCharacterClassMember(char)) + index += 1 + } + + if (!closed || classParts.length === 0) { + return null + } + + const body = classParts.join('') + return { + regex: negated ? `[^${body}]` : `[${body}]`, + nextIndex: index, + } +} + +export const getDefaultKeyPattern = (keyName: string): string => + escapeGlobPattern(keyName) + +export const matchKeyPattern = (pattern: string, keyName: string): boolean => { + if (!pattern) return false + + let regex = '' + for (let i = 0; i < pattern.length; i += 1) { + const char = pattern[i] + + if (char === '\\' && i + 1 < pattern.length) { + const next = pattern[i + 1] + if (GLOB_ESCAPABLE_CHARS.has(next)) { + regex += escapeRegexLiteral(next) + i += 1 + continue + } + } + + if (char === '*') { + regex += '.*' + continue + } + + if (char === '?') { + regex += '.' + continue + } + + if (char === '[') { + const characterClass = parseGlobCharacterClass(pattern, i) + if (characterClass) { + regex += characterClass.regex + i = characterClass.nextIndex - 1 + continue + } + } + + regex += escapeRegexLiteral(char) + } + + try { + return new RegExp(`^${regex}$`).test(keyName) + } catch { + return false + } +} + +export const getSizeUnit = (size: number | ''): string => { + const numericSize = Number(size) + if (!numericSize || numericSize <= 0) { + return 'bytes' + } + return numericSize === 1 ? 'byte' : 'bytes' +} + +export const getKeyPatternSpecificity = (pattern: string): number => { + if (!pattern) { + return -1 + } + + let score = 0 + let index = 0 + + while (index < pattern.length) { + const char = pattern[index] + + if (char === '\\' && index + 1 < pattern.length) { + score += 4 + index += 2 + continue + } + + if (char === '*') { + score += 1 + index += 1 + continue + } + + if (char === '?') { + score += 2 + index += 1 + continue + } + + if (char === '[') { + const characterClass = parseGlobCharacterClass(pattern, index) + if (characterClass) { + score += 3 + index = characterClass.nextIndex + continue + } + } + + score += 4 + index += 1 + } + + return score +} + +export const findMatchingDecoderRule = ( + rules: ValueDecoderRule[], + keyName: string, +): ValueDecoderRule | null => { + let bestRule: ValueDecoderRule | null = null + let bestScore = -1 + + rules.forEach((rule) => { + const ruleScore = rule.keyPatterns.reduce((maxScore, pattern) => { + if (!matchKeyPattern(pattern, keyName)) { + return maxScore + } + + return Math.max(maxScore, getKeyPatternSpecificity(pattern)) + }, -1) + + if (ruleScore > bestScore) { + bestScore = ruleScore + bestRule = rule + } + }) + + return bestRule +} + +const readNumericValue = ( + view: DataView, + offset: number, + type: BinaryDataType, +): string => { + switch (type) { + case 'uint8': + return String(view.getUint8(offset)) + case 'int8': + return String(view.getInt8(offset)) + case 'boolean': + return view.getUint8(offset) ? 'true' : 'false' + case 'uint16le': + return String(view.getUint16(offset, true)) + case 'uint16be': + return String(view.getUint16(offset, false)) + case 'int16le': + return String(view.getInt16(offset, true)) + case 'int16be': + return String(view.getInt16(offset, false)) + case 'uint32le': + return String(view.getUint32(offset, true)) + case 'uint32be': + return String(view.getUint32(offset, false)) + case 'int32le': + return String(view.getInt32(offset, true)) + case 'int32be': + return String(view.getInt32(offset, false)) + case 'floatle': + return String(view.getFloat32(offset, true)) + case 'floatbe': + return String(view.getFloat32(offset, false)) + case 'bigint64le': + return view.getBigInt64(offset, true).toString() + case 'bigint64be': + return view.getBigInt64(offset, false).toString() + case 'biguint64le': + return view.getBigUint64(offset, true).toString() + case 'biguint64be': + return view.getBigUint64(offset, false).toString() + case 'doublele': + return String(view.getFloat64(offset, true)) + case 'doublebe': + return String(view.getFloat64(offset, false)) + default: + return '' + } +} + +const parseNumericForRef = (value: string, dataType: string): number => { + if (!isNumericCountType(dataType)) { + return 0 + } + + if (dataType.includes('bigint') || dataType.includes('biguint')) { + try { + const bigintValue = BigInt(value) + + if (bigintValue < 0n) { + return 0 + } + + const maxSafeInteger = BigInt(Number.MAX_SAFE_INTEGER) + if (bigintValue > maxSafeInteger) { + return Number.MAX_SAFE_INTEGER + } + + return Number(bigintValue) + } catch { + return 0 + } + } + + const parsed = Number(value) + if (!Number.isFinite(parsed)) { + return 0 + } + + return Math.max(0, Math.floor(parsed)) +} + +const resolveFieldSize = ( + field: BinaryFieldDefinition, + parsedNumeric: Map, +): number => { + if (field.dataType === 'string' || field.dataType === 'hex') { + if (field.sizeSource === 'field' && field.sizeFieldRef) { + return parsedNumeric.get(field.sizeFieldRef) ?? 0 + } + return Number(field.size) || 0 + } + + const fixedSize = getFixedSize(field.dataType) + if (fixedSize === 'custom') { + return Number(field.size) || 0 + } + return fixedSize +} + +export const resolveRepeatCount = (rawCount: number | undefined): number => { + const normalized = rawCount ?? 0 + if (!Number.isFinite(normalized)) { + return 0 + } + + return Math.min( + MAX_REPEAT_DECODE_ITERATIONS, + Math.max(0, Math.floor(normalized)), + ) +} + +const parseFieldNode = ( + buffer: Uint8Array, + view: DataView, + field: BinaryFieldDefinition, + offset: number, + parsedNumeric: Map, +): { result: ParsedBinaryField | null; offset: number } => { + const size = resolveFieldSize(field, parsedNumeric) + + if (!field.name || size < 0) { + return { result: null, offset } + } + + if (size === 0) { + return { + result: { + kind: 'field', + name: field.name, + size: 0, + value: '', + }, + offset, + } + } + + if (offset + size > buffer.length) { + return { + result: { + kind: 'field', + name: field.name, + size, + value: '', + }, + offset, + } + } + + let value = '' + if (field.dataType === 'string') { + value = new TextDecoder('utf-8').decode(buffer.slice(offset, offset + size)) + } else if (field.dataType === 'hex') { + value = formatHexBytes(buffer.slice(offset, offset + size)) + } else { + value = readNumericValue(view, offset, field.dataType as BinaryDataType) + } + + const numericValue = parseNumericForRef(value, field.dataType) + if (isNumericCountType(field.dataType)) { + parsedNumeric.set(field.id, numericValue) + } + + return { + result: { kind: 'field', name: field.name, size, value }, + offset: offset + size, + } +} + +const hasInsufficientData = (nodes: ParsedBinaryNode[]): boolean => + nodes.some((node) => { + if (node.kind === 'field') { + return node.value === '' + } + return hasInsufficientData(node.children) + }) + +type DecodeBudget = { + remainingGroupSlots: number +} + +type ParseSchemaResult = { + results: ParsedBinaryNode[] + offset: number + truncated: boolean +} + +const getFullRepeatCount = (rawCount: number | undefined): number => { + const normalized = rawCount ?? 0 + if (!Number.isFinite(normalized)) { + return 0 + } + + return Math.max(0, Math.floor(normalized)) +} + +const parseSchemaNodes = ( + buffer: Uint8Array, + view: DataView, + nodes: SchemaNode[], + offset: number, + parsedNumeric: Map, + decodeBudget: DecodeBudget, +): ParseSchemaResult => { + let currentOffset = offset + const results: ParsedBinaryNode[] = [] + + for (const node of nodes) { + if (node.kind === 'field' || !isRepeatNode(node)) { + const field = node as BinaryFieldDefinition + const { result, offset: nextOffset } = parseFieldNode( + buffer, + view, + field, + currentOffset, + parsedNumeric, + ) + if (result) { + results.push(result) + if (result.value === '') { + return { results, offset: currentOffset, truncated: false } + } + } + currentOffset = nextOffset + continue + } + + const fullRepeatCount = getFullRepeatCount( + parsedNumeric.get(node.countFieldRef), + ) + const repeatCount = Math.min( + resolveRepeatCount(parsedNumeric.get(node.countFieldRef)), + decodeBudget.remainingGroupSlots, + ) + + let decodedIterations = 0 + for (let index = 0; index < repeatCount; index += 1) { + if (decodeBudget.remainingGroupSlots <= 0) { + break + } + + decodeBudget.remainingGroupSlots -= 1 + + const iterationScope = new Map(parsedNumeric) + const childParse = parseSchemaNodes( + buffer, + view, + node.fields, + currentOffset, + iterationScope, + decodeBudget, + ) + + results.push({ + kind: 'group', + label: String(index), + children: childParse.results, + }) + currentOffset = childParse.offset + decodedIterations += 1 + + if (hasInsufficientData(childParse.results)) { + return { results, offset: currentOffset, truncated: false } + } + + if (childParse.truncated) { + return { results, offset: currentOffset, truncated: true } + } + } + + if (decodedIterations < fullRepeatCount) { + return { results, offset: currentOffset, truncated: true } + } + } + + return { results, offset: currentOffset, truncated: false } +} + +export const formatParsedFieldLine = (field: ParsedBinaryField): string => + `[${field.name}] [${field.size}] [${field.value}]` + +export const formatParsedFields = (nodes: ParsedBinaryNode[]): string => { + const lines: string[] = [] + + const walk = (items: ParsedBinaryNode[], depth: number) => { + items.forEach((node) => { + if (node.kind === 'group') { + lines.push(`${' '.repeat(depth + 1)}[${node.label}]`) + walk(node.children, depth + 2) + return + } + + lines.push(`${' '.repeat(depth)}${formatParsedFieldLine(node)}`) + }) + } + + walk(nodes, 0) + return lines.join('\n') +} + +export const formatParsedFieldsInline = (nodes: ParsedBinaryNode[]): string => { + const parts: string[] = [] + + const walk = (items: ParsedBinaryNode[]) => { + items.forEach((node) => { + if (node.kind === 'group') { + parts.push(`[${node.label}]`) + walk(node.children) + return + } + + parts.push(formatParsedFieldLine(node)) + }) + } + + walk(nodes) + return parts.join(' ') +} + +export const parseBinaryBuffer = ( + buffer: Uint8Array, + schema: SchemaNode[], +): ParsedBinaryNode[] => + parseSchemaNodes( + buffer, + new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength), + schema, + 0, + new Map(), + { remainingGroupSlots: MAX_REPEAT_DECODE_ITERATIONS }, + ).results + +export const parseBufferWithRule = ( + buffer: RedisResponseBuffer, + schema: SchemaNode[], +): ParsedBinaryNode[] => parseBinaryBuffer(bufferToUint8Array(buffer), schema) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.spec.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.spec.ts new file mode 100644 index 0000000000..4af60ba6be --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.spec.ts @@ -0,0 +1,96 @@ +import { faker } from '@faker-js/faker' +import { localStorageService } from 'uiSrc/services' +import BrowserStorageItem from 'uiSrc/constants/storage' + +import { createEmptyDecoder } from './constants' +import { + getValueDecoderRules, + getValueDecoderRulesStorageKey, + removeValueDecoderRules, + setValueDecoderRules, +} from './valueDecoderStorage' + +jest.mock('uiSrc/services', () => ({ + ...jest.requireActual('uiSrc/services'), + localStorageService: { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + }, +})) + +const mockGet = localStorageService.get as jest.Mock +const mockSet = localStorageService.set as jest.Mock +const mockRemove = localStorageService.remove as jest.Mock + +describe('valueDecoderStorage', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + it('reads rules from a per-instance storage key', () => { + const instanceId = faker.string.uuid() + const rules = [createEmptyDecoder('user:*')] + + mockGet.mockImplementation((key: string) => { + if (key === getValueDecoderRulesStorageKey(instanceId)) { + return rules + } + + return null + }) + + expect(getValueDecoderRules(instanceId)).toEqual(rules) + }) + + it('stores rules per instanceId', () => { + const instanceId = faker.string.uuid() + const rules = [createEmptyDecoder('session:*')] + + setValueDecoderRules(instanceId, rules) + + expect(mockSet).toHaveBeenCalledWith( + BrowserStorageItem.valueDecoderRules + instanceId, + rules, + ) + }) + + it('returns empty rules when instanceId is missing', () => { + expect(getValueDecoderRules('')).toEqual([]) + expect(mockSet).not.toHaveBeenCalled() + }) + + it('migrates legacy global rules into the current database once', () => { + const instanceId = faker.string.uuid() + const legacyRules = [createEmptyDecoder('legacy:*')] + + mockGet.mockImplementation((key: string) => { + if (key === getValueDecoderRulesStorageKey(instanceId)) { + return null + } + + if (key === 'valueDecoderRules') { + return legacyRules + } + + return null + }) + + expect(getValueDecoderRules(instanceId)).toEqual(legacyRules) + expect(mockSet).toHaveBeenCalledWith( + getValueDecoderRulesStorageKey(instanceId), + legacyRules, + ) + expect(mockRemove).toHaveBeenCalledWith('valueDecoderRules') + }) + + it('removes per-instance rules when a database is deleted', () => { + const instanceId = faker.string.uuid() + + removeValueDecoderRules(instanceId) + + expect(mockRemove).toHaveBeenCalledWith( + getValueDecoderRulesStorageKey(instanceId), + ) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.ts b/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.ts new file mode 100644 index 0000000000..7f1a02568f --- /dev/null +++ b/redisinsight/ui/src/pages/browser/components/value-decoder/valueDecoderStorage.ts @@ -0,0 +1,54 @@ +import BrowserStorageItem from 'uiSrc/constants/storage' +import { localStorageService } from 'uiSrc/services' + +import { normalizeRule } from './schemaUtils' +import { ValueDecoderRule } from './types' + +const LEGACY_GLOBAL_VALUE_DECODER_RULES_KEY = 'valueDecoderRules' + +export const getValueDecoderRulesStorageKey = (instanceId: string) => + BrowserStorageItem.valueDecoderRules + instanceId + +export const getValueDecoderRules = ( + instanceId: string, +): ValueDecoderRule[] => { + if (!instanceId) { + return [] + } + + const storageKey = getValueDecoderRulesStorageKey(instanceId) + let raw: ValueDecoderRule[] | null = localStorageService?.get(storageKey) + + if (!raw?.length) { + const legacyRules: ValueDecoderRule[] | null = localStorageService?.get( + LEGACY_GLOBAL_VALUE_DECODER_RULES_KEY, + ) + + if (legacyRules?.length) { + localStorageService.set(storageKey, legacyRules) + localStorageService.remove(LEGACY_GLOBAL_VALUE_DECODER_RULES_KEY) + raw = legacyRules + } + } + + return (raw ?? []).map(normalizeRule) +} + +export const setValueDecoderRules = ( + instanceId: string, + decoders: ValueDecoderRule[], +): void => { + if (!instanceId) { + return + } + + localStorageService?.set(getValueDecoderRulesStorageKey(instanceId), decoders) +} + +export const removeValueDecoderRules = (instanceId: string): void => { + if (!instanceId) { + return + } + + localStorageService?.remove(getValueDecoderRulesStorageKey(instanceId)) +} diff --git a/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.spec.tsx b/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.spec.tsx index b2182a3d6e..63cb52bec6 100644 --- a/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.spec.tsx @@ -5,7 +5,12 @@ import { cleanup, render, screen, userEvent } from 'uiSrc/utils/test-utils' import { Pages } from 'uiSrc/constants' import { IndexSummary } from 'uiSrc/slices/interfaces/redisearch' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { SearchBrowserSource } from 'uiSrc/pages/vector-search/telemetry.constants' +import { + SearchBrowserSource, + SearchIndexDetailsSource, +} from 'uiSrc/pages/vector-search/telemetry.constants' + +import { OPEN_INDEX_PANEL_PARAM } from 'uiSrc/pages/vector-search/pages/VectorSearchQueryPage/VectorSearchQueryPage.constants' import { ViewIndexDataButton } from './ViewIndexDataButton' import { ViewIndexDataButtonProps } from './ViewIndexDataButton.types' @@ -64,18 +69,19 @@ describe('ViewIndexDataButton', () => { expect(btn).not.toBeDisabled() }) - it('should navigate to the index query page on click', async () => { + it('should navigate to the index query page with the open panel param on click', async () => { const index = buildIndex({ name: 'movies_index' }) renderComponent({ indexes: [index] }) await userEvent.click(screen.getByTestId('view-index-data-btn')) - expect(mockPush).toHaveBeenCalledWith( - Pages.vectorSearchQuery( + expect(mockPush).toHaveBeenCalledWith({ + pathname: Pages.vectorSearchQuery( mockInstanceId, encodeURIComponent('movies_index'), ), - ) + search: `${OPEN_INDEX_PANEL_PARAM}=true`, + }) }) it('should send SEARCH_VIEW_INDEX_CLICKED telemetry on click', async () => { @@ -93,6 +99,13 @@ describe('ViewIndexDataButton', () => { source: SearchBrowserSource.KeyDetails, }, }) + expect(sendEventTelemetry).toHaveBeenCalledWith({ + event: TelemetryEvent.SEARCH_INDEX_DETAILS_VIEWED, + eventData: { + databaseId: mockInstanceId, + source: SearchIndexDetailsSource.KeyDetails, + }, + }) }) it('should call onNavigate callback instead of history.push when provided', async () => { @@ -145,12 +158,13 @@ describe('ViewIndexDataButton', () => { screen.getByTestId('view-index-data-item-users_index'), ) - expect(mockPush).toHaveBeenCalledWith( - Pages.vectorSearchQuery( + expect(mockPush).toHaveBeenCalledWith({ + pathname: Pages.vectorSearchQuery( mockInstanceId, encodeURIComponent('users_index'), ), - ) + search: `${OPEN_INDEX_PANEL_PARAM}=true`, + }) }) it('should send SEARCH_VIEW_INDEX_CLICKED telemetry with correct count when menu item is clicked', async () => { diff --git a/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.tsx b/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.tsx index 311e447491..08a279e82e 100644 --- a/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.tsx +++ b/redisinsight/ui/src/pages/browser/components/view-index-data-button/ViewIndexDataButton.tsx @@ -11,18 +11,22 @@ import { MenuItem, } from 'uiSrc/components/base/layout/menu' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { SearchBrowserSource } from 'uiSrc/pages/vector-search/telemetry.constants' +import { + SearchBrowserSource, + SearchIndexDetailsSource, +} from 'uiSrc/pages/vector-search/telemetry.constants' +import { OPEN_INDEX_PANEL_PARAM } from 'uiSrc/pages/vector-search/pages/VectorSearchQueryPage/VectorSearchQueryPage.constants' +import { useTranslation } from 'uiSrc/i18n' import { ViewIndexDataButtonProps } from './ViewIndexDataButton.types' import * as S from './ViewIndexDataButton.styles' -const VIEW_INDEX_LABEL = 'View index' - export const ViewIndexDataButton = ({ indexes, instanceId, onNavigate, }: ViewIndexDataButtonProps) => { + const { t } = useTranslation() const history = useHistory() const navigateTo = useCallback( @@ -35,13 +39,26 @@ export const ViewIndexDataButton = ({ source: SearchBrowserSource.KeyDetails, }, }) + sendEventTelemetry({ + event: TelemetryEvent.SEARCH_INDEX_DETAILS_VIEWED, + eventData: { + databaseId: instanceId, + source: SearchIndexDetailsSource.KeyDetails, + }, + }) if (onNavigate) { onNavigate(indexName) return } - history.push( - Pages.vectorSearchQuery(instanceId, encodeURIComponent(indexName)), - ) + history.push({ + pathname: Pages.vectorSearchQuery( + instanceId, + encodeURIComponent(indexName), + ), + search: new URLSearchParams({ + [OPEN_INDEX_PANEL_PARAM]: 'true', + }).toString(), + }) }, [history, instanceId, onNavigate, indexes.length], ) @@ -57,7 +74,7 @@ export const ViewIndexDataButton = ({ onClick={() => navigateTo(indexes[0].name)} data-testid="view-index-data-btn" > - {VIEW_INDEX_LABEL} + {t('browser.viewIndex.label')}
) } @@ -67,7 +84,7 @@ export const ViewIndexDataButton = ({ - {VIEW_INDEX_LABEL} + {t('browser.viewIndex.label')} () @@ -74,13 +73,11 @@ describe('VirtualTree', () => { it('should render items', async () => { const mockFn = jest.fn() const { queryByTestId } = render( - - - , + , ) expect(queryByTestId('node-item_test')).toBeInTheDocument() diff --git a/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx b/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx index a711ddcf41..16590eb6a6 100644 --- a/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx +++ b/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx @@ -1,18 +1,14 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import AutoSizer from 'react-virtualized-auto-sizer' import { debounce, get, set } from 'lodash' import { TreeWalker, TreeWalkerValue, FixedSizeTree as Tree } from 'react-vtree' import { useAppDispatch } from 'uiSrc/slices/hooks' -import { bufferToString, Nullable, stringToBuffer } from 'uiSrc/utils' +import { bufferToString, Nullable } from 'uiSrc/utils' import { useDisposableWebworker } from 'uiSrc/services' import { DEFAULT_TREE_SORTING, KeyTypes } from 'uiSrc/constants' import { RedisString } from 'uiSrc/slices/interfaces' -import { - fetchKeysMetadataTree, - fetchNamespaceSearchable, -} from 'uiSrc/slices/browser/keys' -import { NamespaceSearchableResult } from 'uiSrc/slices/interfaces/keys' +import { fetchKeysMetadataTree } from 'uiSrc/slices/browser/keys' import { Loader, ProgressBarLoader, @@ -61,7 +57,6 @@ const VirtualTree = (props: VirtualTreeProps) => { const [rerenderState, rerender] = useState({}) const controller = useRef>(null) const elements = useRef({}) - const searchableElements = useRef>({}) const nodes = useRef([]) const { result, run: runWebworker } = useDisposableWebworker(webworkerFn) @@ -72,7 +67,6 @@ const VirtualTree = (props: VirtualTreeProps) => { () => () => { nodes.current = [] elements.current = {} - searchableElements.current = {} }, [], ) @@ -178,50 +172,6 @@ const VirtualTree = (props: VirtualTreeProps) => { [commonFilterType], ) - const onSuccessFetchedSearchable = (results: NamespaceSearchableResult[]) => { - results.forEach((item) => { - if (!item.path) return - const update: Record = { searchableChecked: true } - if (item.key) { - update.firstSearchableKey = { - nameBuffer: stringToBuffer(item.key.name), - nameString: item.key.name, - type: item.key.type, - } - } - updateNodeByPath(item.path, update) - }) - rerender({}) - } - - const getSearchable = useCallback((entries: [string, string][]): void => { - dispatch( - fetchNamespaceSearchable(entries, controller.current?.signal, (results) => - onSuccessFetchedSearchable(results), - ), - ) - }, []) - - const getSearchableDebounced = useMemo( - () => - debounce(() => { - const entries = Object.entries(searchableElements.current) - if (entries.length === 0) return - - getSearchable(entries) - searchableElements.current = {} - }, 100), - [getSearchable], - ) - - const checkSearchable = useCallback( - (prefix: string, path: string) => { - searchableElements.current[path] = prefix - getSearchableDebounced() - }, - [getSearchableDebounced], - ) - // This helper function constructs the object that will be sent back at the step // [2] during the treeWalker function work. Except for the mandatory `data` // field you can put any additional data here. @@ -255,10 +205,6 @@ const VirtualTree = (props: VirtualTreeProps) => { onDelete: onDeleteLeaf, onDeleteFolder, keyApproximate: node.keyApproximate, - hasSearchableKeys: !!node.firstSearchableKey, - firstSearchableKey: node.firstSearchableKey, - checkSearchable: - !node.isLeaf && !node.searchableChecked ? checkSearchable : undefined, isSelected: !!node.isLeaf && statusSelected === node?.nameString, isOpenByDefault: statusOpen[node.fullName], visibleColumns, @@ -312,7 +258,7 @@ const VirtualTree = (props: VirtualTreeProps) => { return ( - {({ height, width }) => ( + {({ height, width }: { height: number; width: number }) => (
{nodes.current.length > 0 && ( <> diff --git a/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.types.ts b/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.types.ts index 17b0a2ab89..8358e63c1b 100644 --- a/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.types.ts +++ b/redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.types.ts @@ -39,12 +39,6 @@ export interface NodeMetaData { isOpenByDefault: boolean } -export interface FirstSearchableKey { - nameBuffer: RedisResponseBuffer - nameString: string - type: KeyTypes -} - export interface TreeData extends FixedSizeNodeData { isLeaf: boolean name: string @@ -63,9 +57,6 @@ export interface TreeData extends FixedSizeNodeData { isSelected: boolean delimiters: string[] children?: TreeData[] - hasSearchableKeys?: boolean - firstSearchableKey?: FirstSearchableKey - checkSearchable?: (prefix: string, path: string) => void updateStatusOpen: (fullName: string, value: boolean) => void updateStatusSelected: (key: RedisString) => void getMetadata: (key: RedisString, path: string) => void diff --git a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.spec.tsx b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.spec.tsx index 509ba29212..d9e10b258a 100644 --- a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.spec.tsx @@ -3,21 +3,9 @@ import { instance, mock } from 'ts-mockito' import { cloneDeep } from 'lodash' import reactRouterDom from 'react-router-dom' import { faker } from '@faker-js/faker' -import { - cleanup, - mockedStore, - mockFeatureFlags, - render, - screen, - fireEvent, -} from 'uiSrc/utils/test-utils' +import { cleanup, mockedStore, render, screen } from 'uiSrc/utils/test-utils' import { stringToBuffer } from 'uiSrc/utils' -import { FeatureFlags, KeyTypes, BrowserColumns, Pages } from 'uiSrc/constants' -import { RedisearchIndexKeyType } from 'uiSrc/pages/browser/components/create-redisearch-index/constants' -import { CreateIndexMode } from 'uiSrc/pages/vector-search/pages/VectorSearchCreateIndexPage/VectorSearchCreateIndexPage.types' -import { MakeSearchableModalProvider } from 'uiSrc/pages/browser/components/make-searchable-modal' -import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { SearchBrowserSource } from 'uiSrc/pages/vector-search/telemetry.constants' +import { KeyTypes, BrowserColumns } from 'uiSrc/constants' import Node, { NodeProps } from './Node' import { TreeData } from '../../VirtualTree.types' import { mockVirtualTreeResult } from '../../VirtualTree.spec' @@ -85,12 +73,9 @@ const renderNode = ( options?: { store?: any }, ) => { const mergedProps = { ...instance(mockedProps), ...props } - return render( - - - , - { store: options?.store ?? store }, - ) + return render(, { + store: options?.store ?? store, + }) } describe('Node', () => { @@ -507,11 +492,7 @@ describe('Node', () => { stateSnapshot = { ...updatedState, ...connectionState } - rerender( - - - , - ) + rerender() expect(mockGetMetadata).toHaveBeenCalledWith( mockData.nameBuffer, @@ -565,187 +546,4 @@ describe('Node', () => { ).toBeInTheDocument() }) }) - - describe('Index button (folder searchable)', () => { - const mockFolderName = 'users' - const mockFirstSearchableKey = { - nameBuffer: stringToBuffer('users:1'), - nameString: 'users:1', - type: KeyTypes.Hash, - } - - const baseFolderData: TreeData = { - ...mockedData, - isLeaf: false, - fullName: mockFolderName, - keyCount: 10, - delimiters: [':'], - onDeleteFolder: jest.fn(), - showFolderMetadata: true, - } - - it('should render Index button when hasSearchableKeys is true and feature flag is on', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: true, - firstSearchableKey: mockFirstSearchableKey, - } - - renderNode({ data: mockData }) - - expect( - screen.getByTestId(`index-folder-btn-${mockFolderName}`), - ).toBeInTheDocument() - - spy.mockRestore() - }) - - it('should not render Index button when hasSearchableKeys is false', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: false, - } - - renderNode({ data: mockData }) - - expect( - screen.queryByTestId(`index-folder-btn-${mockFolderName}`), - ).not.toBeInTheDocument() - - spy.mockRestore() - }) - - it('should not render Index button when feature flag is off', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: false }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: true, - firstSearchableKey: mockFirstSearchableKey, - } - - renderNode({ data: mockData }) - - expect( - screen.queryByTestId(`index-folder-btn-${mockFolderName}`), - ).not.toBeInTheDocument() - - spy.mockRestore() - }) - - it('should send SEARCH_MAKE_SEARCHABLE_CLICKED telemetry with tree_view source on Index button click', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: true, - firstSearchableKey: mockFirstSearchableKey, - } - - renderNode({ data: mockData }) - - const indexFolderBtn = screen.getByTestId( - `index-folder-btn-${mockFolderName}`, - ) - fireEvent.click(indexFolderBtn) - - expect(sendEventTelemetry).toHaveBeenCalledWith({ - event: TelemetryEvent.SEARCH_MAKE_SEARCHABLE_CLICKED, - eventData: { - databaseId: mockInstanceId, - keyType: RedisearchIndexKeyType.HASH, - source: SearchBrowserSource.TreeView, - }, - }) - - spy.mockRestore() - }) - - it('should open modal on Index button click', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: true, - firstSearchableKey: mockFirstSearchableKey, - } - - renderNode({ data: mockData }) - - fireEvent.click(screen.getByTestId(`index-folder-btn-${mockFolderName}`)) - - expect( - screen.getByTestId('make-searchable-modal-body'), - ).toBeInTheDocument() - - spy.mockRestore() - }) - - it('should navigate to create index page with correct query params on confirm', () => { - const spy = mockFeatureFlags({ - [FeatureFlags.vectorSearchV2]: { flag: true }, - }) - - const mockData: TreeData = { - ...baseFolderData, - hasSearchableKeys: true, - firstSearchableKey: mockFirstSearchableKey, - } - - renderNode({ data: mockData }) - - fireEvent.click(screen.getByTestId(`index-folder-btn-${mockFolderName}`)) - fireEvent.click(screen.getByTestId('make-searchable-modal-confirm')) - - expect(mockPush).toHaveBeenCalledWith({ - pathname: Pages.vectorSearchCreateIndex(mockInstanceId), - search: - `mode=${CreateIndexMode.ExistingData}&initialKey=users%3A1` + - `&initialKeyType=${RedisearchIndexKeyType.HASH}&initialPrefix=users%3A`, - }) - - spy.mockRestore() - }) - - it('should call checkSearchable on mount when prop is provided', () => { - const mockCheckSearchable = jest.fn() - const mockData: TreeData = { - ...baseFolderData, - checkSearchable: mockCheckSearchable, - } - - renderNode({ data: mockData }) - - expect(mockCheckSearchable).toHaveBeenCalledWith( - `${mockFolderName}:`, - mockData.path, - ) - }) - - it('should not call checkSearchable when prop is not provided', () => { - const mockData: TreeData = { - ...baseFolderData, - } - - renderNode({ data: mockData }) - - expect( - screen.getByTestId(`node-item_${mockFolderName}`), - ).toBeInTheDocument() - }) - }) }) diff --git a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.styles.ts b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.styles.ts index f91e22af05..6e497a3623 100644 --- a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.styles.ts +++ b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.styles.ts @@ -31,18 +31,6 @@ export const NodeContainer = styled.div< export const FOLDER_ANCHOR_CLASS = 'node-folder-anchor' -export const IndexButton = styled.button< - React.ButtonHTMLAttributes ->` - all: unset; - display: none; - cursor: pointer; - padding: 0 ${({ theme }) => theme.core.space.space100}; - color: ${({ theme }) => theme.semantic.color.text.informative400}; - font-size: inherit; - white-space: nowrap; -` - export const NodeContent = styled(Row).attrs({ align: 'center', justify: 'between', @@ -86,10 +74,6 @@ export const NodeContent = styled(Row).attrs({ .showOnHoverKey { display: flex; } - - ${IndexButton} { - display: inline; - } } ` diff --git a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx index fc5191d7de..eaa2853445 100644 --- a/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx +++ b/redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useRef, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { NodeComponentProps, NodePublicState } from 'react-vtree/dist/es/Tree' import { useAppSelector } from 'uiSrc/slices/hooks' @@ -9,10 +9,8 @@ import { FeatureFlags, KeyTypes, ModulesKeyTypes, - TEXT_BULK_DELETE_DISABLED_MULTIPLE_DELIMITERS, - TEXT_BULK_DELETE_DISABLED_UNPRINTABLE, - TEXT_BULK_DELETE_TOOLTIP, } from 'uiSrc/constants' +import { useTranslation } from 'uiSrc/i18n' import KeyRowTTL from 'uiSrc/pages/browser/components/key-row-ttl' import KeyRowSize from 'uiSrc/pages/browser/components/key-row-size' import KeyRowName from 'uiSrc/pages/browser/components/key-row-name' @@ -25,11 +23,6 @@ import { IconButton } from 'uiSrc/components/base/forms/buttons' import { DeleteIcon } from 'uiSrc/components/base/icons' import { Flex } from 'uiSrc/components/base/layout/flex' import { ColorText, Text } from 'uiSrc/components/base/text' -import { KEY_TYPE_MAP } from 'uiSrc/pages/vector-search/constants' -import { useMakeSearchableModal } from 'uiSrc/pages/browser/components/make-searchable-modal' -import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' -import { SearchBrowserSource } from 'uiSrc/pages/vector-search/telemetry.constants' import * as S from './Node.styles' import { TreeData } from '../../VirtualTree.types' import { DeleteKeyPopover } from '../../../delete-key-popover/DeleteKeyPopover' @@ -49,6 +42,7 @@ export type NodeProps = NodeComponentProps< } const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { + const { t } = useTranslation() const { id: nodeId, isLeaf, @@ -66,9 +60,6 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { keyApproximate, isSelected, delimiters = [], - hasSearchableKeys, - firstSearchableKey, - checkSearchable, getMetadata, onDelete, onDeleteClicked, @@ -82,16 +73,12 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { } = data const delimiterView = delimiters.length === 1 ? delimiters[0] : '-' - const folderPrefix = `${fullName}${delimiterView}` const { shownColumns } = useAppSelector(appContextDbConfig) const visibleColumns = visibleColumnsProp ?? shownColumns const includeSize = visibleColumns.includes(BrowserColumns.Size) const includeTTL = visibleColumns.includes(BrowserColumns.TTL) - const { openMakeSearchableModal } = useMakeSearchableModal() - const { id: instanceId } = useAppSelector(connectedInstanceSelector) - const [deletePopoverId, setDeletePopoverId] = useState>(undefined) const prevIncludeSize = useRef(includeSize) @@ -113,12 +100,6 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { prevIncludeTTL.current = includeTTL }, [includeSize, includeTTL, isLeaf, nameBuffer, size, ttl]) - useEffect(() => { - if (checkSearchable) { - checkSearchable(folderPrefix, path) - } - }, [checkSearchable, folderPrefix, path]) - const handleClick = () => { if (isLeaf) { updateStatusSelected?.(nameBuffer) @@ -156,41 +137,6 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { onDeleteFolder?.(deletePattern, fullName, keyCount) } - const getKeyPrefix = useCallback( - (keyName: string) => { - const lastDelimiterIndex = keyName.lastIndexOf(delimiterView) - if (lastDelimiterIndex === -1) return folderPrefix - return keyName.substring(0, lastDelimiterIndex + delimiterView.length) - }, - [delimiterView, folderPrefix], - ) - - const handleIndexClick = (e: React.MouseEvent) => { - e.stopPropagation() - const source = SearchBrowserSource.TreeView - const keyType = firstSearchableKey - ? KEY_TYPE_MAP[firstSearchableKey.type] - : undefined - sendEventTelemetry({ - event: TelemetryEvent.SEARCH_MAKE_SEARCHABLE_CLICKED, - eventData: { - databaseId: instanceId, - keyType, - source, - }, - }) - const initialPrefix = firstSearchableKey?.nameString - ? getKeyPrefix(firstSearchableKey.nameString) - : folderPrefix - openMakeSearchableModal({ - prefix: folderPrefix, - initialKey: firstSearchableKey?.nameBuffer, - initialKeyType: keyType, - initialPrefix, - source, - }) - } - const hasUnprintableChars = fullName?.includes('\uFFFD') || nameString?.includes('\uFFFD') @@ -198,12 +144,12 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { const getDeleteTooltip = () => { if (hasUnprintableChars) { - return TEXT_BULK_DELETE_DISABLED_UNPRINTABLE + return t('browser.tree.folder.deleteDisabledUnprintable') } if (delimiters.length > 1) { - return TEXT_BULK_DELETE_DISABLED_MULTIPLE_DELIMITERS + return t('browser.tree.folder.deleteDisabledMultipleDelimiters') } - return TEXT_BULK_DELETE_TOOLTIP(deletePattern) + return t('browser.tree.folder.deleteTooltip', { pattern: deletePattern }) } const deleteTooltip = getDeleteTooltip() @@ -251,27 +197,6 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { {keyCount ?? ''} - {hasSearchableKeys && ( - - - Index data with the "{folderPrefix}"{' '} - prefix so you can query it using full-text, vector, exact - matching, and geospatial search. - - } - > - - Index - - - - )} { onClick={handleDeleteFolder} disabled={isDeleteDisabled} className="showOnHoverKey" - aria-label="Delete Folder Keys" + aria-label={t('browser.tree.folder.deleteAria')} data-testid={`delete-folder-btn-${fullName}`} /> @@ -359,7 +284,10 @@ const Node = ({ data, isOpen, index, style, setOpen }: NodeProps) => { )} - {`${keyCount} key(s) (${Math.round(keyApproximate * 100) / 100}%)`} + {t('browser.tree.folder.keyCount', { + count: keyCount, + percentage: Math.round(keyApproximate * 100) / 100, + })} ) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.spec.tsx index 2952b6dee5..2a2418dff4 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.spec.tsx @@ -10,8 +10,17 @@ import { } from 'uiSrc/utils/test-utils' import { KeyTypes } from 'uiSrc/constants' import { deleteSelectedKey } from 'uiSrc/slices/browser/keys' +import { + useIsKeyIndexed, + UseIsKeyIndexedStatus, +} from 'uiSrc/pages/vector-search/hooks/useIsKeyIndexed' import { KeyDetailsHeaderProps, KeyDetailsHeader } from './KeyDetailsHeader' +jest.mock('uiSrc/pages/vector-search/hooks/useIsKeyIndexed', () => ({ + ...jest.requireActual('uiSrc/pages/vector-search/hooks/useIsKeyIndexed'), + useIsKeyIndexed: jest.fn(), +})) + const mockedProps = mock() const KEY_INPUT_TEST_ID = 'edit-key-input' @@ -25,6 +34,13 @@ beforeEach(() => { cleanup() store = cloneDeep(mockedStore) store.clearActions() + + jest.mocked(useIsKeyIndexed).mockReturnValue({ + isIndexed: false, + indexes: [], + status: UseIsKeyIndexedStatus.Idle, + refresh: jest.fn(), + }) }) jest.mock('uiSrc/slices/browser/string', () => ({ @@ -106,6 +122,22 @@ describe('KeyDetailsHeader', () => { ) }) + it('should refresh the key indexes on key refresh', () => { + const refresh = jest.fn() + jest.mocked(useIsKeyIndexed).mockReturnValue({ + isIndexed: false, + indexes: [], + status: UseIsKeyIndexedStatus.Idle, + refresh, + }) + + render() + + fireEvent.click(screen.getByTestId('key-refresh-btn')) + + expect(refresh).toHaveBeenCalled() + }) + describe('should call onDelete', () => { test.each(Object.values(KeyTypes))( 'should call onDelete for keyType: %s', diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.tsx index 97394f7e43..da5f47c3a3 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.tsx @@ -2,6 +2,7 @@ import React, { ReactElement } from 'react' import { isUndefined } from 'lodash' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import AutoSizer from 'react-virtualized-auto-sizer' +import { useTranslation } from 'uiSrc/i18n' import { GroupBadge, @@ -44,6 +45,7 @@ import { } from 'uiSrc/pages/vector-search/hooks/useIsKeyIndexed' import { ViewIndexDataButton } from 'uiSrc/pages/browser/components/view-index-data-button' import { MakeSearchableButton } from 'uiSrc/pages/browser/components/make-searchable-button' +import { ConfigValueDecoderButton } from 'uiSrc/pages/browser/components/value-decoder' import { KeyDetailsHeaderName } from './components/key-details-header-name' import { KeyDetailsHeaderTTL } from './components/key-details-header-ttl' import { KeyDetailsHeaderDelete } from './components/key-details-header-delete' @@ -85,16 +87,20 @@ const KeyDetailsHeader = ({ } = useAppSelector(selectedKeyDataSelector) ?? initialKeyInfo const { id: instanceId } = useAppSelector(connectedInstanceSelector) const { viewType } = useAppSelector(keysSelector) + const { t } = useTranslation() const isSearchableType = SEARCHABLE_KEY_TYPES.includes(type as KeyTypes) - const { indexes, status: keyIndexedStatus } = useIsKeyIndexed( - isSearchableType ? keyName || '' : '', - ) + const { + indexes, + status: keyIndexedStatus, + refresh: refreshKeyIndexes, + } = useIsKeyIndexed(isSearchableType ? keyName || '' : '') const dispatch = useAppDispatch() const handleRefreshKey = () => { dispatch(refreshKey(keyBuffer!, type, undefined, length)) + refreshKeyIndexes() } const handleEditTTL = (key: RedisResponseBuffer, ttl: number) => { @@ -165,25 +171,30 @@ const KeyDetailsHeader = ({ {isSearchableType && keyIndexedStatus === UseIsKeyIndexedStatus.Ready && ( - - - {indexes.length > 0 ? ( - + {indexes.length > 0 ? ( + + ) : ( + + - ) : ( - - - - )} - - + + )} + )} + {type === KeyTypes.Hash && ( + + + + + + )} {!arePanelsCollapsed && ( {(!arePanelsCollapsed || isFullScreen) && ( - + onCloseKey()} data-testid="close-key-btn" diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-delete/KeyDetailsHeaderDelete.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-delete/KeyDetailsHeaderDelete.tsx index 5470331d4f..aeb4d19ff3 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-delete/KeyDetailsHeaderDelete.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-delete/KeyDetailsHeaderDelete.tsx @@ -23,12 +23,14 @@ import { } from 'uiSrc/components/base/forms/buttons' import { ConfirmationPopover } from 'uiSrc/components' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' +import { useTranslation } from 'uiSrc/i18n' export interface Props { onDelete: (key: RedisResponseBuffer) => void } const KeyDetailsHeaderDelete = ({ onDelete }: Props) => { + const { t } = useTranslation() const { type, nameString: keyProp, @@ -78,14 +80,14 @@ const KeyDetailsHeaderDelete = ({ onDelete }: Props) => { button={ } title={tooltipContent} - message="will be deleted." + message={t('browser.keyDetails.delete.message')} confirmButton={ { onClick={() => onDelete(keyBuffer!)} data-testid="delete-key-confirm-btn" > - Delete + {t('browser.keyDetails.delete.button')} } /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.spec.tsx index 3769483760..9cdef1c49d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.spec.tsx @@ -25,6 +25,7 @@ describe('KeyValueFormatter', () => { 'Binary', 'HEX', 'JSON', + 'Markdown', 'Msgpack', 'Pickle', 'Protobuf', diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.tsx index c92ceb022a..6b15ad710a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.tsx @@ -6,7 +6,6 @@ import { KeyTypes, KeyValueFormat, MIDDLE_SCREEN_RESOLUTION, - TEXT_DISABLED_STRING_FORMATTING, } from 'uiSrc/constants' import { keysSelector, @@ -23,6 +22,7 @@ import { stringDataSelector } from 'uiSrc/slices/browser/string' import { isFullStringLoaded } from 'uiSrc/utils' import { RiTooltip } from 'uiSrc/components' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { Container, ControlsIcon, @@ -36,6 +36,7 @@ export interface Props { } const KeyDetailsHeaderFormatter = (props: Props) => { const { width } = props + const { t } = useTranslation() const { instanceId = '' } = useParams<{ instanceId: string }>() const { viewType } = useAppSelector(keysSelector) @@ -45,7 +46,6 @@ const KeyDetailsHeaderFormatter = (props: Props) => { const { value: keyValue } = useAppSelector(stringDataSelector) const [isSelectOpen, setIsSelectOpen] = useState(false) - const [typeSelected, setTypeSelected] = useState(viewFormat) const [options, setOptions] = useState([]) const dispatch = useAppDispatch() @@ -65,15 +65,15 @@ const KeyDetailsHeaderFormatter = (props: Props) => { data-test-subj={`format-option-${value}`} content={ !isStringFormattingEnabled - ? TEXT_DISABLED_STRING_FORMATTING - : typeSelected + ? t('browser.keyDetails.stringFormattingDisabled') + : viewFormat } position="top" anchorClassName="flex-row" > <> {width >= MIDDLE_SCREEN_RESOLUTION ? ( - {text} + {t(text)} ) : ( { size="s" data-test-subj={`format-option-${value}`} > - {text} + {t(text)} ), }), ) setOptions(newOptions) - }, [viewFormat, keyType, width, isStringFormattingEnabled]) + }, [viewFormat, keyType, width, isStringFormattingEnabled, t]) const onChangeType = (value: KeyValueFormat) => { sendEventTelemetry({ @@ -114,7 +114,6 @@ const KeyDetailsHeaderFormatter = (props: Props) => { }, }) - setTypeSelected(value) setIsSelectOpen(false) dispatch(setViewFormat(value)) } @@ -137,7 +136,7 @@ const KeyDetailsHeaderFormatter = (props: Props) => { } return option.inputDisplay as JSX.Element }} - value={typeSelected} + value={viewFormat} onChange={(value: any) => onChangeType(value)} data-testid="select-format-key-value" /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/constants.ts index 4580c7707a..b4f3f6ee43 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/constants.ts @@ -1,56 +1,65 @@ +import { ParseKeys } from 'i18next' import { KeyTypes, KeyValueFormat, ModulesKeyTypes } from 'uiSrc/constants' -export const KEY_VALUE_FORMATTER_OPTIONS = [ +// `text` holds an i18n key resolved with t() at render time. +export const KEY_VALUE_FORMATTER_OPTIONS: { + text: ParseKeys + value: KeyValueFormat +}[] = [ { - text: 'Unicode', + text: 'browser.keyDetails.formatter.unicode', value: KeyValueFormat.Unicode, }, { - text: 'ASCII', + text: 'browser.keyDetails.formatter.ascii', value: KeyValueFormat.ASCII, }, { - text: 'Binary', + text: 'browser.keyDetails.formatter.binary', value: KeyValueFormat.Binary, }, { - text: 'HEX', + text: 'browser.keyDetails.formatter.hex', value: KeyValueFormat.HEX, }, { - text: 'JSON', + text: 'browser.keyDetails.formatter.json', value: KeyValueFormat.JSON, }, { - text: 'Msgpack', + text: 'browser.keyDetails.formatter.markdown', + value: KeyValueFormat.Markdown, + }, + { + text: 'browser.keyDetails.formatter.msgpack', value: KeyValueFormat.Msgpack, }, { - text: 'Pickle', + text: 'browser.keyDetails.formatter.pickle', value: KeyValueFormat.Pickle, }, { - text: 'Protobuf', + text: 'browser.keyDetails.formatter.protobuf', value: KeyValueFormat.Protobuf, }, { - text: 'PHP serialized', + text: 'browser.keyDetails.formatter.php', value: KeyValueFormat.PHP, }, { - text: 'Java serialized', + text: 'browser.keyDetails.formatter.java', value: KeyValueFormat.JAVA, }, { - text: 'Vector 32-bit', + text: 'browser.keyDetails.formatter.vector32', value: KeyValueFormat.Vector32Bit, }, { - text: 'Vector 64-bit', + text: 'browser.keyDetails.formatter.vector64', value: KeyValueFormat.Vector64Bit, }, { - text: 'Timestamp to DateTime', + text: 'browser.keyDetails.formatter.dateTime', value: KeyValueFormat.DateTime, }, ] diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-name/KeyDetailsHeaderName.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-name/KeyDetailsHeaderName.tsx index 110f4afbe3..fba5dd4a9c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-name/KeyDetailsHeaderName.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-name/KeyDetailsHeaderName.tsx @@ -3,10 +3,11 @@ import cx from 'classnames' import { isNull } from 'lodash' import styled from 'styled-components' import { useAppSelector } from 'uiSrc/slices/hooks' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { formatLongName, isEqualBuffers, stringToBuffer } from 'uiSrc/utils' import InlineItemEditor from 'uiSrc/components/inline-item-editor/InlineItemEditor' -import { TEXT_UNPRINTABLE_CHARACTERS } from 'uiSrc/constants' +import { getTextUnprintableCharacters } from 'uiSrc/constants' import { AddCommonFieldsFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { initialKeyInfo, @@ -53,6 +54,7 @@ export interface Props { const COPY_KEY_NAME_ICON = 'copyKeyNameIcon' const KeyDetailsHeaderName = ({ onEditKey }: Props) => { + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) const { ttl: ttlProp, @@ -106,14 +108,18 @@ const KeyDetailsHeaderName = ({ onEditKey }: Props) => { !isNull(keyProp) ) { requestConfirmation({ - title: 'Rename key on production database?', + title: t('browser.keyDetails.name.renameConfirm.title'), actionDescription: ( - <> - You are about to rename {keyProp} to{' '} - {key} on a production database. - + }} + /> ), - confirmButtonText: 'Rename', + confirmButtonText: t('browser.keyDetails.name.renameConfirm.button'), commandId: BrowserConfirmationCommandId.RenameKey, disableConfirmationInput: true, onConfirm: () => @@ -162,7 +168,7 @@ const KeyDetailsHeaderName = ({ onEditKey }: Props) => { data-testid="edit-key-btn" > { applyEditKey()} isDisabled={!keyIsEditable} - disabledTooltipText={TEXT_UNPRINTABLE_CHARACTERS} + disabledTooltipText={getTextUnprintableCharacters(t)} onDecline={(event) => cancelEditKey(event)} viewChildrenMode={!keyIsEditing} isLoading={loading} @@ -208,7 +214,7 @@ const KeyDetailsHeaderName = ({ onEditKey }: Props) => { id={COPY_KEY_NAME_ICON} tooltipConfig={{ anchorClassName: styles.copyKey }} data-testid="copy-key-name" - aria-label="Copy Key Name" + aria-label={t('browser.keyDetails.name.copyAria')} /> )} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-size-length/KeyDetailsHeaderSizeLength.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-size-length/KeyDetailsHeaderSizeLength.tsx index e4d88693cb..edf4250473 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-size-length/KeyDetailsHeaderSizeLength.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-size-length/KeyDetailsHeaderSizeLength.tsx @@ -15,6 +15,7 @@ import { FlexItem } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -24,6 +25,7 @@ export interface Props { const KeyDetailsHeaderSizeLength = ({ width }: Props) => { const { type, size, length, quantType, vectorDim, count } = useAppSelector(selectedKeyDataSelector) ?? initialKeyInfo + const { t } = useTranslation() const isSizeTooLarge = size === -1 @@ -37,18 +39,19 @@ const KeyDetailsHeaderSizeLength = ({ width }: Props) => { data-testid="key-size-text" > {isSizeTooLarge - ? 'The key size is too large to run the MEMORY USAGE command, as it may lead to performance issues.' + ? t('browser.keyDetails.size.tooLarge') : formatBytes(size, 3)} } > <> - {width > MIDDLE_SCREEN_RESOLUTION && 'Key Size: '} + {width > MIDDLE_SCREEN_RESOLUTION && + t('browser.keyDetails.size.label')} {formatBytes(size, 0)} {isSizeTooLarge && ( <> @@ -73,7 +76,9 @@ const KeyDetailsHeaderSizeLength = ({ width }: Props) => { className={styles.subtitleText} data-testid="key-length-text" > - {LENGTH_NAMING_BY_TYPE[type] ?? 'Length'} + {t( + LENGTH_NAMING_BY_TYPE[type] ?? 'browser.keyDetails.length.default', + )} {': '} {length ?? '-'} @@ -85,7 +90,9 @@ const KeyDetailsHeaderSizeLength = ({ width }: Props) => { className={styles.subtitleText} data-testid="key-quant-type-text" > - {width > MIDDLE_SCREEN_RESOLUTION ? 'Quant type: ' : 'Q: '} + {width > MIDDLE_SCREEN_RESOLUTION + ? t('browser.keyDetails.quantType.full') + : t('browser.keyDetails.quantType.short')} {quantType} @@ -97,7 +104,9 @@ const KeyDetailsHeaderSizeLength = ({ width }: Props) => { className={styles.subtitleText} data-testid="key-vector-dim-text" > - {width > MIDDLE_SCREEN_RESOLUTION ? 'Vector dim: ' : 'Dim: '} + {width > MIDDLE_SCREEN_RESOLUTION + ? t('browser.keyDetails.vectorDim.full') + : t('browser.keyDetails.vectorDim.short')} {vectorDim} @@ -109,7 +118,9 @@ const KeyDetailsHeaderSizeLength = ({ width }: Props) => { className={styles.subtitleText} data-testid="key-count-text" > - {width > MIDDLE_SCREEN_RESOLUTION ? 'Count: ' : 'Cnt: '} + {width > MIDDLE_SCREEN_RESOLUTION + ? t('browser.keyDetails.count.full') + : t('browser.keyDetails.count.short')} {count} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-ttl/KeyDetailsHeaderTTL.tsx b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-ttl/KeyDetailsHeaderTTL.tsx index 64b7cb1d11..7636fe4ef6 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-ttl/KeyDetailsHeaderTTL.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-ttl/KeyDetailsHeaderTTL.tsx @@ -10,6 +10,7 @@ import { } from 'uiSrc/slices/browser/keys' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { MAX_TTL_NUMBER, validateTTLNumber } from 'uiSrc/utils' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { FlexItem, Grid } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' @@ -26,6 +27,7 @@ export interface Props { } const KeyDetailsHeaderTTL = ({ onEditTTL }: Props) => { + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) const { ttl: ttlProp, @@ -66,15 +68,22 @@ const KeyDetailsHeaderTTL = ({ onEditTTL }: Props) => { if (`${ttlProp}` !== ttlValue && keyBuffer) { requestConfirmation({ - title: 'Change TTL on production database?', + title: t('browser.keyDetails.ttl.changeConfirm.title'), actionDescription: ( - <> - You are about to change the TTL of {keyProp} to{' '} - {ttlValue === '-1' ? 'No limit' : `${ttlValue} s`}{' '} - on a production database. - + }} + /> ), - confirmButtonText: 'Change TTL', + confirmButtonText: t('browser.keyDetails.ttl.changeConfirm.button'), commandId: BrowserConfirmationCommandId.ChangeTtl, disableConfirmationInput: true, onConfirm: () => onEditTTL(keyBuffer, +ttlValue), @@ -143,7 +152,7 @@ const KeyDetailsHeaderTTL = ({ onEditTTL }: Props) => { ttlIsEditing && styles.editing, )} maxLength={200} - placeholder="No limit" + placeholder={t('browser.keyDetails.ttl.placeholder')} value={ttl === '-1' ? '' : ttl} fullWidth={false} compressed @@ -168,7 +177,7 @@ const KeyDetailsHeaderTTL = ({ onEditTTL }: Props) => { > TTL: - {ttl === '-1' ? 'No limit' : ttl} + {ttl === '-1' ? t('browser.keyDetails.ttl.noLimit') : ttl} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/ArrayDetails.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/ArrayDetails.spec.tsx index 998145fe2f..292fa5681e 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/ArrayDetails.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/ArrayDetails.spec.tsx @@ -3,6 +3,7 @@ import { instance, mock } from 'ts-mockito' import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' import { ArrayDetails, Props } from './ArrayDetails' +import i18n from 'uiSrc/i18n' import { ARRAY_DETAILS_TAB_LABELS, ArrayDetailsTab } from './constants' // Stub out the child components so this spec covers only the composition @@ -125,7 +126,9 @@ describe('ArrayDetails', () => { expect(screen.getByTestId('array-aggregate-form-mock')).not.toBeVisible() fireEvent.mouseDown( - screen.getByText(ARRAY_DETAILS_TAB_LABELS[ArrayDetailsTab.Search]), + screen.getByText( + i18n.t(ARRAY_DETAILS_TAB_LABELS[ArrayDetailsTab.Search]), + ), ) expect(screen.getByTestId('array-range-form-mock')).not.toBeVisible() @@ -133,7 +136,9 @@ describe('ArrayDetails', () => { expect(screen.getByTestId('array-aggregate-form-mock')).not.toBeVisible() fireEvent.mouseDown( - screen.getByText(ARRAY_DETAILS_TAB_LABELS[ArrayDetailsTab.Aggregate]), + screen.getByText( + i18n.t(ARRAY_DETAILS_TAB_LABELS[ArrayDetailsTab.Aggregate]), + ), ) expect(screen.getByTestId('array-range-form-mock')).not.toBeVisible() diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/aggregate-tab/AggregateTab.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/aggregate-tab/AggregateTab.tsx index 4cd199921b..e4ad4c84c9 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/aggregate-tab/AggregateTab.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/aggregate-tab/AggregateTab.tsx @@ -7,6 +7,7 @@ import { FlexItem } from 'uiSrc/components/base/layout/flex' import { Loader } from 'uiSrc/components/base/display' import { CopyButton } from 'uiSrc/components/copy-button' import { bufferToString } from 'uiSrc/utils' +import { useTranslation } from 'uiSrc/i18n' import { ArrayAggregateForm } from '../array-aggregate-form' import { useArrayAggregateQuery } from '../hooks' @@ -18,6 +19,7 @@ const AGGREGATE_TAB_TEST_ID = 'array-aggregate-tab' const NIL_RESULT_LABEL = '(nil)' const AggregateTab = ({ keyProp }: AggregateTabProps) => { + const { t } = useTranslation() const keyName = keyProp ? bufferToString(keyProp) : '' // Same lock the View range form uses: while an inline edit is open or its // ARSET is in flight, block a new AROP. Otherwise a user-initiated aggregate @@ -92,7 +94,7 @@ const AggregateTab = ({ keyProp }: AggregateTabProps) => { )} {showResult && ( - + { + const { t } = useTranslation() const dispatch = useAppDispatch() const { viewFormat, isRefreshDisabled } = useAppSelector(selectedKeySelector) // Resolve the target key from the live selection (like the List/Hash add @@ -121,9 +124,9 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { const handleAdd = () => { requestConfirmation({ - title: CONFIRM_TITLE, - actionDescription: CONFIRM_DESCRIPTION, - confirmButtonText: CONFIRM_BUTTON_TEXT, + title: t(CONFIRM_TITLE), + actionDescription: t(CONFIRM_DESCRIPTION), + confirmButtonText: t(CONFIRM_BUTTON_TEXT), commandId: BrowserConfirmationCommandId.AddArrayElements, disableConfirmationInput: true, onConfirm: () => { @@ -168,24 +171,24 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { - + @@ -198,7 +201,7 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { setMoveToElement(e.target.checked)} data-testid={`${TEST_ID}-move-to-element`} @@ -206,7 +209,7 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { @@ -225,7 +228,7 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { onClick={() => closePanel(true)} data-testid={`${TEST_ID}-cancel`} > - {CANCEL_BUTTON_LABEL} + {t(CANCEL_BUTTON_LABEL)} @@ -235,7 +238,7 @@ export const ArrayAddForm = ({ closePanel, onReveal }: ArrayAddFormProps) => { loading={updating} data-testid={`${TEST_ID}-submit`} > - {ADD_BUTTON_LABEL} + {t(ADD_BUTTON_LABEL)} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.constants.ts index 931c126442..fa450122fc 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.constants.ts @@ -1,19 +1,20 @@ +import { ParseKeys } from 'i18next' import { ArrayAggregateOperation } from 'uiSrc/slices/interfaces/array' export const ARRAY_AGGREGATE_FORM_TEST_ID = 'array-aggregate-form' -export const RUN_BUTTON_LABEL = 'Run' -export const RESET_TOOLTIP = 'Reset to defaults' -export const INVALID_INDEX_MESSAGE = - 'Index must be a valid 64-bit unsigned integer' +export const RUN_BUTTON_LABEL: ParseKeys = 'browser.array.form.run' +export const RESET_TOOLTIP: ParseKeys = 'browser.array.form.resetTooltip' +export const INVALID_INDEX_MESSAGE: ParseKeys = + 'browser.array.form.invalidIndex' /** * Mirror of the backend's `ARRAY_RANGE_MAX_ELEMENTS` cap — AROP reuses * `assertValidRange` so the same span limit applies. */ export const ARRAY_RANGE_MAX_SPAN = 1_000_000n -export const INVALID_RANGE_TOO_LARGE_MESSAGE = - 'Range too large — aggregate at most 1,000,000 indexes per query' +export const INVALID_RANGE_TOO_LARGE_MESSAGE: ParseKeys = + 'browser.array.aggregate.tooLarge' export const OPERATION_OPTIONS: ReadonlyArray<{ value: ArrayAggregateOperation diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.tsx index cec8f4a4e2..8262451d5c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-aggregate-form/ArrayAggregateForm.tsx @@ -9,10 +9,15 @@ import { TextInput } from 'uiSrc/components/base/inputs' import { defaultValueRender } from 'uiSrc/components/base/forms/select/RiSelect' import { parseArrayIndex } from 'uiSrc/utils/arrayIndex' import { ArrayAggregateOperation } from 'uiSrc/slices/interfaces/array' +import { + CommandPreview, + PreviewToggle, + useResponsivePreviewLabel, +} from 'uiSrc/pages/browser/modules/key-details/shared' + +import { useTranslation } from 'uiSrc/i18n' -import { CommandPreview } from '../command-preview' -import { PreviewToggle } from '../preview-toggle' -import { useResponsivePreviewLabel } from '../hooks' +import { ARRAY_COMMAND_PREVIEW_TEST_ID } from '../constants' import * as RangeStyles from '../array-range-form/ArrayRangeForm.styles' import * as S from './ArrayAggregateForm.styles' import { @@ -55,6 +60,7 @@ export const ArrayAggregateForm = ({ onReset, disabled = false, }: ArrayAggregateFormProps) => { + const { t } = useTranslation() const [previewVisible, setPreviewVisible] = useState(false) const { containerRef, isWide } = useResponsivePreviewLabel() @@ -74,11 +80,11 @@ export const ArrayAggregateForm = ({ // omitted `value` field, which the form never produces (defaults to ''). const formInvalid = startInvalid || endInvalid || spanInvalid - const startError = startInvalid ? INVALID_INDEX_MESSAGE : undefined + const startError = startInvalid ? t(INVALID_INDEX_MESSAGE) : undefined const endError = endInvalid - ? INVALID_INDEX_MESSAGE + ? t(INVALID_INDEX_MESSAGE) : spanInvalid - ? INVALID_RANGE_TOO_LARGE_MESSAGE + ? t(INVALID_RANGE_TOO_LARGE_MESSAGE) : undefined const command = useMemo(() => { @@ -94,7 +100,7 @@ export const ArrayAggregateForm = ({ - + - + - + ({ ...option, @@ -136,12 +142,12 @@ export const ArrayAggregateForm = ({ {operation === ArrayAggregateOperation.Match && ( - + @@ -159,17 +165,22 @@ export const ArrayAggregateForm = ({ /> - {previewVisible && } + {previewVisible && ( + + )} {onReset && ( - + @@ -181,7 +192,7 @@ export const ArrayAggregateForm = ({ disabled={formInvalid || loading || disabled} data-testid={`${TEST_ID}-run`} > - {RUN_BUTTON_LABEL} + {t(RUN_BUTTON_LABEL)} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.config.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.config.tsx index 4d51d4c114..7079ae6c53 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.config.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.config.tsx @@ -8,17 +8,24 @@ import { ArrayValueCell } from './components/ArrayValueCell' import { RowActionsCell } from './components/RowActionsCell' import { BulkDeleteHeaderCell } from './components/BulkDeleteHeaderCell' import { ArrayTableConfig } from './ArrayDetailsTable.types' +import { + ACTIONS_COLUMN_CELL_CLASS, + ACTIONS_COLUMN_SIZE, + INDEX_COLUMN_SIZE, + SELECTION_COLUMN_WIDTH_REM, + VALUE_COLUMN_SIZE, +} from './constants' export const TEST_ID = 'array-details-table' -const ACTIONS_COLUMN_SIZE = 48 - const indexColumn: ColumnDef = { id: 'index', accessorKey: 'index', - header: 'Index', + header: 'browser.array.column.index', enableSorting: false, enableResizing: true, + size: INDEX_COLUMN_SIZE, + sizeUnit: 'px', cell: ({ row }: CellContext) => ( = { const valueColumn: ColumnDef = { id: 'value', accessorKey: 'value', - header: 'Value', + header: 'browser.array.column.value', enableSorting: false, enableResizing: true, + size: VALUE_COLUMN_SIZE, + sizeUnit: 'px', cell: ({ row, table }: CellContext) => { const { compressor, @@ -62,28 +71,64 @@ const valueColumn: ColumnDef = { } /** - * Delete column, appended only when the consumer passes a `deleteConfig` (via - * `meta`). The header hosts the bulk-delete trigger (shown only while rows are - * selected); each cell hosts the per-row trash. The cell renders nothing for - * empty slots. + * Row-actions column hosting the per-row edit, expand and delete affordances + * (revealed on hover). The header hosts the bulk-delete trigger (shown only + * while rows are selected). Editing wiring is always present in `meta`, so the + * cell derives an `editConfig` from it; `deleteConfig` is forwarded only when + * the consumer enables deletion. */ export const actionsColumn: ColumnDef = { id: 'actions', // Custom so the header renders the bulk trigger raw, not as a column title. isHeaderCustom: true, header: ({ table }) => { - const { bulkDeleteConfig } = table.options.meta as ArrayTableConfig - if (!bulkDeleteConfig) return null + const { bulkDeleteConfig, isValueDrawerOpen, editingIndex, updating } = + table.options.meta as ArrayTableConfig + // Freeze bulk delete during any edit or in-flight write — the selection may + // include the edited element, whose pending ARSET would resurrect it. + if ( + !bulkDeleteConfig || + isValueDrawerOpen || + editingIndex !== null || + updating + ) + return null return }, enableSorting: false, enableResizing: false, size: ACTIONS_COLUMN_SIZE, sizeUnit: 'px', + // Center the bulk trigger in the header cell (see ArrayDetailsTable.styles). + getHeaderCellProps: () => ({ className: ACTIONS_COLUMN_CELL_CLASS }), cell: ({ row, table }: CellContext) => { - const { deleteConfig } = table.options.meta as ArrayTableConfig - if (!deleteConfig) return null - return + const { + compressor, + viewFormat, + editingIndex, + isValueDrawerOpen, + updating, + loading, + onEditElement, + onOpenValueEditor, + deleteConfig, + } = table.options.meta as ArrayTableConfig + return ( + + ) }, } @@ -97,5 +142,21 @@ export const arrayColumns: ColumnDef[] = [ valueColumn, ] -const MIN_COLUMN_WIDTH = 160 -export const TABLE_MIN_WIDTH = `${arrayColumns.length * MIN_COLUMN_WIDTH}px` +// Width below which the table scrolls horizontally instead of squeezing the +// index/value columns. Sums every column present — including the optional +// selection (rem) and actions (px) columns, hence the calc. +export const getTableMinWidth = ({ + hasSelectionColumn, + hasActionsColumn, +}: { + hasSelectionColumn: boolean + hasActionsColumn: boolean +}): string => { + const pxColumns = + INDEX_COLUMN_SIZE + + VALUE_COLUMN_SIZE + + (hasActionsColumn ? ACTIONS_COLUMN_SIZE : 0) + return hasSelectionColumn + ? `calc(${pxColumns}px + ${SELECTION_COLUMN_WIDTH_REM}rem)` + : `${pxColumns}px` +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.spec.tsx index f7b268f085..399738fa3c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.spec.tsx @@ -15,7 +15,13 @@ import { apiService } from 'uiSrc/services' import keysReducer, { refreshKeyInfoSuccess, setSelectedKeyRefreshDisabled, + setViewFormat, } from 'uiSrc/slices/browser/keys' +import instancesReducer, { + setConnectedInstanceId, +} from 'uiSrc/slices/instances/instances' +import contextReducer, { setBrowserSelectedKey } from 'uiSrc/slices/app/context' +import { KeyValueFormat } from 'uiSrc/constants' import { stringToBuffer } from 'uiSrc/utils' import { ArrayDataElement } from 'uiSrc/slices/interfaces/array' import { @@ -25,6 +31,39 @@ import { import { ArrayDetailsTable } from './ArrayDetailsTable' +jest.mock('uiSrc/components/base/code-editor', () => { + const ReactMock = require('react') + return { + __esModule: true, + CodeEditor: (props: any) => + ReactMock.createElement('textarea', { + 'data-testid': 'array-value-code-editor', + value: props.value, + onChange: (e: any) => props.onChange?.(e.target.value), + }), + } +}) + +// Production-write confirmation: auto-confirm by default (matching the no-op +// context), but a test can flip `mockAutoConfirm` off to hold the confirmation +// pending and fire `mockPendingConfirm()` itself. +let mockAutoConfirm = true +let mockPendingConfirm: (() => void) | null = null +jest.mock('uiSrc/components/production-write-confirmation', () => ({ + ...jest.requireActual('uiSrc/components/production-write-confirmation'), + useProductionWriteConfirmation: () => ({ + requestConfirmation: ({ onConfirm }: { onConfirm: () => void }) => { + mockPendingConfirm = onConfirm + if (mockAutoConfirm) onConfirm() + }, + }), +})) + +afterEach(() => { + mockAutoConfirm = true + mockPendingConfirm = null +}) + // Store whose selected key is set but whose array `data.keyName` is still // empty — the Search-tab / pre-View-load condition the edit key must survive. const storeWithSelectedKey = (name: string) => { @@ -133,7 +172,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) expect( screen.getByTestId('array-details-table_value-editor-1'), @@ -167,17 +206,13 @@ describe('ArrayDetailsTable', () => { ) }) - expect( - screen.getByTestId('array-details-table_edit-btn-1'), - ).toBeDisabled() + expect(screen.getByTestId('array-edit-btn-1')).toBeDisabled() }) it('does not offer editing for an empty slot', () => { renderComponent([arrayElementFactory.build({ index: '3' })]) - expect( - screen.queryByTestId('array-details-table_edit-btn-3'), - ).not.toBeInTheDocument() + expect(screen.queryByTestId('array-edit-btn-3')).not.toBeInTheDocument() expect( screen.getByTestId('array-details-table-empty-3'), ).toBeInTheDocument() @@ -195,7 +230,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) fireEvent.change( screen.getByTestId('array-details-table_value-editor-1'), @@ -214,6 +249,53 @@ describe('ArrayDetailsTable', () => { postSpy.mockRestore() }) + it('skips the inline ARSET when the database changed since the editor opened', async () => { + const postSpy = jest + .spyOn(apiService, 'post') + .mockResolvedValue({ status: 200, data: '' }) + const state = cloneDeep(initialStateDefault) + state.browser.keys.selectedKey.data = { + name: stringToBuffer('mykey'), + } as any + state.connections.instances.connectedInstance = { id: 'db-1' } as any + const store = mockStore(state) + + render( + , + { store }, + ) + + // Open the editor while connected to db-1 (captured as the write guard). + act(() => { + fireEvent.mouseEnter( + screen.getByTestId('array-details-table_content-value-1'), + ) + }) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) + fireEvent.change( + screen.getByTestId('array-details-table_value-editor-1'), + { target: { value: 'updated' } }, + ) + + // The connection switches to another database before Save is confirmed. + state.connections.instances.connectedInstance = { id: 'db-2' } as any + + await act(async () => { + fireEvent.click(screen.getByTestId('apply-btn')) + }) + + const setCall = postSpy.mock.calls.find(([url]) => + (url as string).includes('array/set-element'), + ) + expect(setCall).toBeFalsy() + + postSpy.mockRestore() + }) + it('uses the selected key name for ARSET even when the View range has not loaded', async () => { const postSpy = jest .spyOn(apiService, 'post') @@ -234,7 +316,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) fireEvent.change( screen.getByTestId('array-details-table_value-editor-1'), { target: { value: 'updated' } }, @@ -261,6 +343,7 @@ describe('ArrayDetailsTable', () => { keys.selectedKey.data = { name: stringToBuffer('mykey') } as any const store = configureStore({ reducer: combineReducers({ + app: (s = initialStateDefault.app) => s, browser: combineReducers({ keys: keysReducer, array: (s = initialStateDefault.browser.array) => s, @@ -288,7 +371,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) expect( screen.getByTestId('array-details-table_value-editor-1'), ).toBeInTheDocument() @@ -333,7 +416,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) fireEvent.change( screen.getByTestId('array-details-table_value-editor-1'), { target: { value: 'first' } }, @@ -348,7 +431,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) expect( screen.getByTestId('array-details-table_value-editor-1'), ).toBeInTheDocument() @@ -382,7 +465,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) expect(store.getActions()).toContainEqual( setSelectedKeyRefreshDisabled(true), ) @@ -414,7 +497,7 @@ describe('ArrayDetailsTable', () => { screen.getByTestId('array-details-table_content-value-1'), ) }) - fireEvent.click(screen.getByTestId('array-details-table_edit-btn-1')) + fireEvent.click(screen.getByTestId('array-edit-btn-1')) expect( screen.getByTestId('array-details-table_value-editor-1'), ).toBeInTheDocument() @@ -464,9 +547,7 @@ describe('ArrayDetailsTable', () => { screen.getAllByTestId('array-details-table_content-value-1')[0], ) }) - fireEvent.click( - screen.getAllByTestId('array-details-table_edit-btn-1')[0], - ) + fireEvent.click(screen.getAllByTestId('array-edit-btn-1')[0]) // The hidden sibling must not re-enable refresh during the edit. const refreshActions = store @@ -476,6 +557,433 @@ describe('ArrayDetailsTable', () => { }) }) + describe('Monaco drawer (expand)', () => { + const withValue = (index: string, text: string) => { + const element = arrayElementWithValueFactory.build({ index }) + element.value = stringToBuffer(text) as typeof element.value + return element + } + + it('opens the drawer seeded with the value on expand', () => { + render( + , + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + + expect(screen.getByTestId('array-value-code-editor')).toHaveValue('hello') + }) + + it('pauses the key-header refresh while the drawer is open', () => { + const store = mockStore(cloneDeep(initialStateDefault)) + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + + expect(store.getActions()).toContainEqual( + setSelectedKeyRefreshDisabled(true), + ) + }) + + it('abandons the open drawer when the tab is hidden', () => { + const element = withValue('1', 'hello') + const { rerender } = render( + , + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + + rerender( + , + ) + + expect( + screen.queryByTestId('array-value-code-editor'), + ).not.toBeInTheDocument() + }) + + it('closes an inline edit on another row when the drawer opens', () => { + render( + , + ) + + // Open inline edit on row 0. + fireEvent.click(screen.getByTestId('array-edit-btn-0')) + expect( + screen.getByTestId('array-details-table_value-editor-0'), + ).toBeInTheDocument() + + // Open the drawer on row 1 — the inline editor on row 0 must close, so a + // later drawer save can't clear it and drop its unsaved text. + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + + expect( + screen.queryByTestId('array-details-table_value-editor-0'), + ).not.toBeInTheDocument() + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + }) + + it('hides all row edit/expand triggers while the drawer is open', () => { + render( + , + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + + // No second editor can be opened while the drawer is up — a re-open would + // otherwise re-seed the drawer and drop unsaved text. + expect(screen.queryByTestId('array-edit-btn-0')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-0')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-1')).not.toBeInTheDocument() + }) + + it('closes the drawer when the value formatter changes', () => { + // The seed was serialized under the previous format; re-serializing it + // under a new one on Save would write different bytes. + const keys = cloneDeep(initialStateDefault.browser.keys) + keys.selectedKey.data = { name: stringToBuffer('mykey') } as any + keys.selectedKey.viewFormat = KeyValueFormat.Unicode + const store = configureStore({ + reducer: combineReducers({ + app: (s = initialStateDefault.app) => s, + browser: combineReducers({ + keys: keysReducer, + array: (s = initialStateDefault.browser.array) => s, + }), + connections: combineReducers({ + instances: (s = initialStateDefault.connections.instances) => s, + }), + }), + preloadedState: { browser: { keys } }, + middleware: (getDefault) => + getDefault({ serializableCheck: false, immutableCheck: false }), + }) + + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + + act(() => { + store.dispatch(setViewFormat(KeyValueFormat.HEX)) + }) + + expect( + screen.queryByTestId('array-value-code-editor'), + ).not.toBeInTheDocument() + }) + + it('closes the drawer only after the save succeeds (not optimistically)', async () => { + const postSpy = jest + .spyOn(apiService, 'post') + .mockResolvedValue({ status: 200, data: '' }) + const state = cloneDeep(initialStateDefault) + state.browser.keys.selectedKey.data = { + name: stringToBuffer('mykey'), + } as any + // Live selection + instance must match for the thunk's success callback + // (which closes the drawer) to fire. + state.app.context.browser.keyList.selectedKey = stringToBuffer( + 'mykey', + ) as any + state.connections.instances.connectedInstance = { id: 'db-1' } as any + const store = mockStore(state) + + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'updated' }, + }) + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + + // Still open synchronously after Save — closes only when the ARSET + // success callback runs. + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + await waitFor(() => { + expect( + screen.queryByTestId('array-value-code-editor'), + ).not.toBeInTheDocument() + }) + + postSpy.mockRestore() + }) + + it('skips the drawer ARSET when the database changed since the drawer opened', async () => { + const postSpy = jest + .spyOn(apiService, 'post') + .mockResolvedValue({ status: 200, data: '' }) + // A real instances reducer so switching the connected database re-renders + // the table — the drawer must guard its save with the database captured + // when it *opened*, not when Save was clicked. + const keys = cloneDeep(initialStateDefault.browser.keys) + keys.selectedKey.data = { name: stringToBuffer('mykey') } as any + const store = configureStore({ + reducer: combineReducers({ + app: (s = initialStateDefault.app) => s, + browser: combineReducers({ + keys: (s = keys) => s, + array: (s = initialStateDefault.browser.array) => s, + }), + connections: combineReducers({ instances: instancesReducer }), + }), + preloadedState: { + connections: { + instances: { + ...initialStateDefault.connections.instances, + connectedInstance: { + ...initialStateDefault.connections.instances.connectedInstance, + id: 'db-1', + }, + }, + }, + }, + middleware: (getDefault) => + getDefault({ serializableCheck: false, immutableCheck: false }), + }) + + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'updated' }, + }) + + // Connection switches before Save is confirmed. + act(() => { + store.dispatch(setConnectedInstanceId('db-2')) + }) + + await act(async () => { + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + }) + + const setCall = postSpy.mock.calls.find(([url]) => + (url as string).includes('array/set-element'), + ) + expect(setCall).toBeFalsy() + + postSpy.mockRestore() + }) + + it('dispatches ARSET when the drawer value is saved', async () => { + const postSpy = jest + .spyOn(apiService, 'post') + .mockResolvedValue({ status: 200, data: '' }) + const store = storeWithSelectedKey('mykey') + + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'updated' }, + }) + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + + await waitFor(() => { + const setCall = postSpy.mock.calls.find(([url]) => + (url as string).includes('array/set-element'), + ) + expect(setCall).toBeTruthy() + expect((setCall?.[1] as { index: string }).index).toBe('1') + }) + + postSpy.mockRestore() + }) + + it('does not close a reopened drawer when a stale save from the previous session succeeds', async () => { + const state = cloneDeep(initialStateDefault) + state.browser.keys.selectedKey.data = { + name: stringToBuffer('mykey'), + } as any + state.app.context.browser.keyList.selectedKey = stringToBuffer( + 'mykey', + ) as any + state.connections.instances.connectedInstance = { id: 'db-1' } as any + const store = mockStore(state) + + let resolvePost: () => void = () => {} + const postSpy = jest.spyOn(apiService, 'post').mockImplementation( + () => + new Promise((r) => { + resolvePost = () => r({ status: 200, data: '' } as any) + }), + ) + + render( + , + { store }, + ) + + // Session 1: expand row 1, save — the ARSET stays in flight. + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'updated' }, + }) + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + + // Abandon and reopen on row 2 — a new session. + fireEvent.click(screen.getByTestId('array-value-editor-cancel-btn')) + fireEvent.click(screen.getByTestId('array-expand-btn-2')) + + // Row 1's late success must not close row 2's freshly opened drawer. + await act(async () => { + resolvePost() + }) + expect( + screen.getByLabelText('Save value for index 2'), + ).toBeInTheDocument() + + postSpy.mockRestore() + }) + + it('abandons a pending drawer save when the table unmounts before Confirm', async () => { + mockAutoConfirm = false + const postSpy = jest + .spyOn(apiService, 'post') + .mockResolvedValue({ status: 200, data: '' }) + const state = cloneDeep(initialStateDefault) + state.browser.keys.selectedKey.data = { + name: stringToBuffer('mykey'), + } as any + state.app.context.browser.keyList.selectedKey = stringToBuffer( + 'mykey', + ) as any + state.connections.instances.connectedInstance = { id: 'db-1' } as any + const store = mockStore(state) + + const { unmount } = render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'updated' }, + }) + // Save opens the confirmation but leaves it pending. + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + + // A key switch tears the table down before the user confirms. + unmount() + await act(async () => { + mockPendingConfirm?.() + }) + + const setCall = postSpy.mock.calls.find(([url]) => + (url as string).includes('array/set-element'), + ) + expect(setCall).toBeFalsy() + + postSpy.mockRestore() + }) + + it('abandons the drawer when the live selection changes while selectedKeyData lags', () => { + // keyName (from selectedKeyData) lags a key switch during fetchKeyInfo, + // so the abandon guard keys off the live app-context selection instead. + // Hold selectedKeyData on 'mykey' and move only the live selection. + const keys = cloneDeep(initialStateDefault.browser.keys) + keys.selectedKey.data = { name: stringToBuffer('mykey') } as any + const store = configureStore({ + reducer: combineReducers({ + app: combineReducers({ context: contextReducer }), + browser: combineReducers({ + keys: (s = keys) => s, + array: (s = initialStateDefault.browser.array) => s, + }), + connections: combineReducers({ + instances: (s = initialStateDefault.connections.instances) => s, + }), + }), + middleware: (getDefault) => + getDefault({ serializableCheck: false, immutableCheck: false }), + }) + store.dispatch(setBrowserSelectedKey(stringToBuffer('mykey'))) + + render( + , + { store }, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-1')) + expect(screen.getByTestId('array-value-code-editor')).toBeInTheDocument() + + // Live selection moves on while selectedKeyData still points at 'mykey'. + act(() => { + store.dispatch(setBrowserSelectedKey(stringToBuffer('otherkey'))) + }) + + expect( + screen.queryByTestId('array-value-code-editor'), + ).not.toBeInTheDocument() + }) + }) + it('renders an expanded panel when a row is expanded via row click', async () => { const user = userEvent.setup() render( @@ -584,4 +1092,25 @@ describe('ArrayDetailsTable', () => { screen.queryByRole('checkbox', { name: /all rows/i }), ).not.toBeInTheDocument() }) + + it('freezes the bulk-delete trigger while a row is being inline-edited', () => { + render( + , + ) + + expect(screen.getByTestId('array-bulk-remove-btn-icon')).toBeInTheDocument() + + // A selection may include the edited row, whose pending ARSET would + // resurrect it, so bulk delete is frozen while an edit is open. + fireEvent.click(screen.getByTestId('array-edit-btn-0')) + + expect( + screen.queryByTestId('array-bulk-remove-btn-icon'), + ).not.toBeInTheDocument() + }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.styles.ts index db7c5ece52..2b77626f2a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.styles.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.styles.ts @@ -3,6 +3,11 @@ import { FlexItem } from 'uiSrc/components/base/layout/flex' import { Table, TableProps } from 'uiSrc/components/base/layout/table' import { ArrayDataElement } from 'uiSrc/slices/interfaces/array' +import { + ACTIONS_COLUMN_CELL_CLASS, + SELECTION_COLUMN_CELL_CLASS, +} from './constants' + export const Container = styled(FlexItem)` display: flex; flex: 1; @@ -31,4 +36,27 @@ export const StyledTable = styled(Table)` [data-role='table-body'] .array-row-action--open { opacity: 1; } + + /* Trim the selection column's wide side padding and center the checkbox in it. + The element+class selector outranks the base cell padding (no !important). */ + th.${SELECTION_COLUMN_CELL_CLASS}, td.${SELECTION_COLUMN_CELL_CLASS} { + padding-left: ${({ theme }) => theme.core.space.space050}; + padding-right: ${({ theme }) => theme.core.space.space050}; + } + th.${SELECTION_COLUMN_CELL_CLASS} > *, + td.${SELECTION_COLUMN_CELL_CLASS} > * { + width: 100%; + justify-content: center; + } + + /* Actions column header: trim the side padding so the bulk trigger centers + in the column instead of hugging the padding. */ + th.${ACTIONS_COLUMN_CELL_CLASS} { + padding-left: ${({ theme }) => theme.core.space.space050}; + padding-right: ${({ theme }) => theme.core.space.space050}; + } + th.${ACTIONS_COLUMN_CELL_CLASS} > * { + width: 100%; + justify-content: center; + } ` as unknown as (props: TableProps) => JSX.Element diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.tsx index 69f5e88582..dbf02f18d3 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.tsx @@ -9,6 +9,7 @@ import React, { import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' +import { appContextSelectedKey } from 'uiSrc/slices/app/context' import { selectedKeyDataSelector, selectedKeySelector, @@ -22,16 +23,27 @@ import { import { KeyValueCompressor } from 'uiSrc/constants' import { Nullable, stringToSerializedBufferFormat } from 'uiSrc/utils' import { Row, Table } from 'uiSrc/components/base/layout/table' +import { + BrowserConfirmationCommandId, + useProductionWriteConfirmation, +} from 'uiSrc/components/production-write-confirmation' import { ArrayDataElement } from 'uiSrc/slices/interfaces/array' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' +import { useTranslation } from 'uiSrc/i18n' +import { ParseKeys } from 'i18next' import { ARRAY_TABLE_EMPTY_MESSAGE, ARRAY_TABLE_LOADING_MESSAGE, + SELECTION_COLUMN_CELL_CLASS, + SELECTION_COLUMN_WIDTH_REM, } from './constants' +import { getArrayElementEditState } from './getArrayElementEditState' +import { ArrayValueEditorDrawer } from './components/ArrayValueEditorDrawer' import { actionsColumn, arrayColumns, - TABLE_MIN_WIDTH, + getTableMinWidth, TEST_ID, } from './ArrayDetailsTable.config' import { @@ -60,10 +72,14 @@ const ArrayDetailsTable = memo( selectionConfig, bulkDeleteConfig, }: ArrayDetailsTableProps) => { + const { t } = useTranslation() const dispatch = useAppDispatch() - const { compressor = null } = useAppSelector( + const { compressor = null, id: connectedInstanceId } = useAppSelector( connectedInstanceSelector, - ) as unknown as { compressor: Nullable } + ) as unknown as { + compressor: Nullable + id?: string + } const { viewFormat } = useAppSelector(selectedKeySelector) const { updating, @@ -83,13 +99,41 @@ const ArrayDetailsTable = memo( const { name: keyName } = useAppSelector(selectedKeyDataSelector) ?? { name: '', } + // The live selection — updated on key click, before fetchKeyInfo. Unlike + // `keyName` (from selectedKeyData) it doesn't lag a switch. + const liveSelectedKey = useAppSelector(appContextSelectedKey) + + const { requestConfirmation } = useProductionWriteConfirmation() - // Index of the row currently being edited; only one row edits at a time. const [editingIndex, setEditingIndex] = useState>(null) + // Row open in the Monaco drawer, plus its open-time seed. Held table-level + // (not per-row) so the drawer shares the inline editor's guards. + const [drawerIndex, setDrawerIndex] = useState>(null) + const [drawerSeed, setDrawerSeed] = useState('') + // Mirrors `drawerIndex` for reads inside the async production-write + // confirmation callback, so a pending save can tell whether the drawer was + // abandoned (closed, or moved to another row) while the dialog was open. + const drawerIndexRef = useRef>(null) + useEffect(() => { + drawerIndexRef.current = drawerIndex + }, [drawerIndex]) // Identifies the current edit session. Bumped whenever an editor opens, so // a still-in-flight save from a previous session can't close an editor the // user has since reopened (which would discard the new input). const editSessionRef = useRef(0) + // Live mirror of the connected database id, so the stable open/apply + // callbacks can read it without a stale closure. + const connectedInstanceIdRef = useRef(connectedInstanceId) + useEffect(() => { + connectedInstanceIdRef.current = connectedInstanceId + }, [connectedInstanceId]) + // Database connected when the inline editor opened. Its Save confirmation + // (in EditableTextArea) can be confirmed after a database switch, so the + // write is guarded with this id to avoid saving into the new database. + const inlineEditInstanceIdRef = useRef(undefined) + // Same guard for the drawer, captured when it opens (not at Save) so a + // switch before the save still skips the write. + const drawerEditInstanceIdRef = useRef(undefined) // Only the visible tab's table drives the editor-driven refresh pause, so // a hidden table can't re-enable refresh while the active one has an editor @@ -99,8 +143,12 @@ const ArrayDetailsTable = memo( // active table reacts to it.) useEffect(() => { if (!isActive) return - dispatch(setSelectedKeyRefreshDisabled(editingIndex !== null || updating)) - }, [isActive, editingIndex, updating, dispatch]) + dispatch( + setSelectedKeyRefreshDisabled( + editingIndex !== null || drawerIndex !== null || updating, + ), + ) + }, [isActive, editingIndex, drawerIndex, updating, dispatch]) // When a table is hidden (tab switch) or unmounts, it releases the shared // flag but still respects an in-flight write (global), so switching to a @@ -110,29 +158,49 @@ const ArrayDetailsTable = memo( dispatch(setSelectedKeyRefreshDisabled(updating)) }, [isActive, updating, dispatch]) - // Abandon an open editor when this table is hidden (tab switch) or the key - // changes, so a background editor can't keep refresh disabled and a stale - // editing state can't carry over. + // Abandon an open editor (inline or drawer) when this table is hidden (tab + // switch) or the key changes, so a background editor can't keep refresh + // disabled, leave a portaled drawer visible over the other tab, or carry + // stale editing state across keys. useEffect(() => { - if (!isActive) setEditingIndex(null) + if (!isActive) { + setEditingIndex(null) + setDrawerIndex(null) + } }, [isActive]) - // Abandon an open editor only on a *real* key change. `keyName` is the - // selected key's name buffer, and the post-ARSET `refreshKeyInfoAction` - // swaps in a new buffer instance for the same key — comparing by value - // (not reference) stops that refresh from closing an editor the user has - // meanwhile reopened on another row. - const prevKeyRef = useRef(keyName) + // Abandon an open editor on a real key change, keyed off the live + // selection — `keyName` lags a switch during fetchKeyInfo, which would let + // a pending drawer save ARSET the old key. Compare by value so a same-key + // info refresh (a fresh buffer for the same key) doesn't close the editor. + const prevKeyRef = useRef(liveSelectedKey) useEffect(() => { - if (isSameKey(prevKeyRef.current, keyName)) return - prevKeyRef.current = keyName + if (isSameKey(prevKeyRef.current, liveSelectedKey)) return + prevKeyRef.current = liveSelectedKey setEditingIndex(null) - }, [keyName]) + setDrawerIndex(null) + }, [liveSelectedKey]) - // Re-enable refresh when the table unmounts entirely (panel close). + // Abandon an open editor when the value formatter changes. The editor seed + // was serialized under the previous format, but a save re-serializes with + // the current `viewFormat` — saving the unchanged seed under a new format + // would write different bytes (e.g. "41" as Unicode vs the byte 0x41 as + // HEX). + const prevFormatRef = useRef(viewFormat) + useEffect(() => { + if (prevFormatRef.current === viewFormat) return + prevFormatRef.current = viewFormat + setEditingIndex(null) + setDrawerIndex(null) + }, [viewFormat]) + + // Re-enable refresh when the table unmounts (panel close), and abandon a + // pending drawer save — otherwise Confirm could ARSET the old key after a + // key switch unmounts the table. useEffect( () => () => { dispatch(setSelectedKeyRefreshDisabled(false)) + drawerIndexRef.current = null }, [dispatch], ) @@ -141,14 +209,25 @@ const ArrayDetailsTable = memo( (index: string, isEditing: boolean) => { // Opening an editor starts a new session; a stale save's callback that // compares against its captured session id will then no-op. - if (isEditing) editSessionRef.current += 1 + if (isEditing) { + editSessionRef.current += 1 + // Capture the connected database to guard a save confirmed later. + inlineEditInstanceIdRef.current = connectedInstanceIdRef.current + // Inline and drawer are one mutually-exclusive edit session — opening + // inline closes any open drawer. + setDrawerIndex(null) + } setEditingIndex(isEditing ? index : null) }, [], ) const handleApplyEditElement = useCallback( - (index: string, value: string) => { + ( + index: string, + value: string, + options?: { startInstanceId?: string; onSuccess?: () => void }, + ) => { const editSession = editSessionRef.current dispatch( updateArrayElementAction( @@ -156,21 +235,86 @@ const ArrayDetailsTable = memo( key: keyName, index, value: stringToSerializedBufferFormat(viewFormat, value), + // Inline saves fall back to the open-time id; the drawer passes + // its own save-time id. + startInstanceId: + options?.startInstanceId ?? inlineEditInstanceIdRef.current, }, - () => { - // Ignore a completion whose editor the user has since closed and - // reopened (a newer session) — closing it would discard the new - // input. handleEditElement's own guard runs for the live session. - if (editSessionRef.current === editSession) { - handleEditElement(index, false) - } - }, + options?.onSuccess ?? + (() => { + // Ignore a completion whose editor the user has since closed + // and reopened (a newer session) — closing it would discard the + // new input. handleEditElement's guard runs for the live session. + if (editSessionRef.current === editSession) { + handleEditElement(index, false) + } + }), ), ) }, [dispatch, keyName, viewFormat, handleEditElement], ) + // Open the Monaco drawer for a row, capturing its serialized value as the + // seed. Guarded like the inline editor: refresh pauses while it's open. + const handleOpenValueEditor = useCallback( + (index: string) => { + const element = elements.find((el) => el.index === index) + if (!element?.value) return + const { serialize } = getArrayElementEditState( + element.value as RedisResponseBuffer, + compressor, + viewFormat, + t, + ) + setDrawerSeed(serialize()) + // Capture the connected database to guard a save confirmed later. + drawerEditInstanceIdRef.current = connectedInstanceIdRef.current + // Opening the drawer starts a new edit session (like inline) so a + // stale save's onSuccess can't close a drawer the user has since + // reopened. + editSessionRef.current += 1 + // Inline and drawer are one mutually-exclusive edit session — opening + // the drawer closes any open inline edit, so a later drawer save can't + // clear a still-open inline editor on another row. + setEditingIndex(null) + setDrawerIndex(index) + }, + [elements, compressor, viewFormat], + ) + + const handleDrawerSave = useCallback( + (value: string) => { + const savedIndex = drawerIndex + const savedInstanceId = drawerEditInstanceIdRef.current + if (savedIndex === null) return + requestConfirmation({ + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t('browser.keyDetails.editable.confirmMessage'), + confirmButtonText: t('browser.keyDetails.editable.confirmButton'), + commandId: BrowserConfirmationCommandId.EditValue, + disableConfirmationInput: true, + onConfirm: () => { + // Skip if the drawer was abandoned (Cancel, key/format change, tab + // switch) while the confirmation was pending. + if (drawerIndexRef.current !== savedIndex) return + const editSession = editSessionRef.current + handleApplyEditElement(savedIndex, value, { + // Skip the write if the database changed since Save. + startInstanceId: savedInstanceId, + // Close the drawer only on a successful write for the current + // session — a skipped, failed or superseded save leaves the edit + // in place. + onSuccess: () => { + if (editSessionRef.current === editSession) setDrawerIndex(null) + }, + }) + }, + }) + }, + [drawerIndex, requestConfirmation, handleApplyEditElement], + ) + // Pass shared per-cell config via the table's `meta` so the static // column defs in `ArrayDetailsTable.config` don't need to close over // them and can be rebuilt only when their inputs change. @@ -179,8 +323,10 @@ const ArrayDetailsTable = memo( compressor, viewFormat, editingIndex, + isValueDrawerOpen: drawerIndex !== null, onEditElement: handleEditElement, onApplyEditElement: handleApplyEditElement, + onOpenValueEditor: handleOpenValueEditor, updating, loading: readLoading, deleteConfig, @@ -190,8 +336,10 @@ const ArrayDetailsTable = memo( compressor, viewFormat, editingIndex, + drawerIndex, handleEditElement, handleApplyEditElement, + handleOpenValueEditor, updating, readLoading, deleteConfig, @@ -215,6 +363,14 @@ const ArrayDetailsTable = memo( () => buildSelectionColumn({ disableSelectAll: !hasSelectableRows, + // Override redis-ui's default 4.2rem so the column hugs the checkbox; + // the class trims the cell's side padding (see ArrayDetailsTable.styles). + size: SELECTION_COLUMN_WIDTH_REM, + sizeUnit: 'rem', + getCellProps: () => ({ className: SELECTION_COLUMN_CELL_CLASS }), + getHeaderCellProps: () => ({ + className: SELECTION_COLUMN_CELL_CLASS, + }), }), [buildSelectionColumn, hasSelectableRows], ) @@ -225,22 +381,32 @@ const ArrayDetailsTable = memo( // from `meta`, so rebuilding `columns` on every toggle would needlessly // reset table state (e.g. expanded Search context rows). const hasSelectionColumn = Boolean(selectionConfig) - const hasActionsColumn = Boolean(deleteConfig) + // The actions column hosts the per-row edit + expand triggers (editing is + // always wired on this table) alongside the optional delete trigger, so it + // is always present. + const hasActionsColumn = true const columns = useMemo(() => { + // Column defs are static (module-level); translate their string headers + // at render so the header cells read the locale, not the raw key. + const localized = arrayColumns.map((col) => + typeof col.header === 'string' + ? { ...col, header: t(col.header as ParseKeys) } + : col, + ) const cols = hasSelectionColumn - ? [selectionColumn, ...arrayColumns] - : [...arrayColumns] + ? [selectionColumn, ...localized] + : [...localized] if (hasActionsColumn) cols.push(actionsColumn) return cols - }, [hasSelectionColumn, hasActionsColumn, selectionColumn]) + }, [hasSelectionColumn, hasActionsColumn, selectionColumn, t]) // Use `||` rather than `??` here: the array slice clears `error` to `''` // after a successful request, and `''` is not nullish, so `??` would // surface the empty string and the table would render with no text on // an empty-but-successful range/scan. const emptyState = loading - ? ARRAY_TABLE_LOADING_MESSAGE - : error || ARRAY_TABLE_EMPTY_MESSAGE + ? t(ARRAY_TABLE_LOADING_MESSAGE) + : error || t(ARRAY_TABLE_EMPTY_MESSAGE) // Multi-select is opt-in. Selection keys are element indexes (`getRowId`), // and gaps/non-deletable rows have their checkbox disabled. @@ -262,7 +428,7 @@ const ArrayDetailsTable = memo( data={elements} meta={meta} stripedRows - minWidth={TABLE_MIN_WIDTH} + minWidth={getTableMinWidth({ hasSelectionColumn, hasActionsColumn })} emptyState={emptyState} renderExpandedRow={renderExpandedRow} getIsRowExpandable={getIsRowExpandable} @@ -270,6 +436,14 @@ const ArrayDetailsTable = memo( {...selectionProps} data-testid={`${TEST_ID}-table`} /> + setDrawerIndex(null)} + /> ) }, diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.types.ts index 0ad5725402..4630bd7461 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.types.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/ArrayDetailsTable.types.ts @@ -58,6 +58,10 @@ export interface ArrayTableConfig { onEditElement: (index: string, isEditing: boolean) => void /** Persist an edited value (plain string from the editor) via ARSET. */ onApplyEditElement: (index: string, value: string) => void + /** Open the Monaco drawer editor for a row's value. */ + onOpenValueEditor: (index: string) => void + /** True while the drawer is open, so the actions cell can hide its triggers. */ + isValueDrawerOpen: boolean /** True while an ARSET write is in flight — keeps the editor in its loading * state and blocks a second edit from overlapping the request. */ updating: boolean diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayIndexCell.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayIndexCell.tsx index 0bf3afbba8..0d5a2d5044 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayIndexCell.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayIndexCell.tsx @@ -5,6 +5,7 @@ import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { RiTooltip } from 'uiSrc/components/base/tooltip/RITooltip' import { Text } from 'uiSrc/components/base/text' import { formatLongName } from 'uiSrc/utils' +import { useTranslation } from 'uiSrc/i18n' import { ArrayIndexCellProps } from './ArrayIndexCell.types' @@ -23,34 +24,37 @@ export const ArrayIndexCell = ({ index, canExpand, isExpanded, -}: ArrayIndexCellProps) => ( - - {canExpand && ( - - - - )} - - - { + const { t } = useTranslation() + return ( + + {canExpand && ( + + + + )} + + - {index} - - - - -) + + {index} + + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.spec.tsx index 8be5cd032b..eb53b46aad 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.spec.tsx @@ -1,10 +1,13 @@ import React from 'react' -import { render, screen } from 'uiSrc/utils/test-utils' +import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' import { stringToBuffer } from 'uiSrc/utils' import { KeyValueFormat } from 'uiSrc/constants' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { ArrayValueCell } from './ArrayValueCell' +const TEST_ID_PREFIX = 'array-details-table' + const renderCell = (props: Record = {}) => render( { expect(screen.getByTestId('apply-btn')).toBeDisabled() }) }) + +describe('ArrayValueCell — inline value rendering', () => { + it('renders Markdown values as rich markdown directly in the cell', () => { + renderCell({ + isEditing: false, + viewFormat: KeyValueFormat.Markdown, + value: stringToBuffer('# Title'), + }) + expect(screen.getByTestId('markdown-viewer')).toBeInTheDocument() + }) + + it('keeps non-Markdown formats compact without a markdown viewer', () => { + renderCell({ + isEditing: false, + viewFormat: KeyValueFormat.JSON, + value: stringToBuffer('{"a":1}'), + }) + expect(screen.queryByTestId('markdown-viewer')).not.toBeInTheDocument() + expect( + screen.getByTestId('array-details-table-value-1'), + ).toBeInTheDocument() + }) +}) + +describe('ArrayValueCell — display', () => { + const baseProps = { + index: '0', + value: stringToBuffer('hello'), + compressor: null, + viewFormat: KeyValueFormat.Unicode, + } + + it('renders the formatted value', () => { + render( + , + ) + + expect(screen.getByTestId(`${TEST_ID_PREFIX}-value-0`)).toHaveTextContent( + 'hello', + ) + }) + + it('renders "Empty" for an empty slot', () => { + render( + , + ) + + expect(screen.getByTestId(`${TEST_ID_PREFIX}-empty-0`)).toBeInTheDocument() + }) + + it('does not render an edit pencil in the value cell (triggers live in the actions column)', () => { + render( + , + ) + + fireEvent.mouseEnter( + screen.getByTestId(`${TEST_ID_PREFIX}_content-value-0`), + ) + + expect( + screen.queryByTestId(`${TEST_ID_PREFIX}_edit-btn-0`), + ).not.toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.tsx index 993b1bb41d..277bcda34a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueCell.tsx @@ -1,40 +1,38 @@ import React from 'react' import { - TEXT_DISABLED_COMPRESSED_VALUE, - TEXT_DISABLED_FORMATTER_EDITING, TEXT_FAILED_CONVENT_FORMATTER, - TEXT_INVALID_VALUE, - TEXT_UNPRINTABLE_CHARACTERS, + getTextInvalidValue, + getTextUnprintableCharacters, } from 'uiSrc/constants' import { - bufferToSerializedFormat, - bufferToString, createTooltipContent, formattingBuffer, - isEqualBuffers, - isFormatEditable, - isNonUnicodeFormatter, - stringToBuffer, stringToSerializedBufferFormat, } from 'uiSrc/utils' -import { decompressingBuffer } from 'uiSrc/utils/decompressors' import { EditableTextArea, FormattedValue, } from 'uiSrc/pages/browser/modules/key-details/shared' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' +import { useTranslation } from 'uiSrc/i18n' +import { getArrayElementEditState } from '../getArrayElementEditState' import { ArrayValueCellProps } from './ArrayValueCell.types' import * as S from './ArrayValueCell.styles' const TEST_ID_PREFIX = 'array-details-table' /** - * Renders a populated slot's value (formatted) wrapped in an inline editor for - * in-place edits (ARSET). Empty slots render a muted "Empty" marker and are - * not editable — filling a gap changes ARCOUNT/ARLEN and belongs to append / - * set-at-index, not the value edit. + * Renders a populated slot's value (formatted). When the row is in edit mode + * it hosts the inline editor (ARSET). Empty slots render a muted "Empty" + * marker and are not editable — filling a gap changes ARCOUNT/ARLEN and + * belongs to append / set-at-index, not the value edit. + * + * The edit / expand triggers live in the table's actions column + * (`RowActionsCell`), not here, so the value column stays clear for text — + * hence `hideEditButton` on the editor. Editing is driven from that column via + * the table-level `editingIndex`; this cell only reacts to `isEditing`. */ export const ArrayValueCell = ({ index, @@ -47,6 +45,7 @@ export const ArrayValueCell = ({ onEdit, onApply, }: ArrayValueCellProps) => { + const { t } = useTranslation() // Treat null and undefined identically — `JSON.stringify` drops keys // whose values are undefined, so an undefined `value` here means the // slot arrived without a buffer payload. @@ -56,7 +55,7 @@ export const ArrayValueCell = ({ variant="italic" data-testid={`${TEST_ID_PREFIX}-empty-${index}`} > - Empty + {t('browser.array.emptyValue')} ) } @@ -64,55 +63,33 @@ export const ArrayValueCell = ({ // Values flow through the API in `encoding=buffer` mode, so we narrow // RedisString to RedisResponseBuffer at the rendering boundary. const buffer = value as RedisResponseBuffer - const { value: decompressed, isCompressed } = decompressingBuffer( - buffer, - compressor, - ) - const decompressedBuffer = decompressed as RedisResponseBuffer - const { value: formatted, isValid } = formattingBuffer( - decompressedBuffer, - viewFormat, - { expanded: false }, - ) + const { decompressedBuffer, formatted, isValid, isUnprintable, serialize } = + getArrayElementEditState(buffer, compressor, viewFormat, t) const tooltipContent = createTooltipContent( formatted, decompressedBuffer, viewFormat, ) - - // Compressed payloads and non-round-trippable formats can't be safely - // edited; values with unprintable characters are disabled in the editor. - const isEditable = !isCompressed && isFormatEditable(viewFormat) - const isUnprintable = - !isNonUnicodeFormatter(viewFormat, isValid) && - !isEqualBuffers(decompressedBuffer, stringToBuffer(bufferToString(buffer))) - const editToolTipContent = isCompressed - ? TEXT_DISABLED_COMPRESSED_VALUE - : TEXT_DISABLED_FORMATTER_EDITING - const serializedValue = isEditing - ? bufferToSerializedFormat(viewFormat, decompressedBuffer, 4) - : '' + const serializedValue = isEditing ? serialize() : '' return ( !!formattingBuffer( stringToSerializedBufferFormat(viewFormat, editedValue), viewFormat, )?.isValid } - editToolTipContent={!isEditable ? editToolTipContent : null} + hideEditButton onEdit={(editing) => onEdit?.(editing)} onDecline={() => onEdit?.(false)} onApply={(editedValue) => onApply?.(editedValue)} @@ -126,7 +103,11 @@ export const ArrayValueCell = ({ diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.spec.tsx new file mode 100644 index 0000000000..e1c9130fb9 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.spec.tsx @@ -0,0 +1,102 @@ +import React from 'react' +import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' + +import { ArrayValueEditorDrawer } from './ArrayValueEditorDrawer' + +jest.mock('uiSrc/components/base/code-editor', () => { + const ReactMock = require('react') + return { + __esModule: true, + CodeEditor: (props: any) => + ReactMock.createElement('textarea', { + 'data-testid': 'array-value-code-editor', + value: props.value, + readOnly: props.options?.readOnly, + onChange: (e: any) => props.onChange?.(e.target.value), + }), + } +}) + +const defaultProps = { + isOpen: true, + index: '0', + initialValue: 'hello', + onSave: jest.fn(), + onClose: jest.fn(), +} + +const renderComponent = (props = {}) => + render() + +describe('ArrayValueEditorDrawer', () => { + beforeEach(() => jest.clearAllMocks()) + + it('renders nothing while closed (no Monaco instance per row)', () => { + renderComponent({ isOpen: false }) + expect( + screen.queryByTestId('array-value-code-editor'), + ).not.toBeInTheDocument() + }) + + it('seeds the editor with initialValue when open', () => { + renderComponent() + expect(screen.getByTestId('array-value-code-editor')).toHaveValue('hello') + // Save is never validation-gated — no disabled state to satisfy first. + expect(screen.getByTestId('array-value-editor-save-btn')).not.toBeDisabled() + }) + + it('calls onSave with the edited value', () => { + const onSave = jest.fn() + renderComponent({ onSave }) + + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'edited value' }, + }) + fireEvent.click(screen.getByTestId('array-value-editor-save-btn')) + + expect(onSave).toHaveBeenCalledWith('edited value') + }) + + it('disables Save when isSaveDisabled is set', () => { + renderComponent({ isSaveDisabled: true }) + expect(screen.getByTestId('array-value-editor-save-btn')).toBeDisabled() + }) + + it('makes the editor read-only while a save is in flight', () => { + renderComponent({ isSaveDisabled: true }) + expect(screen.getByTestId('array-value-code-editor')).toHaveAttribute( + 'readonly', + ) + }) + + it('calls onClose and not onSave when cancelled', () => { + const onSave = jest.fn() + const onClose = jest.fn() + renderComponent({ onSave, onClose }) + + fireEvent.click(screen.getByTestId('array-value-editor-cancel-btn')) + + expect(onClose).toHaveBeenCalled() + expect(onSave).not.toHaveBeenCalled() + }) + + it('re-seeds the editor from initialValue when reopened', () => { + const { rerender } = renderComponent({ initialValue: 'first' }) + fireEvent.change(screen.getByTestId('array-value-code-editor'), { + target: { value: 'dirty' }, + }) + + rerender( + , + ) + rerender( + , + ) + + expect(screen.getByTestId('array-value-code-editor')).toHaveValue('second') + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.tsx new file mode 100644 index 0000000000..3cd5417b6b --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.tsx @@ -0,0 +1,97 @@ +import React, { useEffect, useState } from 'react' + +import { + Drawer, + DrawerBody, + DrawerFooter, + DrawerHeader, +} from 'uiSrc/components/base/layout/drawer' +import { CodeEditor } from 'uiSrc/components/base/code-editor' +import { Row } from 'uiSrc/components/base/layout/flex' +import { + PrimaryButton, + SecondaryButton, +} from 'uiSrc/components/base/forms/buttons' + +import { useTranslation } from 'uiSrc/i18n' + +import { ArrayValueEditorDrawerProps } from './ArrayValueEditorDrawer.types' + +// Fill the drawer height minus its header and footer. +const EDITOR_HEIGHT = 'calc(100vh - 140px)' + +/** + * Right-side drawer with a plaintext Monaco editor for a single array element + * value — more room for large values than the inline editor. A single + * instance lives at the table level; it renders only while open (returns null + * when closed) so no Monaco instance is mounted when nothing is being edited. + */ +export const ArrayValueEditorDrawer = ({ + isOpen, + index, + initialValue, + title, + isSaveDisabled = false, + onSave, + onClose, +}: ArrayValueEditorDrawerProps) => { + const { t } = useTranslation() + const [value, setValue] = useState(initialValue) + + // Re-seed on open so reopening after a cancel discards the previous edit. + // Don't add other deps, or an in-flight edit could be silently discarded. + useEffect(() => { + if (isOpen) setValue(initialValue) + }, [isOpen, initialValue]) + + if (!isOpen) return null + + return ( + { + if (!open) onClose() + }} + data-testid="array-value-editor-drawer" + > + + + + + + + + {t('browser.array.drawer.cancel')} + + onSave(value)} + data-testid="array-value-editor-save-btn" + aria-label={t('browser.array.drawer.saveAria', { index })} + > + {t('browser.array.drawer.save')} + + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.types.ts new file mode 100644 index 0000000000..fd5ecce4ea --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/ArrayValueEditorDrawer.types.ts @@ -0,0 +1,11 @@ +export interface ArrayValueEditorDrawerProps { + isOpen: boolean + index: string + /** Serialized value the editor is re-seeded with on each open. */ + initialValue: string + title?: string + /** Blocks Save while a write / patched-view read is in flight. */ + isSaveDisabled?: boolean + onSave: (value: string) => void + onClose: () => void +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.spec.tsx index d7c1d30475..40f4b8a532 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.spec.tsx @@ -1,12 +1,27 @@ import React from 'react' -import { render, screen, fireEvent } from 'uiSrc/utils/test-utils' +import { cloneDeep } from 'lodash' +import { + render, + screen, + fireEvent, + mockedStore, + mockStore, +} from 'uiSrc/utils/test-utils' +import { KeyValueFormat } from 'uiSrc/constants' +import { stringToBuffer } from 'uiSrc/utils' +import { getConfig } from 'uiSrc/config' import { arrayElementFactory, arrayElementWithValueFactory, } from 'uiSrc/mocks/factories/browser/array/arrayElement.factory' import { RowActionsCell } from './RowActionsCell' -import { ArrayElementDeleteConfig } from './RowActionsCell.types' +import { + ArrayElementDeleteConfig, + ArrayElementEditConfig, +} from './RowActionsCell.types' + +const { truncatedStringPrefix } = getConfig().app const SUFFIX = '-array-element' @@ -22,6 +37,20 @@ const buildConfig = ( ...over, }) +const buildEditConfig = ( + over: Partial = {}, +): ArrayElementEditConfig => ({ + compressor: null, + viewFormat: KeyValueFormat.Unicode, + editingIndex: null, + isValueDrawerOpen: false, + updating: false, + loading: false, + onEditElement: jest.fn(), + onOpenValueEditor: jest.fn(), + ...over, +}) + describe('RowActionsCell', () => { it('shows a delete trigger for a populated row and opens the popover on click', () => { const showPopover = jest.fn() @@ -76,3 +105,204 @@ describe('RowActionsCell', () => { expect(screen.getByTestId('array-remove-btn-3-icon')).toBeInTheDocument() }) }) + +describe('RowActionsCell — edit + expand', () => { + beforeEach(() => jest.clearAllMocks()) + + it('renders edit and expand triggers for a populated editable row', () => { + render( + , + ) + + expect(screen.getByTestId('array-edit-btn-5')).toBeInTheDocument() + expect(screen.getByTestId('array-expand-btn-5')).toBeInTheDocument() + }) + + it('opens inline edit via onEditElement when the pencil is clicked', () => { + const onEditElement = jest.fn() + render( + , + ) + + fireEvent.click(screen.getByTestId('array-edit-btn-5')) + expect(onEditElement).toHaveBeenCalledWith('5', true) + }) + + it('opens the value drawer via onOpenValueEditor when expand is clicked', () => { + const onOpenValueEditor = jest.fn() + render( + , + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-5')) + expect(onOpenValueEditor).toHaveBeenCalledWith('5') + }) + + it('warns before inline edit when a non-Unicode format is selected', () => { + const onEditElement = jest.fn() + const state = cloneDeep(mockedStore.getState()) + state.browser.keys.selectedKey.viewFormat = KeyValueFormat.JSON + const jsonStore = mockStore(state) + + render( + , + { store: jsonStore }, + ) + + fireEvent.click(screen.getByTestId('array-edit-btn-5')) + + expect(onEditElement).not.toHaveBeenCalled() + expect( + screen.getByTestId('non-unicode-edit-to-unicode'), + ).toBeInTheDocument() + }) + + it('hides edit, expand and delete while this row is being edited', () => { + render( + , + ) + + expect(screen.queryByTestId('array-edit-btn-5')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-5')).not.toBeInTheDocument() + // Delete is hidden too: deleting this row would race its pending ARSET. + expect( + screen.queryByTestId('array-remove-btn-5-icon'), + ).not.toBeInTheDocument() + }) + + it('keeps delete for other rows while a different row is inline-edited', () => { + render( + , + ) + + // Only the edited row's delete is frozen; ARDEL leaves a gap without + // shifting indexes, so deleting a different row can't race the edit. + expect(screen.getByTestId('array-remove-btn-5-icon')).toBeInTheDocument() + }) + + it('hides delete while an ARSET is in flight, even on a non-edited row', () => { + render( + , + ) + + // Inline Save closes the editor before its write settles, so `updating` + // covers the window where a delete would race the pending ARSET. + expect( + screen.queryByTestId('array-remove-btn-5-icon'), + ).not.toBeInTheDocument() + }) + + it('hides all row actions (edit, expand, delete) while the drawer is open', () => { + render( + , + ) + + // Freezing deletes too: deleting the edited element would let a later + // drawer Save resurrect it via ARSET. + expect(screen.queryByTestId('array-edit-btn-5')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-5')).not.toBeInTheDocument() + expect( + screen.queryByTestId('array-remove-btn-5-icon'), + ).not.toBeInTheDocument() + }) + + it('stops trigger clicks from bubbling to a row click handler', () => { + const onRowClick = jest.fn() + render( + // eslint-disable-next-line jsx-a11y/no-static-element-interactions +
+ +
, + ) + + fireEvent.click(screen.getByTestId('array-expand-btn-5')) + fireEvent.click(screen.getByTestId('array-edit-btn-5')) + + expect(onRowClick).not.toHaveBeenCalled() + }) + + it('disables edit and expand while a write is in flight', () => { + render( + , + ) + + expect(screen.getByTestId('array-edit-btn-5')).toBeDisabled() + expect(screen.getByTestId('array-expand-btn-5')).toBeDisabled() + }) + + it('disables edit and expand for a backend-truncated value', () => { + const element = arrayElementWithValueFactory.build({ index: '5' }) + element.value = stringToBuffer( + `${truncatedStringPrefix} big value…`, + ) as typeof element.value + render() + + expect(screen.getByTestId('array-edit-btn-5')).toBeDisabled() + expect(screen.getByTestId('array-expand-btn-5')).toBeDisabled() + }) + + it('renders no edit or expand triggers when editConfig is omitted (read-only)', () => { + render( + , + ) + + expect(screen.queryByTestId('array-edit-btn-5')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-5')).not.toBeInTheDocument() + expect(screen.getByTestId('array-remove-btn-5-icon')).toBeInTheDocument() + }) + + it('renders no edit or expand triggers for a null-value Search row but keeps delete', () => { + render( + , + ) + + expect(screen.queryByTestId('array-edit-btn-3')).not.toBeInTheDocument() + expect(screen.queryByTestId('array-expand-btn-3')).not.toBeInTheDocument() + expect(screen.getByTestId('array-remove-btn-3-icon')).toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.styles.ts index 6d790279d1..157d430133 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.styles.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.styles.ts @@ -6,9 +6,13 @@ import { FlexItem } from 'uiSrc/components/base/layout/flex' // out when the pointer moves onto the popover. The reveal rules live in // ArrayDetailsTable's StyledTable (they need the row ancestor). Staying in the // DOM at opacity 0 keeps it focusable for keyboard users. +// `FlexItem` defaults to flex-direction: column, so set row explicitly to lay +// the action icons out side by side, spread evenly across the cell width. export const ActionCell = styled(FlexItem)` display: flex; - justify-content: center; + flex-direction: row; + align-items: center; + justify-content: space-evenly; opacity: 0; transition: opacity 0.1s ease-in; ` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.tsx index 042a4bd026..dc2255b32f 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.tsx @@ -2,51 +2,148 @@ import React from 'react' import { useTranslation } from 'uiSrc/i18n' import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete' +import { RiTooltip } from 'uiSrc/components' +import { EditIcon, ExtendIcon } from 'uiSrc/components/base/icons' +import { IconButton } from 'uiSrc/components/base/forms/buttons' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' +import { + NonUnicodeEditConfirmation, + useNonUnicodeEditGuard, +} from 'uiSrc/pages/browser/modules/key-details/shared/non-unicode-edit-confirmation' +import { getArrayElementEditState } from '../../getArrayElementEditState' import { RowActionsCellProps } from './RowActionsCell.types' import * as S from './RowActionsCell.styles' +/** + * Right-column row actions — edit (inline editor), expand (Monaco drawer) and + * delete, revealed on row hover. The triggers live here, not over the value, + * so long values aren't hidden behind icons. Editing and the drawer are both + * driven from `ArrayDetailsTable` (via `editConfig`), so they share its + * refresh-pause and abandon-on-tab/key guards. + */ export const RowActionsCell = ({ element, + editConfig, deleteConfig, }: RowActionsCellProps) => { const { t } = useTranslation() - const { - deleting, - suffix, - hideEmptySlots, - closePopover, - showPopover, - handleDeleteElement, - } = deleteConfig + const editGuard = useNonUnicodeEditGuard() + // Drawer snapshots its seed on open, so a Unicode switch must not reopen it. + const expandGuard = useNonUnicodeEditGuard({ reenterAfterUnicode: false }) + + const { index, value } = element // In the gap-preserving View range a null value is an empty slot with - // nothing to delete (ARDEL returns affected: 0). Search results never carry + // nothing to act on (ARDEL returns affected: 0). Search results never carry // gaps — an index-only match (WITHVALUES off) has a null value but is a real // element — so the consumer disables this guard there. - if (hideEmptySlots && element.value == null) return null + if (deleteConfig?.hideEmptySlots && value == null) return null + + const editState = + editConfig && value != null + ? getArrayElementEditState( + value as RedisResponseBuffer, + editConfig.compressor, + editConfig.viewFormat, + t, + ) + : null + const isEditingThisRow = editConfig?.editingIndex === index + // Hide the triggers while this row is being inline-edited (its editor already + // has controls) and while the drawer is open on any row — otherwise a second + // expand would silently re-seed the open drawer and drop unsaved text. + const showEditActions = + !!editState && !isEditingThisRow && !editConfig?.isValueDrawerOpen + const isEditActionDisabled = + !editState?.isEditable || !!editConfig?.updating || !!editConfig?.loading - const { index } = element - const isOpen = deleting === `${index}${suffix}` + // `updating` too: an inline Save closes the editor before its ARSET settles, + // so a delete in that window would race the write and resurrect the element. + const showDelete = + !!deleteConfig && + !editConfig?.isValueDrawerOpen && + !isEditingThisRow && + !editConfig?.updating + + const isDeletePopoverOpen = + !!deleteConfig && deleteConfig.deleting === `${index}${deleteConfig.suffix}` return ( - handleDeleteElement(index)} - testid={`array-remove-btn-${index}`} - /> + {showEditActions && ( + <> + + { + // Search renders this table with expandRowOnClick — don't + // let the action click also toggle the neighbour band. + e.stopPropagation() + editGuard.requestEdit(() => + editConfig?.onEditElement(index, true), + ) + }} + data-testid={`array-edit-btn-${index}`} + /> + + } + /> + + { + e.stopPropagation() + expandGuard.requestEdit(() => + editConfig?.onOpenValueEditor(index), + ) + }} + data-testid={`array-expand-btn-${index}`} + /> + + } + /> + + )} + + {showDelete && ( + deleteConfig.handleDeleteElement(index)} + testid={`array-remove-btn-${index}`} + /> + )} ) } diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.types.ts index 1d94cc2127..a7a0918000 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.types.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/components/RowActionsCell/RowActionsCell.types.ts @@ -1,5 +1,27 @@ +import { KeyValueCompressor, KeyValueFormat } from 'uiSrc/constants' +import { Nullable } from 'uiSrc/utils' import { ArrayDataElement } from 'uiSrc/slices/interfaces/array' +/** + * Per-row edit wiring the actions cell reads from the table `meta` to render + * the edit (inline) and expand (Monaco drawer) triggers next to delete. Both + * the editing state and the drawer live in `ArrayDetailsTable`; these + * callbacks open them. + */ +export interface ArrayElementEditConfig { + compressor: Nullable + viewFormat: KeyValueFormat + editingIndex: Nullable + /** True while the drawer is open on any row — hides the triggers so a second + * expand can't re-seed the open drawer over unsaved text. */ + isValueDrawerOpen: boolean + updating: boolean + /** Blocks opening an edit so a late read can't overwrite the optimistic patch. */ + loading: boolean + onEditElement: (index: string, isEditing: boolean) => void + onOpenValueEditor: (index: string) => void +} + /** * Per-row delete state shared with the table's actions cell via the table * `meta`. Owned by `useArrayElementActions`; passed down so the static column @@ -21,5 +43,8 @@ export interface ArrayElementDeleteConfig { export interface RowActionsCellProps { element: ArrayDataElement - deleteConfig: ArrayElementDeleteConfig + /** Enables the edit + expand triggers. Omitted in read-only contexts. */ + editConfig?: ArrayElementEditConfig + /** Enables the delete trigger. Omitted when deletion isn't offered. */ + deleteConfig?: ArrayElementDeleteConfig } diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/constants.ts index ea3abe7537..d2f9c89255 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/constants.ts @@ -1,2 +1,16 @@ -export const ARRAY_TABLE_EMPTY_MESSAGE = 'No elements in range' -export const ARRAY_TABLE_LOADING_MESSAGE = 'Loading…' +import { ParseKeys } from 'i18next' + +export const ARRAY_TABLE_EMPTY_MESSAGE: ParseKeys = 'browser.array.table.empty' +export const ARRAY_TABLE_LOADING_MESSAGE: ParseKeys = + 'browser.array.table.loading' + +// Array results table column widths, shared with NeighbourBand so the expanded +// row lines up with the same columns. +export const INDEX_COLUMN_SIZE = 140 +export const VALUE_COLUMN_SIZE = 420 +// Snug fit for the row hover actions (edit · expand · delete). +export const ACTIONS_COLUMN_SIZE = 60 +// Snug around the 1.8rem checkbox, not redis-ui's default 4.2rem. +export const SELECTION_COLUMN_WIDTH_REM = 2.6 +export const SELECTION_COLUMN_CELL_CLASS = 'array-selection-cell' +export const ACTIONS_COLUMN_CELL_CLASS = 'array-actions-cell' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.spec.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.spec.ts new file mode 100644 index 0000000000..dc5930ca19 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.spec.ts @@ -0,0 +1,66 @@ +import { KeyValueFormat } from 'uiSrc/constants' +import { stringToBuffer } from 'uiSrc/utils' +import { getConfig } from 'uiSrc/config' +import i18n from 'uiSrc/i18n' +import { + RedisResponseBuffer, + RedisResponseBufferType, +} from 'uiSrc/slices/interfaces' + +import { getArrayElementEditState } from './getArrayElementEditState' + +const { truncatedStringPrefix } = getConfig().app + +const buffer = (s: string) => stringToBuffer(s) as RedisResponseBuffer + +describe('getArrayElementEditState', () => { + it('marks a plain unicode value editable with no disabled reason', () => { + const state = getArrayElementEditState( + buffer('hello'), + null, + KeyValueFormat.Unicode, + i18n.t, + ) + + expect(state.isEditable).toBe(true) + expect(state.isTruncated).toBe(false) + expect(state.editDisabledReason).toBeNull() + expect(state.serialize()).toBe('hello') + }) + + it('marks a backend-truncated value non-editable with the truncated reason', () => { + const state = getArrayElementEditState( + buffer(`${truncatedStringPrefix} big value`), + null, + KeyValueFormat.Unicode, + i18n.t, + ) + + expect(state.isTruncated).toBe(true) + expect(state.isEditable).toBe(false) + expect(state.editDisabledReason).toBe( + i18n.t('browser.keyDetails.truncatedActionDisabled'), + ) + }) + + it('marks a value with non-printable bytes non-editable', () => { + // 0xC0 is an invalid UTF-8 lead byte, so it doesn't round-trip through a + // string and back — the definition of unprintable here. + const unprintable = { + type: RedisResponseBufferType.Buffer, + data: [0xc0], + } as RedisResponseBuffer + const state = getArrayElementEditState( + unprintable, + null, + KeyValueFormat.Unicode, + i18n.t, + ) + + expect(state.isUnprintable).toBe(true) + expect(state.isEditable).toBe(false) + expect(state.editDisabledReason).toBe( + i18n.t('browser.keyDetails.unprintable.content'), + ) + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.ts new file mode 100644 index 0000000000..7ed6441f16 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-details-table/getArrayElementEditState.ts @@ -0,0 +1,90 @@ +import { ReactNode } from 'react' +import { TFunction } from 'i18next' + +import { KeyValueCompressor, KeyValueFormat } from 'uiSrc/constants' +import { + bufferToSerializedFormat, + bufferToString, + formattingBuffer, + isEqualBuffers, + isFormatEditable, + isNonUnicodeFormatter, + isTruncatedString, + stringToBuffer, + Nullable, +} from 'uiSrc/utils' +import { decompressingBuffer } from 'uiSrc/utils/decompressors' +import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' + +export interface ArrayElementEditState { + decompressedBuffer: RedisResponseBuffer + formatted: JSX.Element | string + isValid: boolean + isCompressed: boolean + /** Editing a truncated value would save the truncated copy over the real one. */ + isTruncated: boolean + /** Editor stays open but its input is disabled, to avoid silent data loss. */ + isUnprintable: boolean + isEditable: boolean + /** Trigger-tooltip text; null when editable. */ + editDisabledReason: Nullable + serialize: () => string +} + +/** + * Shared display + edit state for one populated array element. Centralised so + * the value cell (display + inline editor) and the actions cell (edit/expand + * triggers + drawer seed) can't drift apart. Callers must guard empty slots + * (`value == null`) — an empty slot has nothing to format or edit. + */ +export const getArrayElementEditState = ( + value: RedisResponseBuffer, + compressor: Nullable, + viewFormat: KeyValueFormat, + t: TFunction, +): ArrayElementEditState => { + const { value: decompressed, isCompressed } = decompressingBuffer( + value, + compressor, + ) + const decompressedBuffer = decompressed as RedisResponseBuffer + const { value: formatted, isValid } = formattingBuffer( + decompressedBuffer, + viewFormat, + { expanded: false }, + ) + + const isTruncated = isTruncatedString(value) + const isFormatEditableValue = isFormatEditable(viewFormat) + const isUnprintable = + !isNonUnicodeFormatter(viewFormat, isValid) && + !isEqualBuffers(decompressedBuffer, stringToBuffer(bufferToString(value))) + // Unprintable is part of editability: the drawer's Monaco field is fully + // editable, so a Save would re-encode and overwrite the original bytes. + const isEditable = + !isCompressed && !isTruncated && isFormatEditableValue && !isUnprintable + + let editDisabledReason: Nullable = null + if (isCompressed) { + editDisabledReason = t('browser.keyDetails.compressedValueDisabled') + } else if (isTruncated) { + editDisabledReason = t('browser.keyDetails.truncatedActionDisabled') + } else if (!isFormatEditableValue) { + editDisabledReason = t('browser.keyDetails.formatterEditingDisabled') + } else if (isUnprintable) { + editDisabledReason = t('browser.keyDetails.unprintable.content') + } + + return { + decompressedBuffer, + formatted, + isValid, + isCompressed, + isTruncated, + isUnprintable, + isEditable, + editDisabledReason, + serialize: () => + bufferToSerializedFormat(viewFormat, decompressedBuffer, 4), + } +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.constants.ts index fec664c37d..520553c249 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.constants.ts @@ -1,9 +1,11 @@ +import { ParseKeys } from 'i18next' + export const ARRAY_RANGE_FORM_TEST_ID = 'array-range-form' -export const RUN_BUTTON_LABEL = 'Run' -export const RESET_TOOLTIP = 'Reset to defaults' -export const INVALID_INDEX_MESSAGE = - 'Index must be a valid 64-bit unsigned integer' +export const RUN_BUTTON_LABEL: ParseKeys = 'browser.array.form.run' +export const RESET_TOOLTIP: ParseKeys = 'browser.array.form.resetTooltip' +export const INVALID_INDEX_MESSAGE: ParseKeys = + 'browser.array.form.invalidIndex' /** * Mirror of the backend's `ARRAY_RANGE_MAX_ELEMENTS` cap used by @@ -12,5 +14,5 @@ export const INVALID_INDEX_MESSAGE = * form already does without any precision-losing Number conversions. */ export const ARRAY_RANGE_MAX_SPAN = 1_000_000n -export const INVALID_RANGE_TOO_LARGE_MESSAGE = - 'Range too large — request at most 1,000,000 indexes per query' +export const INVALID_RANGE_TOO_LARGE_MESSAGE: ParseKeys = + 'browser.array.range.tooLarge' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.spec.tsx index 661b2fed9e..9f32300be4 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.spec.tsx @@ -162,139 +162,4 @@ describe('ArrayRangeForm', () => { fireEvent.click(screen.getByTestId('array-range-form-reset')) expect(onReset).toHaveBeenCalledTimes(1) }) - - describe('Delete range', () => { - const DELETE_TESTID = 'array-range-form-delete' - const DELETE_CONFIRM_TESTID = 'array-range-form-delete-confirm' - - it('renders the delete button only when onDeleteRange is provided', () => { - renderComponent() - - expect(screen.queryByTestId(DELETE_TESTID)).not.toBeInTheDocument() - }) - - it('opens a confirm popover stating the exact window', () => { - renderComponent({ - onDeleteRange: jest.fn(), - start: '5', - end: '20', - }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - - expect( - screen.getByText( - 'Elements in range 5-20 will be permanently removed from the array.', - ), - ).toBeInTheDocument() - }) - - it('calls onDeleteRange on confirm and closes the popover', () => { - const onDeleteRange = jest.fn() - renderComponent({ onDeleteRange }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - fireEvent.click(screen.getByTestId(DELETE_CONFIRM_TESTID)) - - expect(onDeleteRange).toHaveBeenCalledTimes(1) - expect( - screen.queryByTestId(DELETE_CONFIRM_TESTID), - ).not.toBeInTheDocument() - }) - - it('does not delete before the confirm click', () => { - const onDeleteRange = jest.fn() - renderComponent({ onDeleteRange }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - - expect(onDeleteRange).not.toHaveBeenCalled() - }) - - it.each([ - ['loading', { loading: true }], - ['disabled prop', { disabled: true }], - ['invalid start index', { start: '-1' }], - ['non-canonical end index', { end: '007' }], - ])('disables Delete range on %s', (_, props) => { - renderComponent({ onDeleteRange: jest.fn(), ...props }) - - expect(screen.getByTestId(DELETE_TESTID)).toBeDisabled() - }) - - it('stays enabled for an over-cap span (the cap only guards the view query)', () => { - // ARDELRANGE accepts any inclusive window — deleting 0..10M without - // loading it first is a supported flow, so only Run is span-capped. - renderComponent({ - onDeleteRange: jest.fn(), - start: '0', - end: '10000000', - }) - - expect(screen.getByTestId('array-range-form-run')).toBeDisabled() - expect(screen.getByTestId(DELETE_TESTID)).not.toBeDisabled() - }) - - it('stays enabled for a reversed range (deletes the same inclusive window)', () => { - renderComponent({ onDeleteRange: jest.fn(), start: '20', end: '5' }) - - expect(screen.getByTestId(DELETE_TESTID)).not.toBeDisabled() - }) - - it('closes an open confirm popover when the key changes', () => { - // A confirm left open across a key switch would target the new key - // with stale or default bounds. - const { rerender } = renderComponent({ - onDeleteRange: jest.fn(), - keyName: 'readings', - }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeInTheDocument() - - rerender( - , - ) - - expect( - screen.queryByTestId(DELETE_CONFIRM_TESTID), - ).not.toBeInTheDocument() - }) - - it('closes an open confirm popover when the form becomes disabled', () => { - const { rerender } = renderComponent({ onDeleteRange: jest.fn() }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeInTheDocument() - - rerender( - , - ) - - expect( - screen.queryByTestId(DELETE_CONFIRM_TESTID), - ).not.toBeInTheDocument() - }) - - it('disables the confirm button when an index turns invalid while open', () => { - const { rerender } = renderComponent({ onDeleteRange: jest.fn() }) - - fireEvent.click(screen.getByTestId(DELETE_TESTID)) - expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).not.toBeDisabled() - - rerender( - , - ) - - expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeDisabled() - }) - }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.tsx index 0ba45623f3..16bfb22b37 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.tsx @@ -1,25 +1,24 @@ -import React, { useEffect, useMemo, useState } from 'react' +import React, { useMemo, useState } from 'react' -import { useTranslation } from 'uiSrc/i18n' import { RiTooltip } from 'uiSrc/components' -import ConfirmationPopover from 'uiSrc/components/confirmation-popover' -import { - DestructiveButton, - IconButton, - PrimaryButton, -} from 'uiSrc/components/base/forms/buttons' +import { IconButton, PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { FormField } from 'uiSrc/components/base/forms/FormField' -import { DeleteIcon, ResetIcon } from 'uiSrc/components/base/icons' +import { ResetIcon } from 'uiSrc/components/base/icons' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { TextInput } from 'uiSrc/components/base/inputs' import { Checkbox } from 'uiSrc/components/base/forms/checkbox/Checkbox' import { parseArrayIndex } from 'uiSrc/utils/arrayIndex' import { DEFAULT_SCAN_LIMIT } from 'uiSrc/slices/browser/array' +import { + CommandPreview, + PreviewToggle, + useResponsivePreviewLabel, +} from 'uiSrc/pages/browser/modules/key-details/shared' + +import { useTranslation } from 'uiSrc/i18n' -import { CommandPreview } from '../command-preview' -import { PreviewToggle } from '../preview-toggle' -import { useResponsivePreviewLabel } from '../hooks' import { quoteRedisArgument } from '../utils' +import { ARRAY_COMMAND_PREVIEW_TEST_ID } from '../constants' import { ARRAY_RANGE_FORM_TEST_ID as TEST_ID, ARRAY_RANGE_MAX_SPAN, @@ -34,14 +33,14 @@ import * as S from './ArrayRangeForm.styles' /** * Range/scan query form for the array View tab. Lays out inputs above a * single action row containing a toggleable command preview, an optional - * reset, an optional destructive Delete range, and the primary Run button — - * matching the Vector Set similarity-search form pattern so the two - * verticals feel like siblings. + * reset, and the primary Run button — matching the Vector Set + * similarity-search form pattern so the two verticals feel like siblings. + * The destructive Delete range action lives in the View tab subheader + * (`DeleteRangeAction`) next to Add Elements, not in this form. * * - `Start` / `End` are decimal-string indexes (BigInt-as-string contract). * - `Show empty indexes` ON → ARGETRANGE (returns `null` for gaps). * - `Show empty indexes` OFF → ARSCAN (skips gaps; `Limit` caps result size). - * - `Delete range` → ARDELRANGE over the same [start, end] inputs. */ export const ArrayRangeForm = ({ keyName, @@ -54,22 +53,12 @@ export const ArrayRangeForm = ({ onToggleShowEmpty, onRun, onReset, - onDeleteRange, disabled = false, }: ArrayRangeFormProps) => { const { t } = useTranslation() const [previewVisible, setPreviewVisible] = useState(false) - const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false) const { containerRef, isWide } = useResponsivePreviewLabel() - // A delete confirm left open across a key switch (or while the newly - // clicked key's type is still unconfirmed) must not carry over: the - // inputs reset for the new key, so confirming would run ARDELRANGE - // against it with stale or default bounds. - useEffect(() => { - setDeleteConfirmOpen(false) - }, [keyName, disabled]) - // Match the backend's @IsArrayIndex validator exactly: accept only // canonical decimal strings (no leading zeros, no whitespace, etc.). // Loose-acceptance values like "007" or " 7 " would pass `parseArrayIndex` @@ -96,11 +85,11 @@ export const ArrayRangeForm = ({ ARRAY_RANGE_MAX_SPAN const rangeInvalid = startInvalid || endInvalid || spanInvalid - const startError = startInvalid ? INVALID_INDEX_MESSAGE : undefined + const startError = startInvalid ? t(INVALID_INDEX_MESSAGE) : undefined const endError = endInvalid - ? INVALID_INDEX_MESSAGE + ? t(INVALID_INDEX_MESSAGE) : spanInvalid - ? INVALID_RANGE_TOO_LARGE_MESSAGE + ? t(INVALID_RANGE_TOO_LARGE_MESSAGE) : undefined const command = useMemo(() => { @@ -118,16 +107,11 @@ export const ArrayRangeForm = ({ return `ARSCAN ${name} ${start} ${end} LIMIT ${DEFAULT_SCAN_LIMIT}` }, [keyName, start, end, showEmpty]) - // No span cap here on purpose: the 1M cap protects the view response - // size (ARGETRANGE), while ARDELRANGE accepts any inclusive window — - // deleting 0..10M without loading it first is a supported flow. - const deleteDisabled = startInvalid || endInvalid || loading || disabled - return ( - + - + onToggleShowEmpty(e.target.checked)} data-testid={`${TEST_ID}-show-empty`} @@ -175,66 +159,34 @@ export const ArrayRangeForm = ({ /> - {previewVisible && } + {previewVisible && ( + + )} {onReset && ( - + )} - {onDeleteRange && ( - - setDeleteConfirmOpen(false)} - panelPaddingSize="m" - title={t('browser.array.delete.range.title')} - message={t('browser.array.delete.range.message', { start, end })} - button={ - setDeleteConfirmOpen((open) => !open)} - disabled={deleteDisabled} - data-testid={`${TEST_ID}-delete`} - > - {t('browser.array.delete.range.trigger')} - - } - confirmButton={ - { - onDeleteRange() - setDeleteConfirmOpen(false) - }} - data-testid={`${TEST_ID}-delete-confirm`} - > - {t('browser.array.delete.range.button')} - - } - /> - - )} onRun()} disabled={rangeInvalid || loading || disabled} data-testid={`${TEST_ID}-run`} > - {RUN_BUTTON_LABEL} + {t(RUN_BUTTON_LABEL)} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.types.ts index f1cbda9afe..0919ae6137 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.types.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-range-form/ArrayRangeForm.types.ts @@ -18,13 +18,6 @@ export interface ArrayRangeFormProps { * actual reset semantics (resetting Redux state alongside form state). */ onReset?: () => void - /** - * Deletes the inclusive [start, end] window currently in the inputs - * (ARDELRANGE). Rendered as a destructive action behind its own confirm - * popover; hidden when the handler is absent. Unlike Run, it ignores the - * view-only span cap — the delete endpoint accepts any window size. - */ - onDeleteRange?: () => void /** * Disables the Run / Reset actions in addition to the form's internal * range validation. Container passes `true` while the selected key's diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.constants.ts index b2329eb780..37f080ae76 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.constants.ts @@ -1,49 +1,45 @@ +import { ParseKeys } from 'i18next' import { ArrayGrepCriteria } from 'uiSrc/slices/interfaces/array' export const ARRAY_SEARCH_FORM_TEST_ID = 'array-search-form' -export const MATCH_BY_LABEL = 'Match by' -export const MATCH_BY_HINT = - 'Add one or more predicates. Each matches array values by EXACT, MATCH ' + - '(substring), GLOB, or RE (regex). With two or more predicates, the AND / ' + - 'OR toggle combines them all the same way.' -export const VALUE_PLACEHOLDER = 'pattern' -export const RUN_BUTTON_LABEL = 'Run' -export const RESET_TOOLTIP = 'Reset to defaults' -export const RESET_ARIA_LABEL = 'Reset array search form' -export const ADD_PREDICATE_ARIA = 'Add predicate' -export const REMOVE_PREDICATE_ARIA = 'Remove predicate' -export const COMBINATOR_ARIA = 'Combine predicates with AND or OR' -export const APPLIES_TO_ALL_LABEL = 'applies to all' +export const MATCH_BY_LABEL: ParseKeys = 'browser.array.search.matchByLabel' +export const MATCH_BY_HINT: ParseKeys = 'browser.array.search.matchByHint' +export const VALUE_PLACEHOLDER: ParseKeys = + 'browser.array.search.valuePlaceholder' +export const RUN_BUTTON_LABEL: ParseKeys = 'browser.array.form.run' +export const RESET_TOOLTIP: ParseKeys = 'browser.array.form.resetTooltip' +export const RESET_ARIA_LABEL: ParseKeys = 'browser.array.search.resetAria' +export const ADD_PREDICATE_ARIA: ParseKeys = + 'browser.array.search.addPredicateAria' +export const REMOVE_PREDICATE_ARIA: ParseKeys = + 'browser.array.search.removePredicateAria' +export const COMBINATOR_ARIA: ParseKeys = 'browser.array.search.combinatorAria' +export const APPLIES_TO_ALL_LABEL: ParseKeys = + 'browser.array.search.appliesToAll' -export const OPTIONS_LABEL = 'Options' -export const OPTIONS_HINT = - 'Refine which elements are searched and how matches are shown.' -export const RANGE_LABEL = 'Range' -export const RANGE_TO_LABEL = 'to' +export const OPTIONS_LABEL: ParseKeys = 'browser.array.search.optionsLabel' +export const OPTIONS_HINT: ParseKeys = 'browser.array.search.optionsHint' +export const RANGE_LABEL: ParseKeys = 'browser.array.search.rangeLabel' +export const RANGE_TO_LABEL: ParseKeys = 'browser.array.search.rangeToLabel' export const START_PLACEHOLDER = '-' export const END_PLACEHOLDER = '+' export const NOCASE_LABEL = 'NOCASE' export const WITHVALUES_LABEL = 'WITHVALUES' export const LIMIT_LABEL = 'LIMIT' -export const CONTEXT_LABEL = 'Context' -export const CONTEXT_PREFIX = '±' /** Per-option (i) hints rendered next to each control. */ -export const RANGE_HINT = - 'Limits the index window searched (blank = whole array).' -export const NOCASE_HINT = 'Match case-insensitively.' -export const WITHVALUES_HINT = "Return each match's value, not just its index." -export const LIMIT_HINT = 'Cap the number of matches returned.' -export const CONTEXT_HINT = - 'When expanding a match, also show ±N neighbouring elements.' +export const RANGE_HINT: ParseKeys = 'browser.array.search.rangeHint' +export const NOCASE_HINT: ParseKeys = 'browser.array.search.nocaseHint' +export const WITHVALUES_HINT: ParseKeys = 'browser.array.search.withValuesHint' +export const LIMIT_HINT: ParseKeys = 'browser.array.search.limitHint' -export const INVALID_INDEX_MESSAGE = - 'Index must be a valid 64-bit unsigned integer' +export const INVALID_INDEX_MESSAGE: ParseKeys = + 'browser.array.form.invalidIndex' /** Backend caps ARGREP LIMIT at `ARRAY_RANGE_MAX_ELEMENTS` (1,000,000). */ export const ARRAY_SEARCH_LIMIT_MAX = 1_000_000 -export const INVALID_LIMIT_MESSAGE = - 'Limit must be a whole number between 1 and 1,000,000' +export const INVALID_LIMIT_MESSAGE: ParseKeys = + 'browser.array.search.invalidLimit' /** Criteria dropdown options, in ARGREP command-token order. */ export const ARRAY_GREP_CRITERIA_OPTIONS: { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.spec.tsx index d4cfea07b9..49ff16fd9f 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.spec.tsx @@ -1,11 +1,6 @@ import React from 'react' -import { - fireEvent, - render, - screen, - userEvent, - waitFor, -} from 'uiSrc/utils/test-utils' +import { fireEvent, render, screen, userEvent } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { ArrayCombinator, ArrayGrepCriteria, @@ -30,8 +25,6 @@ const defaultProps: ArraySearchFormProps = { onChangePredicate: jest.fn(), onChangeCombinator: jest.fn(), onChangeOptions: jest.fn(), - context: { enabled: false, count: 5 }, - onChangeContext: jest.fn(), onRun: jest.fn(), onReset: jest.fn(), } @@ -192,67 +185,6 @@ describe('ArraySearchForm', () => { }) }) - describe('context', () => { - // Context is always visible, so no need to expand Options first. - it('keeps the context input disabled until the toggle is ticked', () => { - const { rerender } = renderComponent() - // Off by default → input present (so layout is stable) but disabled. - expect(screen.getByTestId(`${TEST_ID}-context`)).toBeDisabled() - - rerender( - , - ) - expect(screen.getByTestId(`${TEST_ID}-context`)).toBeEnabled() - }) - - it('enables context when the toggle is ticked', () => { - const onChangeContext = jest.fn() - renderComponent({ onChangeContext }) - - fireEvent.click(screen.getByTestId(`${TEST_ID}-context-toggle`)) - - expect(onChangeContext).toHaveBeenCalledWith({ enabled: true }) - }) - - it('shows the passed count and clamps a typed value above the max to 50', async () => { - const user = userEvent.setup() - renderComponent({ context: { enabled: true, count: 5 } }) - - const input = screen.getByTestId(`${TEST_ID}-context`) - // redis-ui NumericInput renders a text input, so the DOM value is a - // string. - expect(input).toHaveValue('5') - - // redis-ui's `autoValidate` clamps onChange, but the field text only - // settles to the clamped value on blur — so '99' stays verbatim while - // typing and resolves to '50' once the input blurs. - await user.clear(input) - await user.type(input, '99') - await user.tab() - - await waitFor(() => { - expect(input).toHaveValue('50') - }) - }) - - it('reports a new count via onChangeContext', () => { - const onChangeContext = jest.fn() - renderComponent({ - context: { enabled: true, count: 5 }, - onChangeContext, - }) - - fireEvent.change(screen.getByTestId(`${TEST_ID}-context`), { - target: { value: '8' }, - }) - - expect(onChangeContext).toHaveBeenCalledWith({ count: 8 }) - }) - }) - describe('run', () => { it('calls onRun on click and on Enter in a value input', () => { const onRun = jest.fn() @@ -351,6 +283,6 @@ describe('ArraySearchForm', () => { it('renders the options panel by its label', () => { renderComponent() - expect(screen.getByText(OPTIONS_LABEL)).toBeInTheDocument() + expect(screen.getByText(i18n.t(OPTIONS_LABEL))).toBeInTheDocument() }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.tsx index 580c2c5740..8e53d04faa 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.tsx @@ -15,21 +15,20 @@ import { RiIcon, } from 'uiSrc/components/base/icons' import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' -import { NumericInput, TextInput } from 'uiSrc/components/base/inputs' +import { TextInput } from 'uiSrc/components/base/inputs' import { Text } from 'uiSrc/components/base/text' import { ArrayCombinator, ArrayGrepCriteria, } from 'uiSrc/slices/interfaces/array' - -import { CommandPreview } from '../command-preview' -import { PreviewToggle } from '../preview-toggle' -import { useResponsivePreviewLabel } from '../hooks' import { - CONTEXT_COUNT_MAX, - CONTEXT_COUNT_MIN, - DEFAULT_LIMIT, -} from '../constants' + CommandPreview, + PreviewToggle, + useResponsivePreviewLabel, +} from 'uiSrc/pages/browser/modules/key-details/shared' +import { useTranslation } from 'uiSrc/i18n' + +import { ARRAY_COMMAND_PREVIEW_TEST_ID, DEFAULT_LIMIT } from '../constants' import { quoteRedisArgument } from '../utils' import { ADD_PREDICATE_ARIA, @@ -37,9 +36,6 @@ import { ARRAY_GREP_CRITERIA_OPTIONS, ARRAY_SEARCH_FORM_TEST_ID as TEST_ID, COMBINATOR_ARIA, - CONTEXT_HINT, - CONTEXT_LABEL, - CONTEXT_PREFIX, REMOVE_PREDICATE_ARIA, END_PLACEHOLDER, INVALID_INDEX_MESSAGE, @@ -65,7 +61,7 @@ import { } from './ArraySearchForm.constants' import { ArraySearchFormProps } from './ArraySearchForm.types' import { isBoundInvalid, isLimitInvalid } from './ArraySearchForm.utils' -import { InfoHint } from './components/InfoHint' +import { InfoHint } from '../components/InfoHint' import * as S from './ArraySearchForm.styles' /** @@ -88,12 +84,11 @@ export const ArraySearchForm = ({ onChangePredicate, onChangeCombinator, onChangeOptions, - context, - onChangeContext, onRun, onReset, disabled = false, }: ArraySearchFormProps) => { + const { t } = useTranslation() const [previewVisible, setPreviewVisible] = useState(false) const [optionsOpen, setOptionsOpen] = useState(false) const { containerRef, isWide } = useResponsivePreviewLabel() @@ -133,10 +128,10 @@ export const ArraySearchForm = ({ - {MATCH_BY_LABEL} + {t(MATCH_BY_LABEL)} - + @@ -165,7 +160,7 @@ export const ArraySearchForm = ({ onKeyDown={(e) => { if (e.key === 'Enter' && !runDisabled) onRun() }} - placeholder={VALUE_PLACEHOLDER} + placeholder={t(VALUE_PLACEHOLDER)} disabled={disabled} data-testid={`${TEST_ID}-value-${index}`} /> @@ -173,10 +168,10 @@ export const ArraySearchForm = ({ {/* No delete on a single row — there's nothing to remove. */} {multiPredicate && ( - + onRemovePredicate(index)} disabled={disabled} data-testid={`${TEST_ID}-remove-${index}`} @@ -193,7 +188,7 @@ export const ArraySearchForm = ({ - AND + {t('browser.array.search.and')} - OR + {t('browser.array.search.or')} {index === 0 && ( - {APPLIES_TO_ALL_LABEL} + {t(APPLIES_TO_ALL_LABEL)} )} @@ -227,49 +222,6 @@ export const ArraySearchForm = ({ ))} - - - - - onChangeContext({ enabled: e.target.checked })} - disabled={disabled} - data-testid={`${TEST_ID}-context-toggle`} - /> - - - - - - - - {CONTEXT_PREFIX} - - {/* Always rendered so ticking Context doesn't shift the row; it just - becomes editable once the toggle is on. */} - - - - onChangeContext({ - count: Math.round(Number(next ?? CONTEXT_COUNT_MIN)), - }) - } - disabled={disabled || !context.enabled} - data-testid={`${TEST_ID}-context`} - /> - - - - {/* Compact disclosure: chevron + "Options" on the left, the add-row "+" on the right, the option fields below once expanded. */} @@ -288,21 +240,21 @@ export const ArraySearchForm = ({ /> - {OPTIONS_LABEL} + {t(OPTIONS_LABEL)} - + - + - {RANGE_LABEL} + {t(RANGE_LABEL)} - + @@ -332,14 +284,16 @@ export const ArraySearchForm = ({ value={options.start} onChange={(start) => onChangeOptions({ start })} placeholder={START_PLACEHOLDER} - error={startInvalid ? INVALID_INDEX_MESSAGE : undefined} + error={ + startInvalid ? t(INVALID_INDEX_MESSAGE) : undefined + } disabled={disabled} data-testid={`${TEST_ID}-start`} /> - {RANGE_TO_LABEL} + {t(RANGE_TO_LABEL)} @@ -347,7 +301,9 @@ export const ArraySearchForm = ({ value={options.end} onChange={(end) => onChangeOptions({ end })} placeholder={END_PLACEHOLDER} - error={endInvalid ? INVALID_INDEX_MESSAGE : undefined} + error={ + endInvalid ? t(INVALID_INDEX_MESSAGE) : undefined + } disabled={disabled} data-testid={`${TEST_ID}-end`} /> @@ -377,7 +333,7 @@ export const ArraySearchForm = ({ /> - + @@ -397,7 +353,7 @@ export const ArraySearchForm = ({ /> - + @@ -417,7 +373,7 @@ export const ArraySearchForm = ({ /> - + @@ -429,7 +385,7 @@ export const ArraySearchForm = ({ value={options.limit} onChange={(limit) => onChangeOptions({ limit })} placeholder={DEFAULT_LIMIT} - error={limitInvalid ? INVALID_LIMIT_MESSAGE : undefined} + error={limitInvalid ? t(INVALID_LIMIT_MESSAGE) : undefined} disabled={disabled || !options.limitEnabled} data-testid={`${TEST_ID}-limit`} /> @@ -450,17 +406,22 @@ export const ArraySearchForm = ({ /> - {previewVisible && } + {previewVisible && ( + + )} {onReset && ( - + @@ -472,7 +433,7 @@ export const ArraySearchForm = ({ disabled={runDisabled} data-testid={`${TEST_ID}-run`} > - {RUN_BUTTON_LABEL} + {t(RUN_BUTTON_LABEL)} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.types.ts index 69536cdd2c..7a10e3a1e3 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.types.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/ArraySearchForm.types.ts @@ -4,16 +4,6 @@ import { ArraySearchOptions, } from 'uiSrc/slices/interfaces/array' -/** - * Per-match context window shown when a result row is expanded: a toggle plus - * the ±N neighbour count. A display concern, kept separate from `options` so - * it never enters the ARGREP command. - */ -export type ContextOption = { - enabled: boolean - count: number -} - export interface ArraySearchFormProps { /** * Key name rendered in the preview command. Optional so the form can be @@ -32,8 +22,6 @@ export interface ArraySearchFormProps { onChangePredicate: (index: number, patch: Partial) => void onChangeCombinator: (combinator: ArrayCombinator) => void onChangeOptions: (patch: Partial) => void - context: ContextOption - onChangeContext: (patch: Partial) => void onRun: () => void /** * Optional reset hook — restores form defaults and clears prior results. diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.spec.tsx index d683c7f297..432a8ebd7a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.spec.tsx @@ -1,5 +1,6 @@ import React from 'react' import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import ArrayTabs from './ArrayTabs' import { ArrayTabsProps } from './ArrayTabs.types' @@ -21,7 +22,7 @@ describe('ArrayTabs', () => { Object.values(ArrayDetailsTab).forEach((tab) => { expect( - screen.getByText(ARRAY_DETAILS_TAB_LABELS[tab]), + screen.getByText(i18n.t(ARRAY_DETAILS_TAB_LABELS[tab])), ).toBeInTheDocument() }) }) @@ -30,7 +31,9 @@ describe('ArrayTabs', () => { const onChange = jest.fn() renderComponent({ onChange }) - fireEvent.mouseDown(screen.getByText(ARRAY_DETAILS_TAB_LABELS.aggregate)) + fireEvent.mouseDown( + screen.getByText(i18n.t(ARRAY_DETAILS_TAB_LABELS.aggregate)), + ) expect(onChange).toHaveBeenCalledWith(ArrayDetailsTab.Aggregate) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.tsx index f5b4ed4a26..bdd3213904 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-tabs/ArrayTabs.tsx @@ -1,18 +1,20 @@ import React, { useMemo } from 'react' import Tabs, { TabInfo } from 'uiSrc/components/base/layout/tabs' +import { useTranslation } from 'uiSrc/i18n' import { ARRAY_DETAILS_TAB_LABELS, ArrayDetailsTab } from '../constants' import { ArrayTabsProps } from './ArrayTabs.types' const ArrayTabs = ({ value, onChange }: ArrayTabsProps) => { + const { t } = useTranslation() const tabs: TabInfo[] = useMemo( () => (Object.values(ArrayDetailsTab) as ArrayDetailsTab[]).map((tab) => ({ value: tab, - label: ARRAY_DETAILS_TAB_LABELS[tab], + label: t(ARRAY_DETAILS_TAB_LABELS[tab]), content: null, })), - [], + [t], ) return ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/components/InfoHint.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/InfoHint.tsx similarity index 100% rename from redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/components/InfoHint.tsx rename to redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/InfoHint.tsx diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/components/InfoHint.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/InfoHint.types.ts similarity index 100% rename from redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/array-search-form/components/InfoHint.types.ts rename to redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/InfoHint.types.ts diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/index.ts new file mode 100644 index 0000000000..b4e020206e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/components/InfoHint/index.ts @@ -0,0 +1,2 @@ +export { InfoHint } from './InfoHint' +export type { InfoHintProps } from './InfoHint.types' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/constants.ts index bdb63712c0..d0742f9e19 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/constants.ts @@ -3,6 +3,7 @@ * strings, never numbers, to preserve the full u64 range. */ +import { ParseKeys } from 'i18next' import { ArrayCombinator, ArrayGrepCriteria, @@ -55,10 +56,10 @@ export enum ArrayDetailsTab { export const DEFAULT_ARRAY_DETAILS_TAB = ArrayDetailsTab.View -export const ARRAY_DETAILS_TAB_LABELS: Record = { - [ArrayDetailsTab.View]: 'View', - [ArrayDetailsTab.Search]: 'Search', - [ArrayDetailsTab.Aggregate]: 'Aggregate', +export const ARRAY_DETAILS_TAB_LABELS: Record = { + [ArrayDetailsTab.View]: 'browser.array.tab.view', + [ArrayDetailsTab.Search]: 'browser.array.tab.search', + [ArrayDetailsTab.Aggregate]: 'browser.array.tab.aggregate', } /** @@ -85,3 +86,6 @@ export const DEFAULT_CONTEXT = { * of a raw validation error. */ export const ARRAY_BULK_DELETE_MAX = 1_000_000 + +/** Shared by all three array forms; the "range-form" prefix is historical. */ +export const ARRAY_COMMAND_PREVIEW_TEST_ID = 'array-range-form-command-preview' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.spec.tsx new file mode 100644 index 0000000000..4a569d0d9e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.spec.tsx @@ -0,0 +1,111 @@ +import React from 'react' +import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' + +import { DeleteRangeAction } from './DeleteRangeAction' +import { DeleteRangeActionProps } from './DeleteRangeAction.types' + +const DELETE_TESTID = 'array-delete-range' +const DELETE_CONFIRM_TESTID = 'array-delete-range-confirm' + +const defaultProps: DeleteRangeActionProps = { + start: '0', + end: '9', + onDeleteRange: jest.fn(), +} + +const renderComponent = (props: Partial = {}) => + render() + +describe('DeleteRangeAction', () => { + it('opens a confirm popover stating the exact window', () => { + renderComponent({ start: '5', end: '20' }) + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + + expect( + screen.getByText( + 'Elements in range 5-20 will be permanently removed from the array.', + ), + ).toBeInTheDocument() + }) + + it('calls onDeleteRange on confirm and closes the popover', () => { + const onDeleteRange = jest.fn() + renderComponent({ onDeleteRange }) + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + fireEvent.click(screen.getByTestId(DELETE_CONFIRM_TESTID)) + + expect(onDeleteRange).toHaveBeenCalledTimes(1) + expect(screen.queryByTestId(DELETE_CONFIRM_TESTID)).not.toBeInTheDocument() + }) + + it('does not delete before the confirm click', () => { + const onDeleteRange = jest.fn() + renderComponent({ onDeleteRange }) + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + + expect(onDeleteRange).not.toHaveBeenCalled() + }) + + it.each([ + ['loading', { loading: true }], + ['disabled prop', { disabled: true }], + ['invalid start index', { start: '-1' }], + ['non-canonical end index', { end: '007' }], + ])('disables the trigger on %s', (_, props) => { + renderComponent(props) + + expect(screen.getByTestId(DELETE_TESTID)).toBeDisabled() + }) + + it('stays enabled for an over-cap span (the cap only guards the view query)', () => { + // ARDELRANGE accepts any inclusive window — deleting 0..10M without + // loading it first is a supported flow, so it is not span-capped. + renderComponent({ start: '0', end: '10000000' }) + + expect(screen.getByTestId(DELETE_TESTID)).not.toBeDisabled() + }) + + it('stays enabled for a reversed range (deletes the same inclusive window)', () => { + renderComponent({ start: '20', end: '5' }) + + expect(screen.getByTestId(DELETE_TESTID)).not.toBeDisabled() + }) + + it('closes an open confirm popover when the key changes', () => { + // A confirm left open across a key switch would target the new key + // with stale or default bounds. + const { rerender } = renderComponent({ keyName: 'readings' }) + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeInTheDocument() + + rerender() + + expect(screen.queryByTestId(DELETE_CONFIRM_TESTID)).not.toBeInTheDocument() + }) + + it('closes an open confirm popover when the action becomes disabled', () => { + const { rerender } = renderComponent() + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeInTheDocument() + + rerender() + + expect(screen.queryByTestId(DELETE_CONFIRM_TESTID)).not.toBeInTheDocument() + }) + + it('disables the confirm button when an index turns invalid while open', () => { + const { rerender } = renderComponent() + + fireEvent.click(screen.getByTestId(DELETE_TESTID)) + expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).not.toBeDisabled() + + rerender() + + expect(screen.getByTestId(DELETE_CONFIRM_TESTID)).toBeDisabled() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.tsx new file mode 100644 index 0000000000..d10d8f62b7 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.tsx @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from 'react' + +import { useTranslation } from 'uiSrc/i18n' +import ConfirmationPopover from 'uiSrc/components/confirmation-popover' +import { DestructiveButton } from 'uiSrc/components/base/forms/buttons' +import { DeleteIcon } from 'uiSrc/components/base/icons' +import { parseArrayIndex } from 'uiSrc/utils/arrayIndex' + +import { DeleteRangeActionProps } from './DeleteRangeAction.types' + +export const DELETE_RANGE_ACTION_TEST_ID = 'array-delete-range' + +/** + * Destructive "Delete range" action for the array View tab, shown in the + * subheader next to "Add Elements". Deletes the inclusive [start, end] window + * from the range inputs (ARDELRANGE) behind a confirm popover. + * + * Not span-capped, unlike the view query — the delete endpoint accepts any + * window, so deleting a huge range without loading it first is supported. + */ +export const DeleteRangeAction = ({ + keyName, + start, + end, + loading = false, + disabled = false, + onDeleteRange, +}: DeleteRangeActionProps) => { + const { t } = useTranslation() + const [confirmOpen, setConfirmOpen] = useState(false) + + // Don't carry an open confirm across a key switch: the inputs reset for the + // new key, so confirming would delete a stale window from it. + useEffect(() => { + setConfirmOpen(false) + }, [keyName, disabled]) + + // Only canonical decimal strings, matching the backend's @IsArrayIndex. + const startInvalid = parseArrayIndex(start) !== start + const endInvalid = parseArrayIndex(end) !== end + const deleteDisabled = startInvalid || endInvalid || loading || disabled + + return ( + setConfirmOpen(false)} + panelPaddingSize="m" + title={t('browser.array.delete.range.title')} + message={t('browser.array.delete.range.message', { start, end })} + button={ + setConfirmOpen((open) => !open)} + disabled={deleteDisabled} + data-testid={DELETE_RANGE_ACTION_TEST_ID} + > + {t('browser.array.delete.range.trigger')} + + } + confirmButton={ + { + onDeleteRange() + setConfirmOpen(false) + }} + data-testid={`${DELETE_RANGE_ACTION_TEST_ID}-confirm`} + > + {t('browser.array.delete.range.button')} + + } + /> + ) +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.types.ts new file mode 100644 index 0000000000..1a7cf00923 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/DeleteRangeAction.types.ts @@ -0,0 +1,16 @@ +export interface DeleteRangeActionProps { + /** Used to close the confirm popover when the selected key changes. */ + keyName?: string + /** Live [start, end] indexes the delete targets (BigInt-as-string). */ + start: string + end: string + /** Disables the action while the range query is in flight. */ + loading?: boolean + /** + * Disables the trigger on top of the internal index validation — set while + * the selected key's array type is not yet confirmed. + */ + disabled?: boolean + /** Runs ARDELRANGE over the inclusive [start, end] window. */ + onDeleteRange: () => void +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/index.ts new file mode 100644 index 0000000000..8c6ab3d8f5 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/delete-range-action/index.ts @@ -0,0 +1,5 @@ +export { + DeleteRangeAction, + DELETE_RANGE_ACTION_TEST_ID, +} from './DeleteRangeAction' +export type { DeleteRangeActionProps } from './DeleteRangeAction.types' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/hooks/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/hooks/index.ts index 56a51e7fa1..d80c31007d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/hooks/index.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/hooks/index.ts @@ -2,4 +2,3 @@ export { useArrayRangeQuery } from './useArrayRangeQuery' export { useArrayAggregateQuery } from './useArrayAggregateQuery' export { useArraySearchQuery } from './useArraySearchQuery' export { useArrayElementActions } from './useArrayElementActions' -export { useResponsivePreviewLabel } from './useResponsivePreviewLabel' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.constants.ts deleted file mode 100644 index 172d8e5e96..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.constants.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const PREVIEW_LABEL = 'Preview' -export const PREVIEW_COMMAND_LABEL = 'Preview command' -export const PREVIEW_TOGGLE_ARIA_LABEL = 'Toggle command preview' -export const PREVIEW_TOGGLE_SHOW_TOOLTIP = - 'Show the Redis command that will run' -export const PREVIEW_TOGGLE_HIDE_TOOLTIP = 'Hide the command preview' - -/** - * Container width (px) at or above which the toggle shows the full - * "Preview command" label; below it the label collapses to "Preview". - */ -export const PREVIEW_LABEL_WIDE_MIN_WIDTH = 700 diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.tsx deleted file mode 100644 index fb0351b3d1..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/preview-toggle/PreviewToggle.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react' - -import { RiTooltip } from 'uiSrc/components' -import { RiIcon } from 'uiSrc/components/base/icons' -import { Text } from 'uiSrc/components/base/text' - -import { - PREVIEW_COMMAND_LABEL, - PREVIEW_LABEL, - PREVIEW_TOGGLE_ARIA_LABEL, - PREVIEW_TOGGLE_HIDE_TOOLTIP, - PREVIEW_TOGGLE_SHOW_TOOLTIP, -} from './PreviewToggle.constants' -import { PreviewToggleProps } from './PreviewToggle.types' -import * as S from './PreviewToggle.styles' - -/** - * Toggle that shows/hides the inline command preview across the array forms. - * The label reads "Preview command" when there's room and collapses to - * "Preview" on narrow layouts — the caller decides via `wide`. - */ -export const PreviewToggle = ({ - pressed, - onPressedChange, - wide = false, - 'data-testid': dataTestId, -}: PreviewToggleProps) => ( - - - - {wide ? PREVIEW_COMMAND_LABEL : PREVIEW_LABEL} - - -) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.constants.ts new file mode 100644 index 0000000000..79e90ee808 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.constants.ts @@ -0,0 +1,7 @@ +import { ParseKeys } from 'i18next' + +export const ARRAY_CONTEXT_CONTROL_TEST_ID = 'array-context-control' + +export const CONTEXT_LABEL: ParseKeys = 'browser.array.context.label' +export const CONTEXT_PREFIX = '±' +export const CONTEXT_HINT: ParseKeys = 'browser.array.context.hint' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.spec.tsx new file mode 100644 index 0000000000..edfe01f492 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.spec.tsx @@ -0,0 +1,82 @@ +import React from 'react' +import { + fireEvent, + render, + screen, + userEvent, + waitFor, +} from 'uiSrc/utils/test-utils' + +import { ContextControl } from './ContextControl' +import { ContextControlProps } from './ContextControl.types' + +const defaultProps: ContextControlProps = { + context: { enabled: false, count: 5 }, + onChange: jest.fn(), +} + +const renderComponent = (props: Partial = {}) => + render() + +describe('ContextControl', () => { + it('keeps the count input disabled until the toggle is ticked', () => { + const { rerender } = renderComponent() + // Off by default → input present (so layout is stable) but disabled. + expect(screen.getByTestId('array-context-control-count')).toBeDisabled() + + rerender( + , + ) + expect(screen.getByTestId('array-context-control-count')).toBeEnabled() + }) + + it('reports enabled when the toggle is ticked', () => { + const onChange = jest.fn() + renderComponent({ onChange }) + + fireEvent.click(screen.getByTestId('array-context-control-toggle')) + + expect(onChange).toHaveBeenCalledWith({ enabled: true }) + }) + + it('shows the passed count and clamps a typed value above the max to 50', async () => { + const user = userEvent.setup() + renderComponent({ context: { enabled: true, count: 5 } }) + + const input = screen.getByTestId('array-context-control-count') + // redis-ui NumericInput renders a text input, so the DOM value is a string. + expect(input).toHaveValue('5') + + // autoValidate clamps onChange, but the field text only settles to the + // clamped value on blur — so '99' stays verbatim while typing and resolves + // to '50' once the input blurs. + await user.clear(input) + await user.type(input, '99') + await user.tab() + + await waitFor(() => { + expect(input).toHaveValue('50') + }) + }) + + it('reports a new count via onChange', () => { + const onChange = jest.fn() + renderComponent({ context: { enabled: true, count: 5 }, onChange }) + + fireEvent.change(screen.getByTestId('array-context-control-count'), { + target: { value: '8' }, + }) + + expect(onChange).toHaveBeenCalledWith({ count: 8 }) + }) + + it('disables both the toggle and the input when disabled', () => { + renderComponent({ context: { enabled: true, count: 5 }, disabled: true }) + + expect(screen.getByTestId('array-context-control-toggle')).toBeDisabled() + expect(screen.getByTestId('array-context-control-count')).toBeDisabled() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.styles.ts new file mode 100644 index 0000000000..fc615c0e49 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.styles.ts @@ -0,0 +1,16 @@ +import styled from 'styled-components' +import { Checkbox } from 'uiSrc/components/base/forms/checkbox/Checkbox' +import { Row } from 'uiSrc/components/base/layout/flex' + +/** Trim the checkbox label's trailing padding so the InfoHint hugs the text. */ +export const InlineCheckbox = styled(Checkbox)` + & label { + padding-inline-end: 0; + padding-right: 0; + } +` + +/** Compact fixed-width box so the count reads as a small inline field. */ +export const NarrowInputBox = styled(Row)` + width: 110px; +` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.tsx new file mode 100644 index 0000000000..498639f41a --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.tsx @@ -0,0 +1,72 @@ +import React from 'react' + +import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' +import { NumericInput } from 'uiSrc/components/base/inputs' +import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' + +import { InfoHint } from '../../components/InfoHint' +import { CONTEXT_COUNT_MAX, CONTEXT_COUNT_MIN } from '../../constants' +import { + ARRAY_CONTEXT_CONTROL_TEST_ID as TEST_ID, + CONTEXT_HINT, + CONTEXT_LABEL, + CONTEXT_PREFIX, +} from './ContextControl.constants' +import { ContextControlProps } from './ContextControl.types' +import * as S from './ContextControl.styles' + +/** + * Toggle + ±N neighbour count that controls how a matched row expands. Lives + * in the subheader, not the search form, as it never enters the ARGREP command. + */ +export const ContextControl = ({ + context, + onChange, + disabled = false, +}: ContextControlProps) => { + const { t } = useTranslation() + return ( + + + + + onChange({ enabled: e.target.checked })} + disabled={disabled} + data-testid={`${TEST_ID}-toggle`} + /> + + + + + + + + {CONTEXT_PREFIX} + + {/* Always shown so the row doesn't shift; just disabled while Context is off. */} + + + + onChange({ + count: Math.round(Number(next ?? CONTEXT_COUNT_MIN)), + }) + } + disabled={disabled || !context.enabled} + data-testid={`${TEST_ID}-count`} + /> + + + + ) +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.types.ts new file mode 100644 index 0000000000..dcfecc000e --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/ContextControl.types.ts @@ -0,0 +1,20 @@ +/** + * Per-match context window shown when a result row is expanded: a toggle plus + * the ±N neighbour count. A display concern, kept out of the ARGREP command. + */ +export type ContextOption = { + enabled: boolean + count: number +} + +export interface ContextControlProps { + /** Current toggle + count state (owned by SearchTab). */ + context: ContextOption + /** Patch the context state (partial merge). */ + onChange: (patch: Partial) => void + /** + * Disables the toggle and the count input. Mirrors the Search form's prior + * coupling to `isRefreshDisabled` so behavior is unchanged by the move. + */ + disabled?: boolean +} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/index.ts new file mode 100644 index 0000000000..fc2e7fbcb1 --- /dev/null +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/ContextControl/index.ts @@ -0,0 +1,2 @@ +export { ContextControl } from './ContextControl' +export type { ContextOption, ContextControlProps } from './ContextControl.types' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.styles.ts index c7e7551bde..a3262a311a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.styles.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.styles.ts @@ -2,11 +2,21 @@ import React from 'react' import styled from 'styled-components' import { Col } from 'uiSrc/components/base/layout/flex' -const INDEX_COLUMN_MIN_WIDTH = '120px' -const VALUE_COLUMN_MIN_WIDTH = '160px' +import { + ACTIONS_COLUMN_SIZE, + INDEX_COLUMN_SIZE, + SELECTION_COLUMN_WIDTH_REM, + VALUE_COLUMN_SIZE, +} from '../../array-details-table/constants' + +// Mirror the parent table's columns (selection + index + value + actions +// spacers) so expanded rows line up under them at any width. `* 10` scales the +// rem selection width to the px columns' scale (app's 62.5% root). +const SELECTION_COLUMN_FR = SELECTION_COLUMN_WIDTH_REM * 10 export const Band = styled(Col)` - padding: ${({ theme }) => theme.core.space.space050}; + width: 100%; + padding: ${({ theme }) => theme.core.space.space050} 0; ` export const BandRow = styled.div< @@ -14,15 +24,31 @@ export const BandRow = styled.div< >` display: grid; grid-template-columns: - minmax(${INDEX_COLUMN_MIN_WIDTH}, 1fr) - minmax(${VALUE_COLUMN_MIN_WIDTH}, 2fr); - gap: ${({ theme }) => theme.core.space.space100}; - padding: ${({ theme }) => theme.core.space.space050}; + minmax(0, ${SELECTION_COLUMN_FR}fr) + minmax(0, ${INDEX_COLUMN_SIZE}fr) + minmax(0, ${VALUE_COLUMN_SIZE}fr) + minmax(0, ${ACTIONS_COLUMN_SIZE}fr); + /* Center cells vertically so a short index stays aligned with a value that + wraps to multiple lines. */ + align-items: center; background: ${({ theme, $match }) => $match ? theme.semantic.color.background.neutral200 : 'transparent'}; ` +// Match the parent body cell's padding and overflow so content lines up under — +// and clips like — the parent columns. +export const BandCell = styled.div` + min-width: 0; + overflow: hidden; + padding: ${({ theme }) => theme.core.space.space050} + ${({ theme }) => theme.core.space.space150}; +` + export const Message = styled(Col)` padding: ${({ theme }) => theme.core.space.space100}; + padding-left: calc( + ${SELECTION_COLUMN_WIDTH_REM}rem + + ${({ theme }) => theme.core.space.space150} + ); color: ${({ theme }) => theme.semantic.color.text.neutral600}; ` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.tsx index 70a521daaa..7bccb4944c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/NeighbourBand/NeighbourBand.tsx @@ -9,6 +9,7 @@ import { ArrayDataElement } from 'uiSrc/slices/interfaces/array' import { getNeighbourRange } from 'uiSrc/utils/arrayIndex' import { DEFAULT_ERROR_MESSAGE, Nullable } from 'uiSrc/utils' import { KeyValueCompressor } from 'uiSrc/constants' +import { useTranslation } from 'uiSrc/i18n' import { ARRAY_TABLE_LOADING_MESSAGE } from '../../array-details-table/constants' import { @@ -32,6 +33,7 @@ export const NeighbourBand = ({ matchIndex, count, }: NeighbourBandProps) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const { compressor = null } = useAppSelector( connectedInstanceSelector, @@ -79,7 +81,7 @@ export const NeighbourBand = ({ if (loading) { return ( - {ARRAY_TABLE_LOADING_MESSAGE} + {t(ARRAY_TABLE_LOADING_MESSAGE)} ) } @@ -106,13 +108,19 @@ export const NeighbourBand = ({ : `${TEST_ID_PREFIX}-row-${el.index}` } > - - + + + + + + + + ) })} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.spec.tsx index 98738592f7..21d765357d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.spec.tsx @@ -55,6 +55,12 @@ describe('SearchTab', () => { expect(screen.getByTestId('array-search-form')).toBeInTheDocument() }) + it('renders the value-format selector', () => { + renderTab() + + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + }) + it('disables the search form while the key is locked for editing', () => { // isRefreshDisabled is set by the active table while a value editor is open // or an ARSET is in flight; the query form must not reload the table then. @@ -156,7 +162,7 @@ describe('SearchTab', () => { // Context is off by default — enable it so the row can expand. fireEvent // sidesteps the redis-ui control's `pointer-events: none` wrapper. - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) await user.click(screen.getByTestId('array-details-table-index-7')) @@ -205,7 +211,7 @@ describe('SearchTab', () => { data: [arrayElementWithValueFactory.build({ index: '7' })], }) - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) expect( screen.getByTestId('array-details-table-index-7-expander'), @@ -225,7 +231,7 @@ describe('SearchTab', () => { data: [arrayElementWithValueFactory.build({ index: '7' })], }) - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) await user.click(screen.getByTestId('array-details-table-index-7')) await waitFor(() => @@ -245,12 +251,12 @@ describe('SearchTab', () => { // Enabling Context enables its count input; reset must turn it back off // (context state lives in SearchTab, not the query hook's resetQuery). - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) - expect(screen.getByTestId('array-search-form-context')).toBeEnabled() + fireEvent.click(screen.getByTestId('array-context-control-toggle')) + expect(screen.getByTestId('array-context-control-count')).toBeEnabled() fireEvent.click(screen.getByTestId('array-search-form-reset')) - expect(screen.getByTestId('array-search-form-context')).toBeDisabled() + expect(screen.getByTestId('array-context-control-count')).toBeDisabled() }) it('drops the multi-select when the search is reset', async () => { @@ -290,7 +296,7 @@ describe('SearchTab', () => { data: [arrayElementWithValueFactory.build({ index: '7' })], }) - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) await user.click(screen.getByTestId('array-details-table-index-7')) expect( await screen.findByTestId('array-context-band-7'), @@ -298,7 +304,7 @@ describe('SearchTab', () => { // Toggling Context off must unmount the band (and stop its fetch), not // leave an already-expanded match still showing it. - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) await waitFor(() => expect( @@ -308,19 +314,28 @@ describe('SearchTab', () => { }) it('resets Context to off when the selected key changes', () => { - const { rerender } = renderTab({ + // Context lives in the subheader (gated on isArrayKeyReady), so move the + // prop and the store's selected key together to keep it visible to assert. + const state = buildState({ loaded: true, loading: false, error: '', data: [arrayElementWithValueFactory.build({ index: '7' })], }) + const store = mockStore(state) + store.clearActions() + const { rerender } = render(, { + store, + }) - fireEvent.click(screen.getByTestId('array-search-form-context-toggle')) + fireEvent.click(screen.getByTestId('array-context-control-toggle')) expect(screen.getByRole('checkbox', { name: 'Context' })).toBeChecked() // The tab stays mounted across key switches; selecting another key resets // Context to its default rather than inheriting the previous key's. - rerender() + const otherKey = stringToBuffer('other-key') + state.browser.keys.selectedKey.data!.name = otherKey + rerender() expect(screen.getByRole('checkbox', { name: 'Context' })).not.toBeChecked() }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.tsx index 7b0d0c4087..b33c451467 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/search-tab/SearchTab.tsx @@ -1,13 +1,15 @@ -import React, { useEffect, useRef, useState } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' import { selectedKeySelector } from 'uiSrc/slices/browser/keys' +import { KeyTypes } from 'uiSrc/constants' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { bufferToString, isEqualBuffers } from 'uiSrc/utils' import { ArrayDetailsTable } from '../array-details-table' import { ArraySearchForm } from '../array-search-form' -import { ContextOption } from '../array-search-form/ArraySearchForm.types' +import { ContextControl, ContextOption } from './ContextControl' +import { KeyDetailsSubheader } from '../../key-details-subheader/KeyDetailsSubheader' import { useArraySearchQuery, useArrayElementActions } from '../hooks' import { DEFAULT_CONTEXT } from '../constants' import * as S from '../tabs.styles' @@ -19,15 +21,12 @@ const SearchTab = ({ keyProp, isActive }: SearchTabProps) => { useAppSelector(selectedKeySelector) const keyName = keyProp ? bufferToString(keyProp) : '' - // Context is a display concern (±N neighbours on expand), off by default so - // result rows aren't expandable until the user opts in. + // Display-only ±N neighbours shown when a row expands; off by default. const [context, setContext] = useState(DEFAULT_CONTEXT) const onChangeContext = (patch: Partial) => setContext((c) => ({ ...c, ...patch })) - // Context is SearchTab-owned and the tab stays mounted across key switches, - // so reset it on a real key change — otherwise a new key inherits the - // previous key's toggle/count (the query hook resets only its own state). + // The tab stays mounted across key switches, so reset Context on a new key. const lastKeyRef = useRef(null) useEffect(() => { if (!keyProp) return @@ -55,22 +54,41 @@ const SearchTab = ({ keyProp, isActive }: SearchTabProps) => { loaded, } = useArraySearchQuery(keyProp) - // Every result is a real match — an index-only row (WITHVALUES off) has a - // null value but is still deletable — so empty-slot hiding is off here. The - // delete thunk refreshes all loaded views (incl. this search) afterwards. + // Every result is a real match (index-only rows still delete), so keep empty slots. const { deleteConfig, selectionConfig, bulkDeleteConfig, clearSelection } = useArrayElementActions(keyProp, { elements, hideEmptySlots: false }) - // Context lives here, not in the query hook, so the form's reset must - // restore it too — otherwise reset leaves rows expandable at the old count. - // Reset also drops the multi-select: clearing the results shouldn't leave a - // stale selection that a later search could partially restore. + // Reset the state the query hook doesn't own: Context and the selection. const handleReset = () => { setContext(DEFAULT_CONTEXT) clearSelection() resetQuery() } + // Show Context and the table only after a search; the !keyLoading guard + // avoids flashing the previous key's matches during a switch. + const showResults = !keyLoading && (loaded || loading) + + // Stable identity via ref so the subheader doesn't remount the control and + // steal focus from the count input while typing. + const contextActionsRef = useRef({ + context, + onChangeContext, + isRefreshDisabled, + }) + contextActionsRef.current = { context, onChangeContext, isRefreshDisabled } + + const ContextStartActions = useCallback( + () => ( + + ), + [], + ) + return ( <> { onChangePredicate={updatePredicate} onChangeCombinator={setCombinator} onChangeOptions={updateOptions} - context={context} - onChangeContext={onChangeContext} onRun={runSearch} onReset={handleReset} disabled={!isArrayKeyReady || isRefreshDisabled} /> + {isArrayKeyReady && ( + + )} - {/* Keep the tab blank until the user runs a search, then let - ArrayDetailsTable own the loading / error / empty states. Gate on - the key not loading too, so a key switch can't flash the previous - key's matches before the hook's reset effect runs. */} - {!keyLoading && (loaded || loading) && ( + {showResults && ( { + it('renders the value-format selector alongside Add Elements', () => { + renderView(keyBuffer, {}, [ + arrayElementWithValueFactory.build({ index: '7' }), + ]) + + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + expect(screen.getByTestId(ADD_BTN)).toBeInTheDocument() + }) + + it('renders Markdown values inline in the row without expansion', () => { + const state = buildState([ + arrayElementWithValueFactory.build({ + index: '7', + value: stringToBuffer('# Heading'), + }), + ]) + state.browser.keys.selectedKey.viewFormat = KeyValueFormat.Markdown + const store = mockStore(state) + store.clearActions() + render(, { store }) + + expect(screen.getByTestId('markdown-viewer')).toBeInTheDocument() + expect( + screen.queryByTestId('array-expanded-value-7'), + ).not.toBeInTheDocument() + }) + it('renders a per-row delete affordance for a populated element', () => { renderView(keyBuffer, {}, [ arrayElementWithValueFactory.build({ index: '7' }), @@ -140,10 +167,8 @@ describe('ViewTab', () => { arrayElementWithValueFactory.build({ index: '7' }), ]) - fireEvent.click(screen.getByTestId('array-range-form-delete')) - fireEvent.click( - await screen.findByTestId('array-range-form-delete-confirm'), - ) + fireEvent.click(screen.getByTestId('array-delete-range')) + fireEvent.click(await screen.findByTestId('array-delete-range-confirm')) // The form's default range is the live input value the delete targets. await waitFor(() => @@ -174,10 +199,8 @@ describe('ViewTab', () => { await screen.findByTestId('array-bulk-remove-btn-icon'), ).toBeInTheDocument() - fireEvent.click(screen.getByTestId('array-range-form-delete')) - fireEvent.click( - await screen.findByTestId('array-range-form-delete-confirm'), - ) + fireEvent.click(screen.getByTestId('array-delete-range')) + fireEvent.click(await screen.findByTestId('array-delete-range-confirm')) await waitFor(() => expect( @@ -186,6 +209,27 @@ describe('ViewTab', () => { ) }) + it('keeps the delete-range confirm open across a non-key re-render', async () => { + // The confirm lives in DeleteRangeAction local state, so it survives only + // while the Actions render prop keeps a stable identity. A fresh Actions + // each render would be a new component type, remounting DeleteRangeAction + // and silently dropping an open confirm on any parent update. + const { rerender } = renderView(keyBuffer, {}, [ + arrayElementWithValueFactory.build({ index: '7' }), + ]) + + fireEvent.click(screen.getByTestId('array-delete-range')) + expect( + await screen.findByTestId('array-delete-range-confirm'), + ).toBeInTheDocument() + + // Re-render that is not a key switch (same bytes, fresh buffer): the open + // confirm must not be torn down. + rerender() + + expect(screen.getByTestId('array-delete-range-confirm')).toBeInTheDocument() + }) + it('drops the multi-select when the range is reset', async () => { // resetQuery refires the default range with resetData:false, so the current // rows stay rendered; the selection must still clear on reset. diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.styles.ts deleted file mode 100644 index 7da8416730..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from 'styled-components' -import { FlexItem } from 'uiSrc/components/base/layout/flex' - -/** Subheader strip hosting the right-aligned "Add Elements" action, mirroring - * VectorSetKeySubheader so the array view matches the other key types. */ -export const SubheaderContainer = styled(FlexItem)` - padding: ${({ theme }) => - `${theme.core?.space.space150} ${theme.core?.space.space200} 0`}; -` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.tsx index 001952f7d1..4564fffd9f 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/view-tab/ViewTab.tsx @@ -1,30 +1,31 @@ -import React, { useEffect, useRef, useState } from 'react' -import AutoSizer from 'react-virtualized-auto-sizer' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { selectedKeySelector } from 'uiSrc/slices/browser/keys' import { deleteArrayRange } from 'uiSrc/slices/browser/array' +import { KeyTypes } from 'uiSrc/constants' import { bufferToString, isEqualBuffers } from 'uiSrc/utils' import { Row } from 'uiSrc/components/base/layout/flex' import { AddItemsAction } from 'uiSrc/pages/browser/modules/key-details/components/key-details-actions' +import { useTranslation } from 'uiSrc/i18n' import { ArrayDetailsTable } from '../array-details-table' import { ArrayRangeForm } from '../array-range-form' import { ArrayAddForm } from '../array-add-form' +import { DeleteRangeAction } from '../delete-range-action' +import { KeyDetailsSubheader } from '../../key-details-subheader/KeyDetailsSubheader' import { AddKeysContainer } from '../../common/AddKeysContainer.styled' import { useArrayRangeQuery, useArrayElementActions } from '../hooks' import * as S from '../tabs.styles' -import * as LS from './ViewTab.styles' import { ViewTabProps } from './ViewTab.types' -const ADD_ELEMENTS_TITLE = 'Add Elements' - const ViewTab = ({ keyProp, isActive, onOpenAddItemPanel, onCloseAddItemPanel, }: ViewTabProps) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const { loading, isRefreshDisabled } = useAppSelector(selectedKeySelector) const keyName = keyProp ? bufferToString(keyProp) : '' @@ -102,6 +103,45 @@ const ViewTab = ({ } } + // KeyDetailsSubheader renders the Actions render prop as , so a + // fresh function each render is a new component type — React would remount the + // subtree and drop DeleteRangeAction's open confirm popover on any parent + // update (editing the range, a loading flip, a redux change). Keep Actions' + // identity stable and read live values through a ref so it stays dep-free. + const latest = { + keyName, + start, + end, + rangeLoading, + isRefreshDisabled, + handleDeleteRange, + openAddPanel, + t, + } + const latestRef = useRef(latest) + latestRef.current = latest + + const Actions = useCallback( + ({ width }: { width: number }) => ( + + + + + ), + [], + ) + return ( <> {isArrayKeyReady && ( - - - {({ width = 0 }) => ( - - - - )} - - + )} {!loading && ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.spec.tsx index 5e24268c96..43aec21191 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.spec.tsx @@ -47,7 +47,7 @@ describe('DynamicTypeDetails', () => { expect(queryByTestId('too-long-key-name-details')).toBeInTheDocument() }) - it('does not render array-details when dev-array flag is disabled', () => { + it('does not render array-details when array flag is disabled', () => { const { queryByTestId } = render( { expect(queryByTestId('unsupported-type-details')).toBeInTheDocument() }) - it('renders array-details when dev-array flag is enabled', () => { + it('renders array-details when array flag is enabled', () => { const stateWithFlag = set( cloneDeep(initialStateDefault), - `app.features.featureFlags.features.${FeatureFlags.devArray}`, + `app.features.featureFlags.features.${FeatureFlags.array}`, { flag: true }, ) const { queryByTestId } = render( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.tsx index 7e6f014b91..8ed19210a6 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/dynamic-type-details/DynamicTypeDetails.tsx @@ -8,10 +8,11 @@ import { import { KeyDetailsHeaderProps } from 'uiSrc/pages/browser/modules' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { - isDevArrayEnabledSelector, - isVectorSetEnabledSelector, + isArrayEnabledSelector, + isValueDecoderEnabledSelector, } from 'uiSrc/slices/app/features' import { isTruncatedString } from 'uiSrc/utils' +import { ValueDecoderProvider } from 'uiSrc/pages/browser/components/value-decoder' import TooLongKeyNameDetails from 'uiSrc/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails' import ModulesTypeDetails from '../modules-type-details/ModulesTypeDetails' import UnsupportedTypeDetails from '../unsupported-type-details/UnsupportedTypeDetails' @@ -34,20 +35,26 @@ export interface Props extends KeyDetailsHeaderProps { const DynamicTypeDetails = (props: Props) => { const { keyType: selectedKeyType, keyProp } = props - const isVectorSet = useAppSelector(isVectorSetEnabledSelector) - const isArray = useAppSelector(isDevArrayEnabledSelector) + const isArray = useAppSelector(isArrayEnabledSelector) + const isValueDecoderEnabled = useAppSelector(isValueDecoderEnabledSelector) + + const hashDetails = isValueDecoderEnabled ? ( + + + + ) : ( + + ) const TypeDetails: any = { [KeyTypes.ZSet]: , [KeyTypes.Set]: , [KeyTypes.String]: , - [KeyTypes.Hash]: , + [KeyTypes.Hash]: hashDetails, [KeyTypes.List]: , [KeyTypes.ReJSON]: , [KeyTypes.Stream]: , - ...(isVectorSet && { - [KeyTypes.VectorSet]: , - }), + [KeyTypes.VectorSet]: , ...(isArray && { [KeyTypes.Array]: , }), diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/HashDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/HashDetails.tsx index 799d6a62b8..43bf2f87ae 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/HashDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/HashDetails.tsx @@ -16,6 +16,7 @@ import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features' import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry' import Divider from 'uiSrc/components/divider/Divider' import { Checkbox } from 'uiSrc/components/base/forms/checkbox/Checkbox' +import { useTranslation } from 'uiSrc/i18n' import AddHashFields from './add-hash-fields/AddHashFields' import { HashDetailsTable } from './hash-details-table' import { KeyDetailsSubheader } from '../key-details-subheader/KeyDetailsSubheader' @@ -32,6 +33,7 @@ export interface Props extends KeyDetailsHeaderProps { const HashDetails = (props: Props) => { const keyType = KeyTypes.Hash const { onRemoveKey, onOpenAddItemPanel, onCloseAddItemPanel } = props + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) const { version } = useAppSelector(connectedInstanceOverviewSelector) @@ -76,7 +78,7 @@ const HashDetails = (props: Props) => { handleSelectShow(e.target.checked)} data-testid="test-check-ttl" @@ -85,7 +87,7 @@ const HashDetails = (props: Props) => { )} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/add-hash-fields/AddHashFields.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/add-hash-fields/AddHashFields.tsx index be8c27fcb5..332ed22f7b 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/add-hash-fields/AddHashFields.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/add-hash-fields/AddHashFields.tsx @@ -36,6 +36,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { EntryContent } from '../../common/AddKeysContainer.styled' @@ -46,6 +47,7 @@ export interface Props { const AddHashFields = (props: Props) => { const { isExpireFieldsAvailable, closePanel } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const [fields, setFields] = useState([ { ...INITIAL_HASH_FIELD_STATE }, @@ -165,14 +167,11 @@ const AddHashFields = (props: Props) => { const handleSubmit = () => { requestConfirmation({ - title: 'Add fields on production database?', - actionDescription: ( - <> - You are about to add {fields.length} field - {fields.length === 1 ? '' : 's'} to a hash on a production database. - - ), - confirmButtonText: 'Add fields', + title: t('browser.hash.add.confirmTitle'), + actionDescription: t('browser.hash.add.confirmMessage', { + count: fields.length, + }), + confirmButtonText: t('browser.hash.add.confirmButton'), commandId: BrowserConfirmationCommandId.AddHashFields, disableConfirmationInput: true, onConfirm: submitData, @@ -199,7 +198,7 @@ const AddHashFields = (props: Props) => { @@ -217,7 +216,7 @@ const AddHashFields = (props: Props) => { @@ -233,7 +232,7 @@ const AddHashFields = (props: Props) => { @@ -259,7 +258,7 @@ const AddHashFields = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-fields-btn" > - Cancel + {t('browser.hash.add.cancel')}
@@ -271,7 +270,7 @@ const AddHashFields = (props: Props) => { onClick={handleSubmit} data-testid="save-fields-btn" > - Save + {t('browser.hash.add.save')}
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/hash-details-table/HashDetailsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/hash-details-table/HashDetailsTable.tsx index 985bfdc8c5..df7e33ac58 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/hash-details-table/HashDetailsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/hash-details-table/HashDetailsTable.tsx @@ -3,7 +3,7 @@ import React, { Ref, useCallback, useEffect, useRef, useState } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { CellMeasurerCache } from 'react-virtualized' -import { isNumber, toNumber } from 'lodash' +import { isNumber, isString, toNumber } from 'lodash' import { Text } from 'uiSrc/components/base/text' import { getColumnWidth } from 'uiSrc/components/virtual-grid' import { StopPropagation } from 'uiSrc/components/virtual-table' @@ -17,12 +17,8 @@ import { KeyTypes, OVER_RENDER_BUFFER_COUNT, TableCellAlignment, - TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA, - TEXT_DISABLED_COMPRESSED_VALUE, - TEXT_DISABLED_FORMATTER_EDITING, - TEXT_FAILED_CONVENT_FORMATTER, - TEXT_INVALID_VALUE, - TEXT_UNPRINTABLE_CHARACTERS, + getTextInvalidValue, + getTextUnprintableCharacters, } from 'uiSrc/constants' import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api' import HelpTexts from 'uiSrc/constants/help-texts' @@ -75,12 +71,19 @@ import { import { stringToBuffer } from 'uiSrc/utils/formatters/bufferFormatters' import { decompressingBuffer } from 'uiSrc/utils/decompressors' import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete' +import { isValueDecoderEnabledSelector } from 'uiSrc/slices/app/features' +import { + DecodedValueDisplay, + useValueDecoder, + ValueDecoderHeaderLabel, +} from 'uiSrc/pages/browser/components/value-decoder' import { EditableInput, EditableTextArea, FormattedValue, } from 'uiSrc/pages/browser/modules/key-details/shared' import { RiTooltip } from 'uiSrc/components' +import { useTranslation } from 'uiSrc/i18n' import { AddFieldsToHashDto, GetHashFieldsResponse, @@ -109,6 +112,7 @@ export interface Props { const HashDetailsTable = (props: Props) => { const { isExpireFieldsAvailable, onRemoveKey } = props + const { t } = useTranslation() const { total, @@ -143,13 +147,30 @@ const HashDetailsTable = (props: Props) => { const formattedLastIndexRef = useRef(OVER_RENDER_BUFFER_COUNT) const tableRef: Ref = useRef(null) + const isInitialDecodeLayoutRef = useRef(true) const dispatch = useAppDispatch() + const isValueDecoderEnabled = useAppSelector(isValueDecoderEnabledSelector) + const { isDecodeEnabled, matchedRule } = useValueDecoder() useEffect(() => { resetState() }, [lastRefreshTime]) + useEffect(() => { + if (!isValueDecoderEnabled) { + return + } + + if (isInitialDecodeLayoutRef.current) { + isInitialDecodeLayoutRef.current = false + return + } + + cellCache.clearAll() + tableRef.current?.recomputeRowHeights() + }, [isDecodeEnabled, isValueDecoderEnabled, matchedRule]) + useEffect(() => { setFields(loadedFields) @@ -350,12 +371,12 @@ const HashDetailsTable = (props: Props) => { const columns: ITableColumn[] = [ { id: 'field', - label: 'Field', + label: t('browser.hash.column.field'), isSearchable: true, isResizable: true, minWidth: 120, relativeWidth: hashSizes?.field || 40, - prependSearchName: 'Field:', + prependSearchName: t('browser.hash.searchFieldPrefix'), initialSearchValue: '', truncateText: true, alignment: TableCellAlignment.Left, @@ -398,8 +419,10 @@ const HashDetailsTable = (props: Props) => { expanded={expanded} title={ isValid - ? 'Field' - : TEXT_FAILED_CONVENT_FORMATTER(viewFormatProp) + ? t('browser.hash.column.field') + : t('browser.keyDetails.failedConvertFormatter', { + format: viewFormatProp, + }) } tooltipContent={tooltipContent} /> @@ -410,7 +433,11 @@ const HashDetailsTable = (props: Props) => { }, { id: 'value', - label: 'Value', + label: isValueDecoderEnabled ? ( + + ) : ( + t('browser.hash.column.value') + ), minWidth: 120, truncateText: true, alignment: TableCellAlignment.Left, @@ -449,10 +476,10 @@ const HashDetailsTable = (props: Props) => { isFormatEditable(viewFormat) && !isTruncatedFieldOrValue const editTooltipContent = isCompressed - ? TEXT_DISABLED_COMPRESSED_VALUE + ? t('browser.keyDetails.compressedValueDisabled') : isTruncatedFieldOrValue - ? TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA - : TEXT_DISABLED_FORMATTER_EDITING + ? t('browser.keyDetails.truncatedActionDisabled') + : t('browser.keyDetails.formatterEditingDisabled') const isEditing = editingIndex?.field === 'value' && editingIndex?.index === rowIndex @@ -460,6 +487,21 @@ const HashDetailsTable = (props: Props) => { ? bufferToSerializedFormat(viewFormat, valueItem, 4) : '' + const formattedValueDisplay = ( + + ) + return ( { isDisabled={disabled} isEditing={isEditing} isEditDisabled={!isEditable || updateLoading} - disabledTooltipText={TEXT_UNPRINTABLE_CHARACTERS} + disabledTooltipText={getTextUnprintableCharacters(t)} onDecline={() => handleEditField(rowIndex, false, 'value')} onApply={(value) => handleApplyEditValue(fieldItem, value, rowIndex) } - approveText={TEXT_INVALID_VALUE} + approveText={getTextInvalidValue(t)} approveByValidation={(value) => formattingBuffer( stringToSerializedBufferFormat(viewFormat, value), @@ -488,16 +530,17 @@ const HashDetailsTable = (props: Props) => { testIdPrefix="hash" >
- + {isValueDecoderEnabled && + !isTruncatedFieldOrValue && + !isString(decompressedValueItem) ? ( + + ) : ( + formattedValueDisplay + )}
) @@ -538,7 +581,7 @@ const HashDetailsTable = (props: Props) => { if (isExpireFieldsAvailable) { columns.splice(2, 0, { id: 'ttl', - label: 'TTL', + label: t('browser.hash.column.ttl'), absoluteWidth: 140, minWidth: 140, truncateText: true, @@ -554,13 +597,13 @@ const HashDetailsTable = (props: Props) => { editingIndex?.field === 'ttl' && editingIndex?.index === rowIndex const isTruncatedFieldName = isTruncatedString(fieldItem) const editTooltipContent = isTruncatedFieldName - ? TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA + ? t('browser.keyDetails.truncatedActionDisabled') : null return ( handleEditField(rowIndex, value, 'ttl')} @@ -574,10 +617,10 @@ const HashDetailsTable = (props: Props) => { >
{expire === -1 ? ( - 'No Limit' + t('browser.hash.ttlNoLimit') ) : ( () +const MockActions = () =>
+const MockStartActions = () =>
+ describe('KeyDetailsSubheader', () => { it('should render', () => { expect( render(), ).toBeTruthy() }) + + it('renders the value formatter for a supported key type', () => { + render() + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + }) + + it('omits the trailing divider when no Actions are provided', () => { + render() + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + expect(screen.queryByRole('separator')).not.toBeInTheDocument() + }) + + it('renders the divider between the formatter and the Actions', () => { + render( + , + ) + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + expect(screen.getByTestId('mock-actions')).toBeInTheDocument() + expect(screen.getByRole('separator')).toBeInTheDocument() + }) + + it('renders StartActions at the start alongside the formatter', () => { + render( + , + ) + expect(screen.getByTestId('mock-start-actions')).toBeInTheDocument() + expect(screen.getByTestId('select-format-key-value')).toBeInTheDocument() + }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-subheader/KeyDetailsSubheader.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-subheader/KeyDetailsSubheader.tsx index ae9c67ebe6..1fd38d5e7d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-subheader/KeyDetailsSubheader.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-subheader/KeyDetailsSubheader.tsx @@ -11,26 +11,51 @@ import styles from './styles.module.scss' export interface Props { keyType: KeyTypes | ModulesKeyTypes Actions?: (props: { width: number }) => ReactElement + /** Rendered at the start (left) of the row, opposite the formatter and Actions. */ + StartActions?: (props: { width: number }) => ReactElement } -export const KeyDetailsSubheader = ({ keyType, Actions }: Props) => ( +export const KeyDetailsSubheader = ({ + keyType, + Actions, + StartActions, +}: Props) => ( - {({ width = 0 }) => ( -
- + {({ width = 0 }) => { + const formatterGroup = ( + <> {Object.values(KeyTypes).includes(keyType as KeyTypes) && ( <> - + {!isUndefined(Actions) && ( + + )} )} {!isUndefined(Actions) && } - -
- )} + + ) + + return ( +
+ {isUndefined(StartActions) ? ( + + {formatterGroup} + + ) : ( + + + + {formatterGroup} + + + )} +
+ ) + }}
) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/ListDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/ListDetails.tsx index 89d22b1eb4..785331110f 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/ListDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/ListDetails.tsx @@ -17,6 +17,7 @@ import { AddItemsAction, RemoveItemsAction } from '../key-details-actions' import { KeyDetailsSubheader } from '../key-details-subheader/KeyDetailsSubheader' import styles from './styles.module.scss' import { AddKeysContainer } from '../common/AddKeysContainer.styled' +import { useTranslation } from 'uiSrc/i18n' export interface Props extends KeyDetailsHeaderProps { onRemoveKey: () => void @@ -27,6 +28,7 @@ export interface Props extends KeyDetailsHeaderProps { const ListDetails = (props: Props) => { const keyType = KeyTypes.List const { onRemoveKey, onOpenAddItemPanel, onCloseAddItemPanel } = props + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) const [isRemoveItemPanelOpen, setIsRemoveItemPanelOpen] = @@ -58,13 +60,13 @@ const ListDetails = (props: Props) => { const Actions = ({ width }: { width: number }) => ( <>
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements.tsx index 4e1327ad80..791a7ceb80 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useRef, useState } from 'react' +import { TFunction } from 'i18next' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { @@ -15,7 +16,7 @@ import { } from 'uiSrc/telemetry' import { KeyTypes } from 'uiSrc/constants' import { stringToBuffer } from 'uiSrc/utils' -import { AddListFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { getAddListFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { PrimaryButton, @@ -28,6 +29,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { EntryContent } from '../../common/AddKeysContainer.styled' @@ -40,21 +42,24 @@ export const TAIL_DESTINATION: ListElementDestination = export const HEAD_DESTINATION: ListElementDestination = ListElementDestination.Head -export const optionsDestinations = [ +const getPushDestinations = (t: TFunction) => [ { value: TAIL_DESTINATION, - inputDisplay: 'Push to tail', - label: 'Push to tail', + inputDisplay: t('browser.list.destination.tail'), + label: t('browser.list.destination.tail'), }, { value: HEAD_DESTINATION, - inputDisplay: 'Push to head', - label: 'Push to head', + inputDisplay: t('browser.list.destination.head'), + label: t('browser.list.destination.head'), }, ] const AddListElements = (props: Props) => { const { closePanel } = props + const { t } = useTranslation() + const config = getAddListFormConfig(t) + const optionsDestinations = getPushDestinations(t) const [elements, setElements] = useState(['']) const [destination, setDestination] = @@ -125,14 +130,11 @@ const AddListElements = (props: Props) => { const handleSubmit = () => { requestConfirmation({ - title: 'Add elements on production database?', - actionDescription: ( - <> - You are about to push {elements.length} element - {elements.length === 1 ? '' : 's'} to a list on a production database. - - ), - confirmButtonText: 'Add elements', + title: t('browser.list.add.confirmTitle'), + actionDescription: t('browser.list.add.confirmMessage', { + count: elements.length, + }), + confirmButtonText: t('browser.list.add.confirmButton'), commandId: BrowserConfirmationCommandId.AddListElements, disableConfirmationInput: true, onConfirm: submitData, @@ -177,7 +179,7 @@ const AddListElements = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-members-btn" > - Cancel + {t('browser.list.add.cancel')}
@@ -187,7 +189,7 @@ const AddListElements = (props: Props) => { onClick={handleSubmit} data-testid="save-elements-btn" > - Save + {t('browser.list.add.save')}
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/list-details-table/ListDetailsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/list-details-table/ListDetailsTable.tsx index 6144448d43..2dab2c1b54 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/list-details-table/ListDetailsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/list-details-table/ListDetailsTable.tsx @@ -34,12 +34,8 @@ import { KeyTypes, OVER_RENDER_BUFFER_COUNT, TableCellAlignment, - TEXT_INVALID_VALUE, - TEXT_DISABLED_FORMATTER_EDITING, - TEXT_UNPRINTABLE_CHARACTERS, - TEXT_DISABLED_COMPRESSED_VALUE, - TEXT_FAILED_CONVENT_FORMATTER, - TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA, + getTextInvalidValue, + getTextUnprintableCharacters, } from 'uiSrc/constants' import { bufferToString, @@ -72,6 +68,7 @@ import { FormattedValue, } from 'uiSrc/pages/browser/modules/key-details/shared' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { SetListElementDto, SetListElementResponse } from 'apiClient' import styles from './styles.module.scss' @@ -89,6 +86,7 @@ const cellCache = new CellMeasurerCache({ interface IListElement extends SetListElementResponse {} const ListDetailsTable = () => { + const { t } = useTranslation() const { loading } = useAppSelector(listSelector) const { loading: updateLoading } = useAppSelector( updateListValueStateSelector, @@ -245,13 +243,13 @@ const ListDetailsTable = () => { const columns: ITableColumn[] = [ { id: 'index', - label: 'Index', + label: t('browser.list.column.index'), minWidth: 120, relativeWidth: listSizes?.index || 30, truncateText: true, isSearchable: true, isResizable: true, - prependSearchName: 'Index:', + prependSearchName: t('browser.list.searchIndexPrefix'), initialSearchValue: '', searchValidation: validateListIndex, className: 'value-table-separate-border', @@ -268,7 +266,7 @@ const ListDetailsTable = () => { data-testid={`list-index-value-${index}`} > { }, { id: 'element', - label: 'Element', + label: t('browser.list.column.element'), minWidth: 150, truncateText: true, alignment: TableCellAlignment.Left, @@ -316,10 +314,10 @@ const ListDetailsTable = () => { viewFormatProp, ) const editTooltipContent = isCompressed - ? TEXT_DISABLED_COMPRESSED_VALUE + ? t('browser.keyDetails.compressedValueDisabled') : isTruncatedValue - ? TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA - : TEXT_DISABLED_FORMATTER_EDITING + ? t('browser.keyDetails.truncatedActionDisabled') + : t('browser.keyDetails.formatterEditingDisabled') const serializedValue = isEditing ? bufferToSerializedFormat(viewFormat, elementItem, 4) : '' @@ -331,10 +329,10 @@ const ListDetailsTable = () => { isDisabled={disabled} isEditing={isEditing} isEditDisabled={!isEditable || updateLoading} - disabledTooltipText={TEXT_UNPRINTABLE_CHARACTERS} + disabledTooltipText={getTextUnprintableCharacters(t)} onDecline={() => handleEditElement(index, false)} onApply={(value) => handleApplyEditElement(index, value)} - approveText={TEXT_INVALID_VALUE} + approveText={getTextInvalidValue(t)} approveByValidation={(value) => formattingBuffer( stringToSerializedBufferFormat(viewFormat, value), @@ -353,8 +351,10 @@ const ListDetailsTable = () => { expanded={expanded} title={ isValid - ? 'Element' - : TEXT_FAILED_CONVENT_FORMATTER(viewFormatProp) + ? t('browser.list.column.element') + : t('browser.keyDetails.failedConvertFormatter', { + format: viewFormatProp, + }) } tooltipContent={tooltipContent} /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/remove-list-elements/RemoveListElements.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/remove-list-elements/RemoveListElements.tsx index a43c7fdcd8..51d099e544 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/remove-list-elements/RemoveListElements.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/remove-list-elements/RemoveListElements.tsx @@ -28,7 +28,7 @@ import { connectedInstanceSelector, } from 'uiSrc/slices/instances/instances' -import { AddListFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { getAddListFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { Col, FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout/spacer' import { @@ -48,6 +48,7 @@ import { ListElementDestination, } from 'apiClient' import { useDatabaseEnvironment } from 'uiSrc/components/hooks/useDatabaseEnvironment' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { HEAD_DESTINATION, @@ -63,19 +64,21 @@ export interface Props { onRemoveKey: () => void } -const optionsDestinations = [ - { - value: TAIL_DESTINATION, - label: 'Remove from tail', - }, - { - value: HEAD_DESTINATION, - label: 'Remove from head', - }, -] - const RemoveListElements = (props: Props) => { const { closePanel, onRemoveKey } = props + const { t } = useTranslation() + const config = getAddListFormConfig(t) + + const optionsDestinations = [ + { + value: TAIL_DESTINATION, + label: t('browser.list.remove.fromTail'), + }, + { + value: HEAD_DESTINATION, + label: t('browser.list.remove.fromHead'), + }, + ] const [count, setCount] = useState('') const [destination, setDestination] = @@ -190,18 +193,34 @@ const RemoveListElements = (props: Props) => { disabled={!isFormValid} data-testid="remove-elements-btn" > - Remove + {t('browser.list.remove.button')} } >

- {count} Element(s) + }} + />

- will be removed from the {destination.toLowerCase()} of{' '} - {formatNameShort(bufferToString(selectedKey))} + }} + /> {(!length || length <= +count) && (
@@ -209,9 +228,7 @@ const RemoveListElements = (props: Props) => { type="ToastDangerIcon" style={{ marginRight: '1rem', marginTop: '4px' }} /> - - If you remove all Elements, the whole Key will be deleted. - + {t('browser.list.remove.deleteWarning')}
)}
@@ -223,7 +240,7 @@ const RemoveListElements = (props: Props) => { icon={DeleteIcon} data-testid="remove-submit" > - Remove + {t('browser.list.remove.button')}
@@ -296,7 +313,7 @@ const RemoveListElements = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-elements-btn" > - Cancel + {t('browser.list.remove.cancel')}
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/modules-type-details/ModulesTypeDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/modules-type-details/ModulesTypeDetails.tsx index 547a5c77f2..17d9e7d6da 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/modules-type-details/ModulesTypeDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/modules-type-details/ModulesTypeDetails.tsx @@ -6,6 +6,7 @@ import { Text } from 'uiSrc/components/base/text' import { Pages } from 'uiSrc/constants' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { Title } from 'uiSrc/components/base/text/Title' +import { Trans, useTranslation } from 'uiSrc/i18n' import TextDetailsWrapper from '../text-details-wrapper/TextDetailsWrapper' import styles from './styles.module.scss' @@ -18,6 +19,7 @@ const ModulesTypeDetails = ({ moduleName = 'unsupported', onClose, }: ModulesTypeDetailsProps) => { + const { t } = useTranslation() const history = useHistory() const { id: connectedInstanceId = '' } = useAppSelector( connectedInstanceSelector, @@ -30,21 +32,28 @@ const ModulesTypeDetails = ({ return ( - {`This is a ${moduleName} key.`} + + {t('browser.keyDetails.modulesType.title', { moduleName })} + - {'Use Redis commands in the '} - ({})} - role="link" - rel="noreferrer" - > - Workbench - - {' tool to view the value.'} + ({})} + role="link" + rel="noreferrer" + > + {''} + + ), + }} + /> ) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/no-key-selected/NoKeySelected.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/no-key-selected/NoKeySelected.tsx index 517fd7faa2..46c50e9e4b 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/no-key-selected/NoKeySelected.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/no-key-selected/NoKeySelected.tsx @@ -9,6 +9,7 @@ import { CancelSlimIcon } from 'uiSrc/components/base/icons' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -22,6 +23,7 @@ export interface Props { export const NoKeySelected = (props: Props) => { const { keyProp, totalKeys, onClosePanel, error, keysLastRefreshTime } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const handleClosePanel = () => { @@ -34,8 +36,7 @@ export const NoKeySelected = (props: Props) => { {totalKeys > 0 ? ( - Select the key from the list on the left to see the details of the - key. + {t('browser.keyDetails.noKeySelected.message')} ) : ( @@ -47,13 +48,13 @@ export const NoKeySelected = (props: Props) => { return ( <> void } -const AddItemFieldAction = ({ leftPadding, type, onClickSetKVPair }: Props) => ( -
- {getBrackets(type, 'end')} - -
-) +const AddItemFieldAction = ({ leftPadding, type, onClickSetKVPair }: Props) => { + const { t } = useTranslation() + return ( +
+ {getBrackets(type, 'end')} + +
+ ) +} export default AddItemFieldAction diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.spec.tsx index 8e52e94f76..75f4f5a27d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.spec.tsx @@ -4,6 +4,7 @@ import { fireEvent, waitFor } from '@testing-library/react' import { useAppSelector } from 'uiSrc/slices/hooks' import { render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import AddItem, { Props } from './AddItem' import { JSONErrors } from '../../constants' @@ -40,7 +41,7 @@ describe('AddItem', () => { fireEvent.click(screen.getByTestId('apply-btn')) expect(screen.getByTestId('edit-json-error')).toHaveTextContent( - JSONErrors.keyCorrectSyntax, + i18n.t(JSONErrors.keyCorrectSyntax), ) }) @@ -55,7 +56,7 @@ describe('AddItem', () => { fireEvent.click(screen.getByTestId('apply-btn')) expect(screen.getByTestId('edit-json-error')).toHaveTextContent( - JSONErrors.valueJSONFormat, + i18n.t(JSONErrors.valueJSONFormat), ) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx index b6f2f66cd4..840c8b23a7 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx @@ -18,6 +18,7 @@ import { TextInput } from 'uiSrc/components/base/inputs' import ConfirmOverwrite from './ConfirmOverwrite' import { isValidJSON, isValidKey, parseJsonData, wrapPath } from '../../utils' import { JSONErrors } from '../../constants' +import { useTranslation } from 'uiSrc/i18n' import styles from '../../styles.module.scss' @@ -36,6 +37,7 @@ export interface Props { const AddItem = (props: Props) => { const { isPair, leftPadding = 0, onCancel, onSubmit, parentPath } = props + const { t } = useTranslation() const [isConfirmationVisible, setIsConfirmationVisible] = useState(false) @@ -61,12 +63,12 @@ const AddItem = (props: Props) => { e.preventDefault() if (isPair && !isValidKey(key)) { - setError(JSONErrors.keyCorrectSyntax) + setError(t(JSONErrors.keyCorrectSyntax)) return } if (!isValidJSON(value)) { - setError(JSONErrors.valueJSONFormat) + setError(t(JSONErrors.valueJSONFormat)) return } @@ -108,7 +110,7 @@ const AddItem = (props: Props) => { name="newRootKey" value={key} error={error || undefined} - placeholder="Enter JSON key" + placeholder={t('browser.rejson.jsonKeyPlaceholder')} onChange={setKey} data-testid="json-key" /> @@ -118,7 +120,7 @@ const AddItem = (props: Props) => { setValue(value)} data-testid="json-value" @@ -134,7 +136,7 @@ const AddItem = (props: Props) => { size="M" icon={CancelSlimIcon} color="primary" - aria-label="Cancel editing" + aria-label={t('browser.rejson.cancelAddAria')} className={styles.declineBtn} onClick={() => onCancel?.()} /> @@ -144,7 +146,7 @@ const AddItem = (props: Props) => { icon={CheckThinIcon} color="primary" type="submit" - aria-label="Apply" + aria-label={t('browser.rejson.applyAria')} className={styles.applyBtn} data-testid="apply-btn" /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/ConfirmOverwrite.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/ConfirmOverwrite.tsx index ed45950d93..1d859fc853 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/ConfirmOverwrite.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/ConfirmOverwrite.tsx @@ -9,6 +9,7 @@ import { Text } from 'uiSrc/components/base/text' import { RiPopover } from 'uiSrc/components/base' import { Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout' +import { useTranslation } from 'uiSrc/i18n' interface ConfirmOverwriteProps { isOpen: boolean @@ -22,43 +23,43 @@ const ConfirmOverwrite = ({ onCancel, onConfirm, children, -}: ConfirmOverwriteProps) => ( - - - Duplicate JSON key detected - - - You already have the same JSON key. If you proceed, a value of the - existing JSON key will be overwritten. - - - - - Cancel - +}: ConfirmOverwriteProps) => { + const { t } = useTranslation() + return ( + + + {t('browser.rejson.overwrite.title')} + + {t('browser.rejson.overwrite.message')} + + + + {t('browser.rejson.overwrite.cancel')} + - - Overwrite - - - -) + + {t('browser.rejson.overwrite.confirm')} + + + + ) +} export default ConfirmOverwrite diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.spec.tsx index 46f669b8ca..90f19226e9 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.spec.tsx @@ -1,6 +1,7 @@ import React from 'react' import { instance, mock } from 'ts-mockito' import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { JSONErrors } from 'uiSrc/pages/browser/modules/key-details/components/rejson-details/constants' import EditEntireItemAction, { Props } from './EditEntireItemAction' @@ -47,7 +48,7 @@ describe('EditEntireItemAction', () => { fireEvent.submit(screen.getByTestId('json-entire-form')) expect(screen.getByTestId('edit-json-error')).toHaveTextContent( - JSONErrors.valueJSONFormat, + i18n.t(JSONErrors.valueJSONFormat), ) expect(handleUpdateValueFormSubmit).not.toHaveBeenCalled() }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx index a00c02b974..7c912da81b 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx @@ -14,6 +14,7 @@ import { IconButton } from 'uiSrc/components/base/forms/buttons' import { TextArea } from 'uiSrc/components/base/inputs' import { isValidJSON } from '../../utils' import { JSONErrors } from '../../constants' +import { useTranslation } from 'uiSrc/i18n' import styles from '../../styles.module.scss' import ConfirmOverwrite from '../add-item/ConfirmOverwrite' @@ -26,6 +27,7 @@ export interface Props { const EditEntireItemAction = (props: Props) => { const { initialValue, onCancel, onSubmit } = props + const { t } = useTranslation() const [value, setValue] = useState(initialValue) const [error, setError] = useState>(null) const [isConfirmationVisible, setIsConfirmationVisible] = @@ -42,7 +44,7 @@ const EditEntireItemAction = (props: Props) => { e.preventDefault() if (!isValidJSON(value)) { - setError(JSONErrors.valueJSONFormat) + setError(t(JSONErrors.valueJSONFormat)) return } @@ -78,7 +80,7 @@ const EditEntireItemAction = (props: Props) => { valid={!error} className={styles.fullWidthTextArea} value={value} - placeholder="Enter JSON value" + placeholder={t('browser.rejson.jsonValuePlaceholder')} onChange={setValue} data-testid="json-value" /> @@ -91,7 +93,7 @@ const EditEntireItemAction = (props: Props) => {
{ icon={CheckThinIcon} color="primary" type="submit" - aria-label="Apply" + aria-label={t('browser.rejson.applyAria')} className={styles.applyBtn} data-testid="apply-edit-btn" /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-item-field-action/EditItemFieldAction.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-item-field-action/EditItemFieldAction.tsx index c70c82de35..87f837ed58 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-item-field-action/EditItemFieldAction.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-item-field-action/EditItemFieldAction.tsx @@ -8,6 +8,7 @@ import { } from 'uiSrc/utils' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { IconButton } from 'uiSrc/components/base/forms/buttons' +import { useTranslation } from 'uiSrc/i18n' import styles from '../../styles.module.scss' export interface Props { @@ -27,6 +28,7 @@ const EditItemFieldAction = ({ onClickEditEntireItem, 'data-testid': testId = 'edit-json-field', }: Props) => { + const { t } = useTranslation() const [deleting, setDeleting] = useState('') return ( @@ -35,7 +37,7 @@ const EditItemFieldAction = ({ icon={EditIcon} className={styles.jsonButtonStyle} onClick={onClickEditEntireItem} - aria-label="Edit field" + aria-label={t('browser.rejson.editFieldAria')} size="S" data-testid={testId} /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/json-value-actions/JsonValueActions.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/json-value-actions/JsonValueActions.tsx index e9c8da988b..5a9acf9946 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/json-value-actions/JsonValueActions.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/json-value-actions/JsonValueActions.tsx @@ -15,6 +15,7 @@ import { CopyButton } from 'uiSrc/components/copy-button' import { RiTooltip } from 'uiSrc/components' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { DownloadIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import { IJSONData } from '../../interfaces' import { isScalar, jsonToReadableString } from '../../utils' @@ -26,6 +27,7 @@ export interface Props { } const JsonValueActions = ({ data, selectedKey, isDownloaded }: Props) => { + const { t } = useTranslation() const { viewType } = useAppSelector(keysSelector) const { id: instanceId } = useAppSelector(connectedInstanceSelector) const dispatch = useAppDispatch() @@ -62,15 +64,15 @@ const JsonValueActions = ({ data, selectedKey, isDownloaded }: Props) => { return canCopy ? ( ) : ( - + diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/constants.ts index 309a4818c5..cd4cbd0ae7 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/constants.ts @@ -1,6 +1,11 @@ -export const JSONErrors = { - keyCorrectSyntax: 'Key should have correct syntax.', - valueJSONFormat: 'Value should have JSON format.', +import { ParseKeys } from 'i18next' + +export const JSONErrors: Record< + 'keyCorrectSyntax' | 'valueJSONFormat', + ParseKeys +> = { + keyCorrectSyntax: 'browser.rejson.error.keyCorrectSyntax', + valueJSONFormat: 'browser.rejson.error.valueJSONFormat', } export const MIN_LEFT_PADDING_NESTING = 1 diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/monaco-editor/MonacoEditor.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/monaco-editor/MonacoEditor.tsx index 601729486e..f94045fc1c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/monaco-editor/MonacoEditor.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/monaco-editor/MonacoEditor.tsx @@ -21,6 +21,7 @@ import { import { Row } from 'uiSrc/components/base/layout/flex' import { Spacer } from 'uiSrc/components/base/layout' import { CopyButton } from 'uiSrc/components/copy-button' +import { useTranslation } from 'uiSrc/i18n' import { BaseProps } from '../interfaces' import { useChangeEditorType } from '../../change-editor-type-button' import { jsonToReadableString } from '../utils' @@ -32,6 +33,7 @@ const ROOT_PATH = '$' const MonacoEditor = (props: BaseProps) => { const { data, length, selectedKey } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const editorRef = useRef(null) @@ -86,7 +88,7 @@ const MonacoEditor = (props: BaseProps) => { @@ -97,7 +99,7 @@ const MonacoEditor = (props: BaseProps) => { onClick={switchEditorType} data-testid="json-data-cancel-btn" > - Close + {t('browser.rejson.close')} { onClick={submitUpdate} data-testid="json-data-update-btn" > - Overwrite Data + {t('browser.rejson.overwriteData')}
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-details/RejsonDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-details/RejsonDetails.tsx index 68b283747c..1bc2d9b02e 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-details/RejsonDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-details/RejsonDetails.tsx @@ -13,6 +13,7 @@ import { import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' import { IconButton } from 'uiSrc/components/base/forms/buttons' +import { useTranslation } from 'uiSrc/i18n' import { getBrackets, isRealArray, @@ -42,6 +43,7 @@ const RejsonDetails = (props: BaseProps) => { const [addRootKVPair, setAddRootKVPair] = useState(false) + const { t } = useTranslation() const dispatch = useAppDispatch() const handleFetchVisualisationResults = ( @@ -154,7 +156,7 @@ const RejsonDetails = (props: BaseProps) => { size="S" className={styles.buttonStyle} onClick={onClickSetRootKVPair} - aria-label="Add field" + aria-label={t('browser.rejson.addFieldAria')} data-testid={isObject ? 'add-object-btn' : 'add-array-btn'} /> )} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-scalar/RejsonScalar.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-scalar/RejsonScalar.tsx index 5a813426ae..37208cb0f6 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-scalar/RejsonScalar.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-scalar/RejsonScalar.tsx @@ -17,6 +17,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { JSONScalarProps } from '../interfaces' import { @@ -50,6 +51,7 @@ const RejsonScalar = (props: JSONScalarProps) => { const [deleting, setDeleting] = useState('') const dispatch = useAppDispatch() + const { t } = useTranslation() const { requestConfirmation } = useProductionWriteConfirmation() useEffect(() => { @@ -63,15 +65,14 @@ const RejsonScalar = (props: JSONScalarProps) => { const onApplyValue = (value: string) => { if (!isValidJSON(value)) { - setError(JSONErrors.valueJSONFormat) + setError(t(JSONErrors.valueJSONFormat)) return } requestConfirmation({ - title: 'Edit value on production database?', - actionDescription: - 'You are about to modify a JSON value on a production database.', - confirmButtonText: 'Save', + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t('browser.rejson.editConfirmMessage'), + confirmButtonText: t('browser.keyDetails.editable.confirmButton'), commandId: BrowserConfirmationCommandId.EditRejsonValue, disableConfirmationInput: true, onConfirm: () => { @@ -124,7 +125,7 @@ const RejsonScalar = (props: JSONScalarProps) => { }} initialValue={changedValue} controlsPosition="right" - placeholder="Enter JSON value" + placeholder={t('browser.rejson.jsonValuePlaceholder')} fieldName="stringValue" expandable isInvalid={!!error} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/SetDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/SetDetails.tsx index 08f78df7e0..a1c1ab497e 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/SetDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/SetDetails.tsx @@ -13,6 +13,7 @@ import { AddSetMembers } from './add-set-members' import { AddItemsAction } from '../key-details-actions' import { KeyDetailsSubheader } from '../key-details-subheader/KeyDetailsSubheader' import { AddKeysContainer } from 'uiSrc/pages/browser/modules/key-details/components/common/AddKeysContainer.styled' +import { useTranslation } from 'uiSrc/i18n' export interface Props extends KeyDetailsHeaderProps { onRemoveKey: () => void @@ -23,6 +24,7 @@ export interface Props extends KeyDetailsHeaderProps { const SetDetails = (props: Props) => { const keyType = KeyTypes.Set const { onRemoveKey, onOpenAddItemPanel, onCloseAddItemPanel } = props + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) @@ -42,7 +44,7 @@ const SetDetails = (props: Props) => { const Actions = ({ width }: { width: number }) => ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx index 3164387165..f41d711135 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx @@ -16,7 +16,7 @@ import { } from 'uiSrc/telemetry' import { stringToBuffer } from 'uiSrc/utils' -import { AddZsetFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { getAddSetFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { INITIAL_SET_MEMBER_STATE, ISetMemberState, @@ -34,6 +34,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { EntryContent } from '../../common/AddKeysContainer.styled' @@ -43,6 +44,8 @@ export interface Props { const AddSetMembers = (props: Props) => { const { closePanel } = props + const { t } = useTranslation() + const config = getAddSetFormConfig(t) const dispatch = useAppDispatch() const [members, setMembers] = useState([ { ...INITIAL_SET_MEMBER_STATE }, @@ -140,14 +143,11 @@ const AddSetMembers = (props: Props) => { const handleSubmit = () => { requestConfirmation({ - title: 'Add members on production database?', - actionDescription: ( - <> - You are about to add {members.length} member - {members.length === 1 ? '' : 's'} to a set on a production database. - - ), - confirmButtonText: 'Add members', + title: t('browser.set.add.confirmTitle'), + actionDescription: t('browser.set.add.confirmMessage', { + count: members.length, + }), + confirmButtonText: t('browser.set.add.confirmButton'), commandId: BrowserConfirmationCommandId.AddSetMembers, disableConfirmationInput: true, onConfirm: submitData, @@ -196,7 +196,7 @@ const AddSetMembers = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-members-btn" > - Cancel + {t('browser.set.add.cancel')}
@@ -206,7 +206,7 @@ const AddSetMembers = (props: Props) => { onClick={handleSubmit} data-testid="save-members-btn" > - Save + {t('browser.set.add.save')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/set-details-table/SetDetailsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/set-details-table/SetDetailsTable.tsx index a4c7517f99..185a04c6bd 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/set-details-table/SetDetailsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/set-details-table/SetDetailsTable.tsx @@ -13,11 +13,7 @@ import { createTooltipContent, formattingBuffer, } from 'uiSrc/utils' -import { - KeyTypes, - OVER_RENDER_BUFFER_COUNT, - TEXT_FAILED_CONVENT_FORMATTER, -} from 'uiSrc/constants' +import { KeyTypes, OVER_RENDER_BUFFER_COUNT } from 'uiSrc/constants' import { sendEventTelemetry, TelemetryEvent, @@ -49,6 +45,7 @@ import { } from 'uiSrc/components/virtual-table/interfaces' import { decompressingBuffer } from 'uiSrc/utils/decompressors' import { FormattedValue } from 'uiSrc/pages/browser/modules/key-details/shared' +import { useTranslation } from 'uiSrc/i18n' import { GetSetMembersResponse } from 'apiClient' import styles from './styles.module.scss' @@ -69,6 +66,7 @@ export interface Props { const SetDetailsTable = (props: Props) => { const { onRemoveKey } = props + const { t } = useTranslation() const { loading } = useAppSelector(setSelector) const { @@ -215,7 +213,7 @@ const SetDetailsTable = (props: Props) => { const columns: ITableColumn[] = [ { id: 'name', - label: 'Member', + label: t('browser.set.column.member'), isSearchable: true, staySearchAlwaysOpen: true, initialSearchValue: '', @@ -256,8 +254,10 @@ const SetDetailsTable = (props: Props) => { expanded={expanded} title={ isValid - ? 'Member' - : TEXT_FAILED_CONVENT_FORMATTER(viewFormatProp) + ? t('browser.set.column.member') + : t('browser.keyDetails.failedConvertFormatter', { + format: viewFormatProp, + }) } tooltipContent={tooltipContent} position="left" diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/StreamDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/StreamDetails.tsx index 11c2c5a1b0..9c0d5cc6f6 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/StreamDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/StreamDetails.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useCallback, useRef, useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' import { selectedKeySelector } from 'uiSrc/slices/browser/keys' @@ -20,6 +20,7 @@ import AddStreamGroup from './add-stream-group' import { StreamItemsAction } from '../key-details-actions' import { KeyDetailsSubheader } from '../key-details-subheader/KeyDetailsSubheader' import { AddKeysContainer } from '../common/AddKeysContainer.styled' +import { useTranslation } from 'uiSrc/i18n' export interface Props extends KeyDetailsHeaderProps { onRemoveKey: () => void @@ -30,6 +31,7 @@ export interface Props extends KeyDetailsHeaderProps { const StreamDetails = (props: Props) => { const keyType = KeyTypes.Stream const { onOpenAddItemPanel, onCloseAddItemPanel } = props + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) const { viewType: streamViewType } = useAppSelector(streamSelector) @@ -55,12 +57,21 @@ const StreamDetails = (props: Props) => { } } - const Actions = ({ width }: { width: number }) => ( - + const latest = { streamViewType, openAddItemPanel, t } + const latestRef = useRef(latest) + latestRef.current = latest + + const Actions = useCallback( + ({ width }: { width: number }) => ( + + ), + [], ) return ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx index b3c70f6ab4..f9d906f1fc 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx @@ -31,6 +31,7 @@ import { } from 'uiSrc/components/production-write-confirmation' import StreamEntryFields from './StreamEntryFields/StreamEntryFields' +import { useTranslation } from 'uiSrc/i18n' import { Panel } from 'uiSrc/components/panel' import { EntryContent } from '../../common/AddKeysContainer.styled' @@ -55,6 +56,7 @@ const AddStreamEntries = (props: Props) => { ]) const [isFormValid, setIsFormValid] = useState(false) + const { t } = useTranslation() const dispatch = useAppDispatch() const { requestConfirmation } = useProductionWriteConfirmation() @@ -140,10 +142,9 @@ const AddStreamEntries = (props: Props) => { const handleSubmit = () => { if (!isFormValid) return requestConfirmation({ - title: 'Add entry on production database?', - actionDescription: - 'You are about to add a new entry to a stream on a production database.', - confirmButtonText: 'Add entry', + title: t('browser.stream.addEntry.confirmTitle'), + actionDescription: t('browser.stream.addEntry.confirmMessage'), + confirmButtonText: t('browser.stream.addEntry.confirmButton'), commandId: BrowserConfirmationCommandId.AddStreamEntry, disableConfirmationInput: true, onConfirm: submitData, @@ -166,7 +167,7 @@ const AddStreamEntries = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-members-btn" > - Cancel + {t('browser.stream.addEntry.cancel')} { disabled={!isFormValid} data-testid="save-elements-btn" > - Save + {t('browser.stream.addEntry.save')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx index 439a839413..0855754d2d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx @@ -10,6 +10,7 @@ import { FormField } from 'uiSrc/components/base/forms/FormField' import { Text } from 'uiSrc/components/base/text' import { TextInput } from 'uiSrc/components/base/inputs' import { streamIDTooltipText } from 'uiSrc/constants/texts' +import { useTranslation } from 'uiSrc/i18n' import { EntryIdContainer, FieldsWrapper } from '../AddStreamEntries.styles' import { InlineRow } from './StreamEntryFields.styles' import { @@ -30,6 +31,7 @@ const MIN_ENTRY_ID_VALUE = '0-1' const StreamEntryFields = (props: Props) => { const { entryID, setEntryID, entryIdError, fields, setFields } = props + const { t } = useTranslation() const [isEntryIdFocused, setIsEntryIdFocused] = React.useState(false) const prevCountFields = useRef(0) @@ -124,14 +126,14 @@ const StreamEntryFields = (props: Props) => { anchorClassName="inputAppendIcon" className={styles.entryIdTooltip} position="left" - title="Enter Valid ID or *" + title={t('browser.stream.entryFields.idTooltipTitle')} content={streamIDTooltipText} >
{!showEntryError && ( - Timestamp - Sequence Number or * + {t('browser.stream.entryFields.idFormatHint')} )} {showEntryError && ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-group/AddStreamGroup.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-group/AddStreamGroup.tsx index de27603a4a..dd256eeaa5 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-group/AddStreamGroup.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-group/AddStreamGroup.tsx @@ -23,6 +23,7 @@ import { CreateConsumerGroupsDto } from 'apiClient' import { Panel } from 'uiSrc/components/panel' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { StreamGroupContent, TimeStampInfoIcon, @@ -35,6 +36,7 @@ export interface Props { const AddStreamGroup = (props: Props) => { const { closePanel } = props + const { t } = useTranslation() const { name: keyName = '' } = useAppSelector(selectedKeyDataSelector) ?? { name: undefined, } @@ -56,11 +58,11 @@ const AddStreamGroup = (props: Props) => { useEffect(() => { if (!consumerGroupIdRegex.test(id)) { - setIdError('ID format is not correct') + setIdError(t('browser.stream.group.idFormatError')) return } setIdError('') - }, [id]) + }, [id, t]) const onSuccessAdded = () => { closePanel() @@ -101,7 +103,9 @@ const AddStreamGroup = (props: Props) => { setGroupName(value)} autoComplete="off" @@ -116,7 +120,7 @@ const AddStreamGroup = (props: Props) => { @@ -127,7 +131,7 @@ const AddStreamGroup = (props: Props) => { color="primary" data-testid="id-help-text" > - Timestamp - Sequence Number or $ + {t('browser.stream.group.idFormatHint')} )} {showIdError && ( @@ -141,7 +145,7 @@ const AddStreamGroup = (props: Props) => { setId(validateConsumerGroupId(value)) @@ -163,14 +167,14 @@ const AddStreamGroup = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-stream-groups-btn" > - Cancel + {t('browser.stream.addGroup.cancel')} - Save + {t('browser.stream.addGroup.save')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersView/ConsumersView.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersView/ConsumersView.tsx index 8413a840c8..43af47d620 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersView/ConsumersView.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersView/ConsumersView.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' +import { useTranslation } from 'uiSrc/i18n' import cx from 'classnames' import { orderBy } from 'lodash' @@ -29,8 +30,9 @@ const ConsumersView = (props: Props) => { columns = [], onClosePopover, onSelectConsumer, - noItemsMessageString = 'Your Consumer Group has no Consumers available.', + noItemsMessageString, } = props + const { t } = useTranslation() const { loading } = useAppSelector(streamGroupsSelector) const { name: key = '' } = useAppSelector(selectedKeyDataSelector) ?? {} @@ -79,7 +81,9 @@ const ConsumersView = (props: Props) => { items={consumers} onWheel={onClosePopover} onChangeSorting={onChangeSorting} - noItemsMessage={noItemsMessageString} + noItemsMessage={ + noItemsMessageString ?? t('browser.stream.consumers.empty') + } sortedColumn={ consumers?.length ? { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersViewWrapper.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersViewWrapper.tsx index a4a9e3eb96..57bf494f39 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersViewWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersViewWrapper.tsx @@ -27,6 +27,7 @@ import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { ConsumerDto } from 'apiClient' import ConsumersView from './ConsumersView' @@ -38,6 +39,7 @@ const actionsWidth = 50 export interface Props {} const ConsumersViewWrapper = (props: Props) => { + const { t } = useTranslation() const { name: key = '' } = useAppSelector(selectedKeyDataSelector) ?? { name: '', } @@ -115,7 +117,7 @@ const ConsumersViewWrapper = (props: Props) => { const columns: ITableColumn[] = [ { id: 'name', - label: 'Consumer Name', + label: t('browser.stream.consumers.nameColumn'), minWidth: 200, truncateText: true, isSortable: true, @@ -148,7 +150,7 @@ const ConsumersViewWrapper = (props: Props) => { }, { id: 'pending', - label: 'Pending', + label: t('browser.stream.consumers.pendingColumn'), minWidth: 106, maxWidth: 106, absoluteWidth: 106, @@ -160,7 +162,7 @@ const ConsumersViewWrapper = (props: Props) => { }, { id: 'idle', - label: 'Idle Time, msec', + label: t('browser.stream.consumers.idleColumn'), minWidth: 140, maxWidth: 140, absoluteWidth: 140, @@ -188,10 +190,11 @@ const ConsumersViewWrapper = (props: Props) => { - will be removed from Consumer Group{' '} - {selectedGroupNameString} - + }} + /> } item={viewName} suffix={suffix} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsView/GroupsView.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsView/GroupsView.tsx index 9988a83ac1..a6ed0a33b6 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsView/GroupsView.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsView/GroupsView.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useEffect, useState } from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' +import { useTranslation } from 'uiSrc/i18n' import cx from 'classnames' import { orderBy } from 'lodash' @@ -14,7 +15,6 @@ import styles from './styles.module.scss' const headerHeight = 60 const rowHeight = 54 -const noItemsMessageString = 'Your Key has no Consumer Groups available.' export interface IConsumerGroup extends ConsumerGroupDto { editing: boolean @@ -29,6 +29,7 @@ export interface Props { const ConsumerGroups = (props: Props) => { const { data = [], columns = [], onClosePopover, onSelectGroup } = props + const { t } = useTranslation() const { loading } = useAppSelector(streamGroupsSelector) const { name: key = '' } = useAppSelector(selectedKeyDataSelector) ?? {} @@ -85,7 +86,7 @@ const ConsumerGroups = (props: Props) => { tableWidth={columns.reduce((a, b) => a + (b.minWidth ?? 0), 0)} onWheel={onClosePopover} onChangeSorting={onChangeSorting} - noItemsMessage={noItemsMessageString} + noItemsMessage={t('browser.stream.groups.empty')} sortedColumn={ groups?.length ? { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsViewWrapper.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsViewWrapper.tsx index 7e92998794..c66ba232bd 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsViewWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsViewWrapper.tsx @@ -35,6 +35,7 @@ import EditablePopover from 'uiSrc/pages/browser/modules/key-details/shared/edit import { FormatedDate, RiTooltip } from 'uiSrc/components' import { Text } from 'uiSrc/components/base/text' +import { Trans, useTranslation, escapeTrans } from 'uiSrc/i18n' import { FormField } from 'uiSrc/components/base/forms/FormField' import { RiIcon } from 'uiSrc/components/base/icons/RiIcon' import { ComposedInput } from 'uiSrc/components/base/inputs' @@ -59,6 +60,7 @@ const actionsWidth = 48 export interface Props {} const GroupsViewWrapper = (props: Props) => { + const { t } = useTranslation() const { lastRefreshTime, data: loadedGroups = [], @@ -92,11 +94,11 @@ const GroupsViewWrapper = (props: Props) => { useEffect(() => { if (!consumerGroupIdRegex.test(editValue)) { - setIdError('ID format is not correct') + setIdError(t('browser.stream.group.idFormatError')) return } setIdError('') - }, [editValue]) + }, [editValue, t]) const formatItem = useCallback( (item: ConsumerGroupDto): IConsumerGroup => ({ @@ -210,7 +212,7 @@ const GroupsViewWrapper = (props: Props) => { const columns: ITableColumn[] = [ { id: 'name', - label: 'Group Name', + label: t('browser.stream.groups.nameColumn'), truncateText: true, isSortable: true, minWidth: 100, @@ -243,7 +245,7 @@ const GroupsViewWrapper = (props: Props) => { }, { id: 'consumers', - label: 'Consumers', + label: t('browser.stream.groups.consumersColumn'), minWidth: 120, maxWidth: 120, absoluteWidth: 120, @@ -257,7 +259,7 @@ const GroupsViewWrapper = (props: Props) => { }, { id: 'pending', - label: 'Pending', + label: t('browser.stream.groups.pendingColumn'), minWidth: 95, maxWidth: 95, absoluteWidth: 95, @@ -290,7 +292,9 @@ const GroupsViewWrapper = (props: Props) => { > {!!pending && ( { }, { id: 'lastDeliveredId', - label: 'Last Delivered ID', + label: t('browser.stream.groups.lastDeliveredColumn'), minWidth: 200, maxWidth: 200, absoluteWidth: 200, @@ -371,7 +375,7 @@ const GroupsViewWrapper = (props: Props) => { setEditValue(validateConsumerGroupId(value)) @@ -385,7 +389,7 @@ const GroupsViewWrapper = (props: Props) => { @@ -394,7 +398,7 @@ const GroupsViewWrapper = (props: Props) => { /> {!showIdError && ( - Timestamp - Sequence Number or $ + {t('browser.stream.group.idFormatHint')} )} {showIdError && ( @@ -422,10 +426,11 @@ const GroupsViewWrapper = (props: Props) => { - and all its consumers will be removed from{' '} - {selectedKeyString} - + }} + /> } item={viewName} suffix={suffix} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageAckPopover/MessageAckPopover.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageAckPopover/MessageAckPopover.tsx index 588d67622c..7e50490f26 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageAckPopover/MessageAckPopover.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageAckPopover/MessageAckPopover.tsx @@ -6,6 +6,7 @@ import { } from 'uiSrc/components/base/forms/buttons' import { HorizontalSpacer } from 'uiSrc/components/base/layout' import ConfirmationPopover from 'uiSrc/components/confirmation-popover' +import { useTranslation } from 'uiSrc/i18n' export interface Props { id: string @@ -23,11 +24,12 @@ const AckPopover = (props: Props) => { showPopover = () => {}, acknowledge = () => {}, } = props + const { t } = useTranslation() return ( { onClick={() => acknowledge(id)} data-testid="acknowledge-submit" > - Acknowledge + {t('browser.stream.ack.confirm')} } button={ <> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx index 1bbdeee19d..dccbd8aff5 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx @@ -27,6 +27,8 @@ import { FormField } from 'uiSrc/components/base/forms/FormField' import { NumericInput, SwitchInput } from 'uiSrc/components/base/inputs' import { RiPopover, RiTooltip } from 'uiSrc/components/base' import { RiSelect } from 'uiSrc/components/base/forms/select/RiSelect' +import { useTranslation } from 'uiSrc/i18n' +import { TFunction } from 'i18next' import { ClaimPendingEntryDto, ClaimPendingEntriesResponse, @@ -35,7 +37,7 @@ import { import styles from './styles.module.scss' -const getConsumersOptions = (consumers: ConsumerDto[]) => +const getConsumersOptions = (consumers: ConsumerDto[], t: TFunction) => consumers.map((consumer) => ({ value: consumer.name?.viewValue, inputDisplay: ( @@ -51,15 +53,21 @@ const getConsumersOptions = (consumers: ConsumerDto[]) => className={styles.pendingCount} data-testid="pending-count" > - {`pending: ${consumer.pending}`} + {t('browser.stream.claim.pendingCount', { count: consumer.pending })} ), })) -const timeOptions = [ - { value: ClaimTimeOptions.RELATIVE, label: 'Relative Time' }, - { value: ClaimTimeOptions.ABSOLUTE, label: 'Timestamp' }, +const getTimeOptions = (t: TFunction) => [ + { + value: ClaimTimeOptions.RELATIVE, + label: t('browser.stream.claim.relativeTime'), + }, + { + value: ClaimTimeOptions.ABSOLUTE, + label: t('browser.stream.claim.timestamp'), + }, ] export interface Props { @@ -84,6 +92,9 @@ const MessageClaimPopover = (props: Props) => { handleCancelClaim, } = props + const { t } = useTranslation() + const timeOptions = getTimeOptions(t) + const { data: consumers = [] } = useAppSelector(selectedGroupSelector) ?? {} const { name: currentConsumerName, pending = 0 } = useAppSelector( selectedConsumerSelector, @@ -155,7 +166,7 @@ const MessageClaimPopover = (props: Props) => { (consumer) => !isEqualBuffers(consumer.name, currentConsumerName), ) const sortedConsumers = orderBy( - getConsumersOptions(consumersWithoutCurrent), + getConsumersOptions(consumersWithoutCurrent, t), ['name.viewValue'], ['asc'], ) @@ -167,12 +178,12 @@ const MessageClaimPopover = (props: Props) => { ?.viewValue, }) } - }, [consumers, currentConsumerName]) + }, [consumers, currentConsumerName, t]) const button = ( { const buttonTooltip = ( { - + { - +
{ - +
{ - + { - + { - + ) => { formik.setFieldValue(e.target.name, !formik.values.force) @@ -318,19 +332,21 @@ const MessageClaimPopover = (props: Props) => { - Cancel + + {t('browser.stream.claim.cancel')} + formik.handleSubmit()} data-testid="btn-submit" > - Claim + {t('browser.stream.claim.confirm')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesView/MessagesView.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesView/MessagesView.tsx index 786fc30e37..dd3f2d67c3 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesView/MessagesView.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesView/MessagesView.tsx @@ -1,5 +1,6 @@ import React from 'react' import { useAppSelector } from 'uiSrc/slices/hooks' +import { useTranslation } from 'uiSrc/i18n' import cx from 'classnames' import { streamGroupsSelector } from 'uiSrc/slices/browser/stream' @@ -29,8 +30,9 @@ const MessagesView = (props: Props) => { total, onClosePopover, loadMoreItems, - noItemsMessageString = 'Your Consumer has no pending messages.', + noItemsMessageString, } = props + const { t } = useTranslation() const { loading } = useAppSelector(streamGroupsSelector) const { name: key = '' } = useAppSelector(selectedKeyDataSelector) ?? {} @@ -60,7 +62,9 @@ const MessagesView = (props: Props) => { tableWidth={columns.reduce((a, b) => a + (b.minWidth ?? 0), 0)} onWheel={onClosePopover} loadMoreItems={loadMoreItems} - noItemsMessage={noItemsMessageString} + noItemsMessage={ + noItemsMessageString ?? t('browser.stream.messages.empty') + } />
diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesViewWrapper.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesViewWrapper.tsx index e34a4eb9a6..6ba00ab4a2 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesViewWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesViewWrapper.tsx @@ -22,6 +22,7 @@ import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { isTruncatedString } from 'uiSrc/utils' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { FlexItem } from 'uiSrc/components/base/layout/flex' import { AckPendingEntriesResponse, @@ -44,6 +45,7 @@ const ackPrefix = '-ack' export interface Props {} const MessagesViewWrapper = (props: Props) => { + const { t } = useTranslation() const { lastRefreshTime, data: loadedMessages = [], @@ -116,7 +118,7 @@ const MessagesViewWrapper = (props: Props) => { const columns: ITableColumn[] = [ { id: 'id', - label: 'Entry ID', + label: t('browser.stream.column.entryId'), absoluteWidth: minColumnWidth, minWidth: minColumnWidth, className: styles.cell, @@ -148,7 +150,7 @@ const MessagesViewWrapper = (props: Props) => { }, { id: 'idle', - label: 'Last Message Delivered', + label: t('browser.stream.messages.lastDeliveredColumn'), minWidth: 256, absoluteWidth: 106, truncateText: true, @@ -171,7 +173,7 @@ const MessagesViewWrapper = (props: Props) => { }, { id: 'delivered', - label: 'Times Message Delivered', + label: t('browser.stream.messages.timesDeliveredColumn'), minWidth: 106, truncateText: true, headerClassName: cx('streamItemHeader', styles.deliveredHeaderCell), diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataView/StreamDataView.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataView/StreamDataView.tsx index 3a45352bf5..ee51a2f16b 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataView/StreamDataView.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataView/StreamDataView.tsx @@ -22,6 +22,7 @@ import { sendEventTelemetry, TelemetryEvent, } from 'uiSrc/telemetry' +import { useTranslation } from 'uiSrc/i18n' import { StreamEntryDto } from 'apiClient' import styles from './styles.module.scss' @@ -29,8 +30,6 @@ import styles from './styles.module.scss' const headerHeight = 60 const rowHeight = 60 const minColumnWidth = 190 -const noItemsMessageInEmptyStream = 'There are no Entries in the Stream.' -const noItemsMessageInRange = 'No results found.' export interface Props { data: StreamEntryDto[] @@ -46,6 +45,7 @@ const StreamDataView = (props: Props) => { onClosePopover, loadMoreItems, } = props + const { t } = useTranslation() const dispatch = useAppDispatch() const { instanceId = '' } = useParams<{ instanceId: string }>() @@ -116,8 +116,8 @@ const StreamDataView = (props: Props) => { onChangeSorting={onChangeSorting} noItemsMessage={ isNull(firstEntry) && isNull(lastEntry) - ? noItemsMessageInEmptyStream - : noItemsMessageInRange + ? t('browser.stream.data.emptyStream') + : t('browser.stream.data.noResults') } onRowToggleViewClick={handleRowToggleViewClick} maxTableWidth={columns.reduce( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataViewWrapper.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataViewWrapper.tsx index 052b865424..6d1d6f944e 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataViewWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataViewWrapper.tsx @@ -38,6 +38,7 @@ import { decompressingBuffer } from 'uiSrc/utils/decompressors' import { FormattedValue } from 'uiSrc/pages/browser/modules/key-details/shared' import { FormatedDate } from 'uiSrc/components' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import { StreamEntryDto } from 'apiClient' import StreamDataView from './StreamDataView' import styles from './StreamDataView/styles.module.scss' @@ -55,6 +56,7 @@ export interface Props { } const StreamDataViewWrapper = (props: Props) => { + const { t } = useTranslation() const { entries: loadedEntries = [], keyName: key, @@ -182,7 +184,7 @@ const StreamDataViewWrapper = (props: Props) => { const headerRow = { id: { id: 'id', - label: 'Entry ID', + label: t('browser.stream.column.entryId'), sortable: true, }, ...columnsNames, @@ -312,7 +314,7 @@ const StreamDataViewWrapper = (props: Props) => { const idColumn: ITableColumn = { id: 'id', - label: 'Entry ID', + label: t('browser.stream.column.entryId'), maxWidth: minColumnWidth, minWidth: minColumnWidth, isSortable: true, diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-tabs/StreamTabs.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-tabs/StreamTabs.tsx index c40980a5f7..e2a85341bb 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-tabs/StreamTabs.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-tabs/StreamTabs.tsx @@ -16,9 +16,11 @@ import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api' import { SortOrder } from 'uiSrc/constants' import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' import Tabs, { TabInfo } from 'uiSrc/components/base/layout/tabs' +import { useTranslation } from 'uiSrc/i18n' import { ConsumerGroupDto } from 'apiClient' const StreamTabs = () => { + const { t } = useTranslation() const { viewType } = useAppSelector(streamSelector) const { name: key } = useAppSelector(selectedKeyDataSelector) ?? { name: '' } const { nameString: selectedGroupName = '' } = @@ -56,12 +58,12 @@ const StreamTabs = () => { const baseTabs: TabInfo[] = [ { value: StreamViewType.Data, - label: 'Stream Data', + label: t('browser.stream.tabs.data'), content: null, }, { value: StreamViewType.Groups, - label: 'Consumer Groups', + label: t('browser.stream.tabs.groups'), content: null, }, ] @@ -87,7 +89,7 @@ const StreamTabs = () => { } return baseTabs - }, [viewType, selectedGroupName, selectedConsumerName]) + }, [viewType, selectedGroupName, selectedConsumerName, t]) return ( { expect(queryByTestId('edit-key-value-btn')).toBeInTheDocument() }) + it('warns before editing when a non-Unicode format is selected', () => { + const state = cloneDeep(mockedStore.getState()) + state.browser.keys.selectedKey.viewFormat = KeyValueFormat.JSON + const jsonStore = mockStore(state) + + render(, { store: jsonStore }) + + fireEvent.click(screen.getByTestId(EDIT_VALUE_BTN_TEST_ID)) + + expect( + screen.getByTestId('non-unicode-edit-to-unicode'), + ).toBeInTheDocument() + }) + it('should disable refresh when editing', async () => { render() const afterRenderActions = [...store.getActions()] diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/StringDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/StringDetails.tsx index 4ea21e97ab..7909ac4692 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/StringDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/StringDetails.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useCallback, useState } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' import { @@ -8,15 +8,7 @@ import { selectedKeySelector, setSelectedKeyRefreshDisabled, } from 'uiSrc/slices/browser/keys' -import { - KeyTypes, - KeyValueCompressor, - ModulesKeyTypes, - TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA, - TEXT_DISABLED_COMPRESSED_VALUE, - TEXT_DISABLED_FORMATTER_EDITING, - TEXT_DISABLED_STRING_EDITING, -} from 'uiSrc/constants' +import { KeyTypes, KeyValueCompressor, ModulesKeyTypes } from 'uiSrc/constants' import { KeyDetailsHeader, @@ -39,6 +31,11 @@ import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { CopyButton } from 'uiSrc/components/copy-button' import { Row } from 'uiSrc/components/base/layout/flex' +import { + NonUnicodeEditConfirmation, + useNonUnicodeEditGuard, +} from 'uiSrc/pages/browser/modules/key-details/shared/non-unicode-edit-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { StringDetailsValue } from './string-details-value' import { getStringCopyValue } from './StringDetails.utils' import { EditItemAction } from '../key-details-actions' @@ -49,6 +46,7 @@ export interface Props extends KeyDetailsHeaderProps {} const StringDetails = (props: Props) => { const { onRemoveKey } = props const keyType = KeyTypes.String + const { t } = useTranslation() const { loading, viewFormat: viewFormatProp } = useAppSelector(selectedKeySelector) @@ -64,14 +62,14 @@ const StringDetails = (props: Props) => { !isTruncatedValue && !isStringCompressed && isFormatEditable(viewFormatProp) const isStringEditable = isFullStringLoaded(keyValue?.data?.length, length) const noEditableText = isTruncatedValue - ? TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA + ? t('browser.keyDetails.truncatedActionDisabled') : isStringCompressed - ? TEXT_DISABLED_COMPRESSED_VALUE - : TEXT_DISABLED_FORMATTER_EDITING + ? t('browser.keyDetails.compressedValueDisabled') + : t('browser.keyDetails.formatterEditingDisabled') const editToolTip = !isEditable ? noEditableText : !isStringEditable - ? TEXT_DISABLED_STRING_EDITING + ? t('browser.string.loadAllToEdit') : null // The full value can be copied as text only when it is entirely loaded and not @@ -88,13 +86,33 @@ const StringDetails = (props: Props) => { const [editItem, setEditItem] = useState(false) const dispatch = useAppDispatch() + const { + isOpen: isEditConfirmOpen, + format: editConfirmFormat, + requestEdit, + cancel: cancelEditConfirm, + changeToUnicode: changeEditToUnicode, + editAnyway, + } = useNonUnicodeEditGuard() - const handleCopyValue = () => { + const handleHeaderEdit = useCallback(() => { + if (editItem) { + dispatch(setSelectedKeyRefreshDisabled(false)) + setEditItem(false) + return + } + requestEdit(() => { + dispatch(setSelectedKeyRefreshDisabled(true)) + setEditItem(true) + }) + }, [editItem, requestEdit, dispatch]) + + const handleCopyValue = useCallback(() => { sendEventTelemetry({ event: TelemetryEvent.STRING_VALUE_COPIED, eventData: { databaseId: instanceId }, }) - } + }, [instanceId]) const handleRefreshKey = ( key: RedisResponseBuffer, @@ -109,28 +127,54 @@ const StringDetails = (props: Props) => { onRemoveKey() } - const Actions = () => ( - - {/* Hidden while editing: copyValue comes from the saved Redis value, not - the unsaved textarea the user is currently editing. */} - {keyValue && isFullyAvailable && !editItem && ( - + ), + [ + t, + showCopyButton, + copyValue, + handleCopyValue, + isEditConfirmOpen, + editConfirmFormat, + cancelEditConfirm, + changeEditToUnicode, + editAnyway, + editToolTip, + isStringEditable, + isEditable, + handleHeaderEdit, + ], ) return ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.spec.tsx index 0d76c36f9b..bf6bc5f68c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.spec.tsx @@ -218,6 +218,24 @@ describe('StringDetailsValue', () => { ) }) + it('Should render the markdown viewer when viewFormat is Markdown', () => { + const stringDataSelectorMock = jest.fn().mockReturnValue({ + value: fullValue, + }) + const selectedKeySelectorMock = jest.fn().mockReturnValue({ + viewFormat: KeyValueFormat.Markdown, + }) + ;(selectedKeySelector as jest.Mock).mockImplementation( + selectedKeySelectorMock, + ) + ;(stringDataSelector as jest.Mock).mockImplementation( + stringDataSelectorMock, + ) + + render() + expect(screen.getByTestId('markdown-viewer')).toBeInTheDocument() + }) + it('Should not add "..." in the end of the full value', async () => { const stringDataSelectorMock = jest.fn().mockReturnValue({ value: fullValue, diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.tsx index ced87ff336..4ee436cb2d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.tsx @@ -29,7 +29,7 @@ import { updateStringValueAction, } from 'uiSrc/slices/browser/string' import InlineItemEditor from 'uiSrc/components/inline-item-editor/InlineItemEditor' -import { AddStringFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { getAddStringFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { selectedKeyDataSelector, selectedKeySelector, @@ -39,11 +39,8 @@ import { KeyValueFormat, ModulesKeyTypes, STRING_MAX_LENGTH, - TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA, - TEXT_DISABLED_COMPRESSED_VALUE, - TEXT_FAILED_CONVENT_FORMATTER, - TEXT_INVALID_VALUE, - TEXT_UNPRINTABLE_CHARACTERS, + getTextInvalidValue, + getTextUnprintableCharacters, } from 'uiSrc/constants' import { calculateTextareaLines } from 'uiSrc/utils/calculateTextareaLines' import { decompressingBuffer } from 'uiSrc/utils/decompressors' @@ -64,6 +61,11 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { + NonUnicodeEditConfirmation, + useNonUnicodeEditGuard, +} from 'uiSrc/pages/browser/modules/key-details/shared/non-unicode-edit-confirmation' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' const MIN_ROWS = 8 @@ -84,6 +86,8 @@ export interface Props { const StringDetailsValue = (props: Props) => { const { isEditItem, setIsEdit, onRefresh } = props + const { t } = useTranslation() + const config = getAddStringFormConfig(t) const { compressor = null } = useAppSelector(connectedInstanceSelector) const { loading } = useAppSelector(stringSelector) @@ -105,7 +109,7 @@ const StringDetailsValue = (props: Props) => { const [isDisabled, setIsDisabled] = useState(false) const [isEditable, setIsEditable] = useState(true) const [noEditableText, setNoEditableText] = useState( - TEXT_DISABLED_COMPRESSED_VALUE, + t('browser.keyDetails.compressedValueDisabled'), ) const textAreaRef: Ref = useRef(null) @@ -113,6 +117,7 @@ const StringDetailsValue = (props: Props) => { const dispatch = useAppDispatch() const { requestConfirmation } = useProductionWriteConfirmation() + const editGuard = useNonUnicodeEditGuard() useEffect( () => () => { @@ -156,10 +161,12 @@ const StringDetailsValue = (props: Props) => { ) setNoEditableText( isCompressed - ? TEXT_DISABLED_COMPRESSED_VALUE + ? t('browser.keyDetails.compressedValueDisabled') : isTruncatedValue - ? TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA - : TEXT_FAILED_CONVENT_FORMATTER(viewFormatProp), + ? t('browser.keyDetails.truncatedActionDisabled') + : t('browser.keyDetails.failedConvertFormatter', { + format: viewFormatProp, + }), ) dispatch(setIsStringCompressed(isCompressed)) @@ -167,7 +174,7 @@ const StringDetailsValue = (props: Props) => { if (viewFormat !== viewFormatProp) { setViewFormat(viewFormatProp) } - }, [initialValue, viewFormatProp, compressor, length]) + }, [initialValue, viewFormatProp, compressor, length, t]) useEffect(() => { // Approximate calculation of textarea rows by areaValue @@ -199,10 +206,9 @@ const StringDetailsValue = (props: Props) => { const onApplyChanges = () => { requestConfirmation({ - title: 'Edit value on production database?', - actionDescription: - 'You are about to modify a value on a production database.', - confirmButtonText: 'Save', + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t('browser.keyDetails.editable.confirmMessage'), + confirmButtonText: t('browser.keyDetails.editable.confirmButton'), commandId: BrowserConfirmationCommandId.EditValue, disableConfirmationInput: true, onConfirm: () => { @@ -257,28 +263,44 @@ const StringDetailsValue = (props: Props) => { const renderValue = (value: string) => { const textEl = ( isEditable && setIsEdit(true)} + onClick={() => + isEditable && editGuard.requestEdit(() => setIsEdit(true)) + } style={{ whiteSpace: 'break-spaces' }} data-testid="string-value" > {areaValue !== '' ? value - : !isLoading && Empty} + : !isLoading && ( + + {t('browser.string.empty')} + + )} ) return ( - - {textEl} - + + {textEl} + + } + /> ) } @@ -299,16 +321,16 @@ const StringDetailsValue = (props: Props) => { {isEditItem && ( formattingBuffer( stringToSerializedBufferFormat(viewFormat, areaValue), @@ -343,7 +365,7 @@ const StringDetailsValue = (props: Props) => { data-testid="load-all-value-btn" onClick={() => handleLoadAll(key, keyType)} > - Load all + {t('browser.string.loadAll')} )}
@@ -358,7 +380,7 @@ const StringDetailsValue = (props: Props) => { onClick={handleDownloadString} disabled={isTruncatedValue} > - Download + {t('browser.string.download')} )} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/text-details-wrapper/TextDetailsWrapper.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/text-details-wrapper/TextDetailsWrapper.tsx index c10ab762d8..95aaa5b4d1 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/text-details-wrapper/TextDetailsWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/text-details-wrapper/TextDetailsWrapper.tsx @@ -4,6 +4,7 @@ import { RiTooltip } from 'uiSrc/components' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { CancelSlimIcon } from 'uiSrc/components/base/icons' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' const TextDetailsWrapper = ({ @@ -15,19 +16,20 @@ const TextDetailsWrapper = ({ children: ReactNode testid?: string }) => { + const { t } = useTranslation() const getDataTestid = (suffix: string) => testid ? `${testid}-${suffix}` : suffix return (
onClose()} data-testid={getDataTestid('close-key-btn')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails.tsx index f3b6901e05..7bf7bd5006 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails.tsx @@ -2,13 +2,17 @@ import React from 'react' import { Title } from 'uiSrc/components/base/text/Title' import { Text } from 'uiSrc/components/base/text' +import { useTranslation } from 'uiSrc/i18n' import TextDetailsWrapper from '../text-details-wrapper/TextDetailsWrapper' -const TooLongKeyNameDetails = ({ onClose }: { onClose: () => void }) => ( - - The key name is too long - Details cannot be displayed. - -) +const TooLongKeyNameDetails = ({ onClose }: { onClose: () => void }) => { + const { t } = useTranslation() + return ( + + {t('browser.keyDetails.tooLongName.title')} + {t('browser.keyDetails.tooLongName.message')} + + ) +} export default TooLongKeyNameDetails diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.tsx index 9f63c34b80..d82eec7641 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.tsx @@ -3,26 +3,35 @@ import React from 'react' import { EXTERNAL_LINKS } from 'uiSrc/constants/links' import { Title } from 'uiSrc/components/base/text/Title' import { Text } from 'uiSrc/components/base/text' +import { Trans, useTranslation } from 'uiSrc/i18n' import TextDetailsWrapper from '../text-details-wrapper/TextDetailsWrapper' import styles from './styles.module.scss' -const UnsupportedTypeDetails = ({ onClose }: { onClose: () => void }) => ( - - This key type is not currently supported. - - See{' '} - - our repository - {' '} - for the list of supported key types. - - -) +const UnsupportedTypeDetails = ({ onClose }: { onClose: () => void }) => { + const { t } = useTranslation() + return ( + + {t('browser.keyDetails.unsupportedType.title')} + + + {''} + + ), + }} + /> + + + ) +} export default UnsupportedTypeDetails diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.spec.tsx index a9358b065d..6b3e75b78d 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.spec.tsx @@ -1,5 +1,6 @@ import React from 'react' import { render, screen, waitFor } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { AttributeEditor } from './AttributeEditor' import { AttributeEditorProps } from './AttributeEditor.types' @@ -8,7 +9,8 @@ import { JSON_VALIDATION_DEBOUNCE_MS, } from './constants' -const queryWarning = () => screen.queryByText(ATTRIBUTES_WARNING_MESSAGE) +const queryWarning = () => + screen.queryByText(i18n.t(ATTRIBUTES_WARNING_MESSAGE)) const defaultProps: AttributeEditorProps = { value: '', diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.tsx index a36a8e77bf..0064060f1c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/AttributeEditor.tsx @@ -3,6 +3,7 @@ import React, { useState } from 'react' import { CodeEditor } from 'uiSrc/components/base/code-editor' import { Text } from 'uiSrc/components/base/text' import { useDebouncedEffect } from 'uiSrc/services' +import { useTranslation } from 'uiSrc/i18n' import { ATTRIBUTES_EDITOR_OPTIONS, @@ -21,6 +22,7 @@ const AttributeEditor = ({ height = DEFAULT_ATTRIBUTE_EDITOR_HEIGHT, testId = 'attribute-editor', }: AttributeEditorProps) => { + const { t } = useTranslation() const [showNonJsonWarning, setShowNonJsonWarning] = useState( () => !isJsonValid(value), ) @@ -53,7 +55,7 @@ const AttributeEditor = ({ size="S" message={ - {ATTRIBUTES_WARNING_MESSAGE} + {t(ATTRIBUTES_WARNING_MESSAGE)} } data-testid={`${testId}-warning`} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/constants.ts index 34c2c0430e..8cb4c045aa 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/attribute-editor/constants.ts @@ -1,4 +1,5 @@ import { monaco as monacoEditor } from 'react-monaco-editor' +import { ParseKeys } from 'i18next' export const ATTRIBUTES_EDITOR_OPTIONS: Partial = { @@ -22,8 +23,8 @@ export const ATTRIBUTES_EDITOR_OPTIONS: Partial { +const ClearResultsAction = ({ width, title, onClick, testIdPrefix }: Props) => { + const { t } = useTranslation() + const resolvedTitle = title ?? t(DEFAULT_TITLE) const showLabel = width > MIDDLE_SCREEN_RESOLUTION const testId = testIdPrefix ? `${testIdPrefix}-${BASE_TEST_ID}` : BASE_TEST_ID return ( @@ -28,16 +26,16 @@ const ClearResultsAction = ({ - {title} + {resolvedTitle} ) : ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/clear-results-action/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/clear-results-action/constants.ts index 86b4bb0a0b..fe96a0127f 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/clear-results-action/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/clear-results-action/constants.ts @@ -1,2 +1,4 @@ -export const DEFAULT_TITLE = 'Clear results' +import { ParseKeys } from 'i18next' + +export const DEFAULT_TITLE: ParseKeys = 'browser.vectorSet.clearResults' export const BASE_TEST_ID = 'clear-results-btn' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/ElementDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/ElementDetails.tsx index b257a7009d..5e4fb16a38 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/ElementDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/ElementDetails.tsx @@ -27,6 +27,7 @@ import { AttributeEditor } from '../attribute-editor' import { useElementAttributeEditor } from '../hooks' import { formatVector } from './utils' import { VECTOR_DESCRIPTION, ATTRIBUTES_DESCRIPTION } from './constants' +import { useTranslation } from 'uiSrc/i18n' import { ElementDetailsProps } from './ElementDetails.types' import * as S from './ElementDetails.styles' @@ -36,6 +37,7 @@ const ElementDetails = ({ onClose, onDrawerDidClose, }: ElementDetailsProps) => { + const { t } = useTranslation() const dispatch = useAppDispatch() const { name: keyName } = useAppSelector(selectedKeyDataSelector) ?? {} const { id: databaseId } = useAppSelector(connectedInstanceSelector) @@ -121,16 +123,25 @@ const ElementDetails = ({ - {VECTOR_DESCRIPTION} + {t(VECTOR_DESCRIPTION)} - Vector + + {t('browser.vectorSet.elementDetails.vectorLabel')} + {isTruncatedVector ? ( - + @@ -138,7 +149,9 @@ const ElementDetails = ({ ) : ( @@ -155,14 +168,18 @@ const ElementDetails = ({ - {ATTRIBUTES_DESCRIPTION} + {t(ATTRIBUTES_DESCRIPTION)} - Attributes + + {t('browser.vectorSet.elementDetails.attributesLabel')} + {!isEditing && ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/constants.ts index cd8fa299b4..1898ff4675 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/element-details/constants.ts @@ -1,4 +1,6 @@ -export const VECTOR_DESCRIPTION = - 'The numerical embedding representing this item in vector space, used for similarity search and ranking.' -export const ATTRIBUTES_DESCRIPTION = - 'Structured metadata associated with this item, used for filtering, display, and hybrid search queries.' +import { ParseKeys } from 'i18next' + +export const VECTOR_DESCRIPTION: ParseKeys = + 'browser.vectorSet.elementDetails.vectorDescription' +export const ATTRIBUTES_DESCRIPTION: ParseKeys = + 'browser.vectorSet.elementDetails.attributesDescription' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/hooks/useVectorSetElementListData/useVectorSetElementListData.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/hooks/useVectorSetElementListData/useVectorSetElementListData.ts index 20005c87d9..478bfe2b7b 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/hooks/useVectorSetElementListData/useVectorSetElementListData.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/hooks/useVectorSetElementListData/useVectorSetElementListData.ts @@ -1,5 +1,6 @@ import { useEffect, useMemo, useState } from 'react' import { useAppDispatch, useAppSelector } from 'uiSrc/slices/hooks' +import { useTranslation } from 'uiSrc/i18n' import { PaginationState } from 'uiSrc/components/base/layout/table' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' @@ -31,6 +32,7 @@ import { export const useVectorSetElementListData = ({ actionsConfig, }: UseVectorSetElementListDataParams): UseVectorSetElementListDataResult => { + const { t } = useTranslation() const { loading } = useAppSelector(vectorSetSelector) const { elements, nextCursor, total, isPaginationSupported } = useAppSelector( vectorSetDataSelector, @@ -73,8 +75,8 @@ export const useVectorSetElementListData = ({ }, [elements, pagination, isPaginationSupported]) const emptyMessage = loading - ? ELEMENT_LIST_LOADING_MESSAGE - : ELEMENT_LIST_EMPTY_MESSAGE + ? t(ELEMENT_LIST_LOADING_MESSAGE) + : t(ELEMENT_LIST_EMPTY_MESSAGE) useEffect(() => { const { pageIndex, pageSize } = pagination diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.styles.ts deleted file mode 100644 index 003f4cbfd7..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.styles.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { HTMLAttributes } from 'react' -import styled from 'styled-components' -import { Row } from 'uiSrc/components/base/layout/flex' - -export const PreviewBar = styled(Row)` - width: 100%; - padding: ${({ theme }) => - `${theme.core.space.space100} ${theme.core.space.space200}`}; - border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral600}; - border-radius: 4px; - background: ${({ theme }) => theme.semantic.color.background.neutral100}; -` - -export const PreviewText = styled.code>` - flex: 1; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-family: 'Source Code Pro', Menlo, Consolas, monospace; - font-size: 12px; - color: ${({ theme }) => theme.semantic.color.text.neutral800}; -` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.tsx deleted file mode 100644 index 2a9108ec4c..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react' - -import { CopyButton } from 'uiSrc/components/copy-button' - -import { COMMAND_PREVIEW_LOADING_PLACEHOLDER } from '../similarity-search-form/constants' -import { PreviewBar, PreviewText } from './CommandPreview.styles' -import { CommandPreviewProps } from './CommandPreview.types' - -const TEST_ID = 'similarity-search-command-preview' - -export const CommandPreview = ({ - command, - loading = false, -}: CommandPreviewProps) => { - const isEmpty = command.length === 0 - let displayText = command - if (loading) { - displayText = COMMAND_PREVIEW_LOADING_PLACEHOLDER - } else if (isEmpty) { - displayText = '' - } - - return ( - - - {displayText} - - - - - ) -} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.types.ts deleted file mode 100644 index 91a40a6b19..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/CommandPreview.types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface CommandPreviewProps { - command: string - loading?: boolean -} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/index.ts deleted file mode 100644 index c83e7e7038..0000000000 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/command-preview/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CommandPreview } from './CommandPreview' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.spec.tsx index d3f779ca41..7efd2346a8 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.spec.tsx @@ -2,6 +2,7 @@ import React from 'react' import { fireEvent, screen } from '@testing-library/react' import { render } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { FilterInputWithSuggestions } from './FilterInputWithSuggestions' import { SUGGESTIONS_HINT } from './constants' @@ -60,7 +61,7 @@ describe('FilterInputWithSuggestions', () => { focusAt(screen.getByTestId(TEST_ID) as HTMLInputElement, 1, '.') expect(screen.getByTestId(`${TEST_ID}-suggestions-hint`)).toHaveTextContent( - SUGGESTIONS_HINT, + i18n.t(SUGGESTIONS_HINT), ) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.tsx index 273e48ef3e..dee70acba5 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-input-with-suggestions/FilterInputWithSuggestions.tsx @@ -11,6 +11,7 @@ import { TextInput } from 'uiSrc/components/base/inputs' import * as keys from 'uiSrc/constants/keys' import { SUGGESTIONS_HINT } from './constants' +import { useTranslation } from 'uiSrc/i18n' import * as S from './FilterInputWithSuggestions.styles' import { FilterInputWithSuggestionsProps } from './FilterInputWithSuggestions.types' import { @@ -27,6 +28,7 @@ export const FilterInputWithSuggestions = ({ disabled, testId, }: FilterInputWithSuggestionsProps) => { + const { t } = useTranslation() const inputRef = useRef(null) const [caret, setCaret] = useState(value.length) const [isFocused, setIsFocused] = useState(false) @@ -182,7 +184,7 @@ export const FilterInputWithSuggestions = ({ - {SUGGESTIONS_HINT} + {t(SUGGESTIONS_HINT)} { + const { t } = useTranslation() const [isOpen, setIsOpen] = useState(false) const { id: databaseId } = useAppSelector(connectedInstanceSelector) + const filterOperators = getFilterOperators(t) const handleTriggerClick = () => { setIsOpen((prev) => { @@ -44,28 +47,25 @@ export const FilterSyntaxHelpPopover = () => { trigger={ } > - Filter syntax - - Filters use a small expression language evaluated against each - element's attributes. - + {t('browser.vectorSet.filterHelp.title')} + {t('browser.vectorSet.filterHelp.intro')} - Operators + {t('browser.vectorSet.filterHelp.operatorsLabel')} - {FILTER_OPERATORS.map((line) => ( + {filterOperators.map((line) => (
  • {line}
  • ))}
    - Examples + {t('browser.vectorSet.filterHelp.examplesLabel')} {FILTER_EXAMPLES.map((line) => ( @@ -80,7 +80,7 @@ export const FilterSyntaxHelpPopover = () => { onClick={() => setIsOpen(false)} data-testid={`${TEST_ID}-close`} > - Close + {t('browser.vectorSet.filterHelp.close')}
    diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-syntax-help-popover/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-syntax-help-popover/constants.ts index b65c53f368..708fa87463 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-syntax-help-popover/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/filter-syntax-help-popover/constants.ts @@ -1,9 +1,11 @@ -export const FILTER_OPERATORS = [ - '. – select an attribute (e.g. .price)', - '== / != / < / <= / > / >=', - 'and / or / not', - 'in [ ... ]', - '"..." for string literals', +import { TFunction } from 'i18next' + +export const getFilterOperators = (t: TFunction) => [ + t('browser.vectorSet.filterHelp.op.selectAttribute'), + t('browser.vectorSet.filterHelp.op.comparison'), + t('browser.vectorSet.filterHelp.op.logical'), + t('browser.vectorSet.filterHelp.op.inList'), + t('browser.vectorSet.filterHelp.op.stringLiterals'), ] export const FILTER_EXAMPLES = [ diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.spec.tsx index 31b7edbcd9..bcccf2fe52 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.spec.tsx @@ -129,7 +129,7 @@ describe('SimilaritySearchForm', () => { expect( screen.getByTestId('similarity-search-command-preview-text'), - ).toHaveTextContent('command is loading...') + ).toHaveTextContent('Building command…') }) it('shows the loading placeholder even when a previous command exists', () => { @@ -145,7 +145,7 @@ describe('SimilaritySearchForm', () => { expect( screen.getByTestId('similarity-search-command-preview-text'), - ).toHaveTextContent('command is loading...') + ).toHaveTextContent('Building command…') }) it('renders the hook-supplied preview verbatim once toggled on', () => { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.styles.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.styles.ts index d4e16a9d2f..49622337ca 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.styles.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.styles.ts @@ -1,7 +1,6 @@ -import { HTMLAttributes } from 'react' +import React, { HTMLAttributes } from 'react' import styled from 'styled-components' -import { ToggleButton } from 'uiSrc/components/base/forms/buttons' -import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { Col } from 'uiSrc/components/base/layout/flex' import { MIDDLE_SCREEN_RESOLUTION } from 'uiSrc/constants' /** @@ -60,11 +59,14 @@ export const FilterLabel = styled.span>` gap: ${({ theme }) => theme.core.space.space050}; ` -export const ActionRow = styled(Row)` +// A plain div (not `Row`) so it can hold the ResizeObserver ref that drives +// the responsive preview label — layout components don't forward refs. +export const ActionRow = styled.div<{ + children?: React.ReactNode + ref?: React.Ref +}>` + display: flex; + align-items: center; + gap: ${({ theme }) => theme.core.space.space100}; min-height: ${ACTION_ROW_HEIGHT}; ` - -export const PreviewToggleButton = styled(ToggleButton)` - ${({ theme, pressed }) => - !pressed && `border-color: ${theme.semantic.color.border.neutral600};`} -` diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.tsx index 04f17464dc..9f2e1273ea 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/SimilaritySearchForm.tsx @@ -5,30 +5,31 @@ import { RiTooltip } from 'uiSrc/components' import { ButtonGroup } from 'uiSrc/components/base/forms/button-group/ButtonGroup' import { IconButton, PrimaryButton } from 'uiSrc/components/base/forms/buttons' import { FormField } from 'uiSrc/components/base/forms/FormField' -import { InfoIcon, ResetIcon, RiIcon } from 'uiSrc/components/base/icons' +import { InfoIcon, ResetIcon } from 'uiSrc/components/base/icons' import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { TextInput, QuantityCounter } from 'uiSrc/components/base/inputs' -import { Text } from 'uiSrc/components/base/text' import { vectorSetAttributeKeysSelector } from 'uiSrc/slices/browser/vectorSet' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' +import { + CommandPreview, + PreviewToggle, + useResponsivePreviewLabel, +} from 'uiSrc/pages/browser/modules/key-details/shared' +import { useTranslation } from 'uiSrc/i18n' import { VectorSetSimilarityInputMode } from '../../telemetry.constants' import { getVectorFieldInfo } from '../../vector-set-element-form/utils' import { useSimilaritySearch } from '../../hooks/useSimilaritySearch' -import { CommandPreview } from '../command-preview' import { FilterInputWithSuggestions } from '../filter-input-with-suggestions' import { FilterSyntaxHelpPopover } from '../filter-syntax-help-popover' import * as S from './SimilaritySearchForm.styles' import { + COMMAND_PREVIEW_TEST_ID, ELEMENT_MODE_TOOLTIP, ELEMENT_PLACEHOLDER, FILTER_PLACEHOLDER, - PREVIEW_TOGGLE_ARIA_LABEL, - PREVIEW_TOGGLE_HIDE_TOOLTIP, - PREVIEW_TOGGLE_LABEL, - PREVIEW_TOGGLE_SHOW_TOOLTIP, QUERY_NOT_READY_TOOLTIP, SIMILARITY_SEARCH_COUNT_DEFAULT, SIMILARITY_SEARCH_COUNT_MAX, @@ -47,6 +48,7 @@ import { export const SimilaritySearchForm = ({ prefillElement, }: SimilaritySearchFormProps = {}) => { + const { t } = useTranslation() const { loading, previewLoading, @@ -62,6 +64,7 @@ export const SimilaritySearchForm = ({ useState(initialFormState) const [previewVisible, setPreviewVisible] = useState(false) + const { containerRef, isWide } = useResponsivePreviewLabel() const { id: databaseId } = useAppSelector(connectedInstanceSelector) const attributeKeys = useAppSelector(vectorSetAttributeKeysSelector) @@ -110,8 +113,8 @@ export const SimilaritySearchForm = ({ } const vectorFieldInfo = useMemo( - () => getVectorFieldInfo(state.vectorInput, vectorDim), - [state.vectorInput, vectorDim], + () => getVectorFieldInfo(state.vectorInput, vectorDim, t), + [state.vectorInput, vectorDim, t], ) const queryReady = isQueryReady(state, vectorDim) @@ -155,10 +158,10 @@ export const SimilaritySearchForm = ({ data-testid={`${TEST_ID}-mode-vector`} > - Vector - + {t('browser.vectorSet.search.vectorMode')} + @@ -172,10 +175,10 @@ export const SimilaritySearchForm = ({ data-testid={`${TEST_ID}-mode-element`} > - Element - + {t('browser.vectorSet.search.elementMode')} + @@ -189,7 +192,7 @@ export const SimilaritySearchForm = ({ {state.mode === SimilaritySearchMode.Vector ? ( setField('vectorInput', value)} disabled={loading} @@ -202,7 +205,7 @@ export const SimilaritySearchForm = ({ ) : ( setField('elementInput', value)} disabled={loading} @@ -214,7 +217,7 @@ export const SimilaritySearchForm = ({ - Result count + {t('browser.vectorSet.search.resultCount')} - Filter expression + {t('browser.vectorSet.search.filterLabel')} @@ -253,50 +256,44 @@ export const SimilaritySearchForm = ({ - + - - - - {PREVIEW_TOGGLE_LABEL} - - + {previewVisible && ( - + )} - + - Find similar items + {t('browser.vectorSet.search.submit')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/constants.ts index 4f6dade490..eb2b0ebb83 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-form/similarity-search-form/constants.ts @@ -1,22 +1,23 @@ +import { ParseKeys } from 'i18next' + export const SIMILARITY_SEARCH_FORM_TEST_ID = 'similarity-search-form' +export const COMMAND_PREVIEW_TEST_ID = 'similarity-search-command-preview' export const SIMILARITY_SEARCH_COUNT_DEFAULT = 10 export const SIMILARITY_SEARCH_COUNT_MIN = 1 export const SIMILARITY_SEARCH_COUNT_MAX = 1000 -export const VECTOR_PLACEHOLDER = - 'Enter a vector to find items with the most similar vectors.' -export const ELEMENT_PLACEHOLDER = 'Existing element name' +export const VECTOR_PLACEHOLDER: ParseKeys = + 'browser.vectorSet.search.vectorPlaceholder' +export const ELEMENT_PLACEHOLDER: ParseKeys = + 'browser.vectorSet.search.elementPlaceholder' +// A filter-syntax example — kept literal (code), like the filter help examples. export const FILTER_PLACEHOLDER = 'e.g. .price > 50 and .category == "books"' -export const VECTOR_MODE_TOOLTIP = 'Search by raw vector values' -export const ELEMENT_MODE_TOOLTIP = 'Search by an existing element.' - -export const QUERY_NOT_READY_TOOLTIP = 'Enter a vector or element to search' - -export const PREVIEW_TOGGLE_LABEL = 'Preview' -export const PREVIEW_TOGGLE_ARIA_LABEL = 'Toggle command preview' -export const PREVIEW_TOGGLE_HIDE_TOOLTIP = 'Hide command preview' -export const PREVIEW_TOGGLE_SHOW_TOOLTIP = 'Show command preview' +export const VECTOR_MODE_TOOLTIP: ParseKeys = + 'browser.vectorSet.search.vectorModeTooltip' +export const ELEMENT_MODE_TOOLTIP: ParseKeys = + 'browser.vectorSet.search.elementModeTooltip' -export const COMMAND_PREVIEW_LOADING_PLACEHOLDER = 'command is loading...' +export const QUERY_NOT_READY_TOOLTIP: ParseKeys = + 'browser.vectorSet.search.queryNotReadyTooltip' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.config.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.config.tsx index 3dfe29687f..0759fa6fa2 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.config.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.config.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { ParseKeys, TFunction } from 'i18next' import { CellContext, @@ -113,6 +114,7 @@ const similarityColumn: ColumnDef = { const buildAttributeColumn = ( key: string, + t: TFunction, ): ColumnDef => ({ id: `${SIMILARITY_RESULTS_ATTRIBUTE_COLUMN_ID_PREFIX}${key}`, header: key, @@ -144,7 +146,9 @@ const buildAttributeColumn = ( data-testid={`vector-set-similarity-attribute-cell-${row.index}-${key}`} > {isMissing ? ( - Empty + + {t('browser.vectorSet.results.emptyAttr')} + ) : ( renderAttributeValue(value) )} @@ -177,12 +181,21 @@ const actionsColumn: ColumnDef = { }, } +const withLocalizedHeader = ( + col: ColumnDef, + t: TFunction, +): ColumnDef => + typeof col.header === 'string' + ? { ...col, header: t(col.header as ParseKeys) } + : col + export const buildSimilarityResultsColumns = ( attributeKeys: string[], + t: TFunction, ): ColumnDef[] => [ - rankColumn, - nameColumn, - ...attributeKeys.map(buildAttributeColumn), - similarityColumn, + withLocalizedHeader(rankColumn, t), + withLocalizedHeader(nameColumn, t), + ...attributeKeys.map((key) => buildAttributeColumn(key, t)), + withLocalizedHeader(similarityColumn, t), actionsColumn, ] diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.spec.tsx index 147b3038df..88015f2db4 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.spec.tsx @@ -1,6 +1,7 @@ import React from 'react' import { render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { stringToBuffer } from 'uiSrc/utils' import { VectorSetSimilarityMatch } from 'uiSrc/slices/interfaces/vectorSet' import { vectorSetSimilarityMatchFactory } from 'uiSrc/mocks/factories/browser/vectorSet/vectorSetElement.factory' @@ -18,7 +19,7 @@ import { const defaultProps: SimilaritySearchResultsTableProps = { matches: [], - columns: buildSimilarityResultsColumns([]), + columns: buildSimilarityResultsColumns([], i18n.t), columnVisibility: {}, parsedAttributesCache: new WeakMap(), } @@ -50,7 +51,7 @@ const renderTable = ( ) => { const parsedAttributesCache = buildParsedAttributesCache(matches) const attributeKeys = collectAttributeKeys(matches, parsedAttributesCache) - const columns = buildSimilarityResultsColumns(attributeKeys) + const columns = buildSimilarityResultsColumns(attributeKeys, i18n.t) return renderComponent({ matches, columns, @@ -230,7 +231,7 @@ describe('SimilaritySearchResultsTable', () => { it('renders attribute values from the parsed-attributes cache', () => { const match = buildMatch('a', 0.9, '{"city":"RAW"}') const attributeKeys = collectAttributeKeys([match]) - const columns = buildSimilarityResultsColumns(attributeKeys) + const columns = buildSimilarityResultsColumns(attributeKeys, i18n.t) const parsedAttributesCache: ParsedAttributesCache = new WeakMap() parsedAttributesCache.set(match, { city: 'FROM_CACHE' }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.tsx index 80380444ee..1d50065c61 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/SimilaritySearchResultsTable.tsx @@ -3,6 +3,7 @@ import { useAppSelector } from 'uiSrc/slices/hooks' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { selectedKeySelector } from 'uiSrc/slices/browser/keys' +import { useTranslation } from 'uiSrc/i18n' import { SIMILARITY_RESULTS_ACTIONS_COLUMN_SIZE, @@ -29,6 +30,7 @@ const SimilaritySearchResultsTable = memo( parsedAttributesCache, actionsConfig, }: SimilaritySearchResultsTableProps) => { + const { t } = useTranslation() const { compressor = null } = useAppSelector(connectedInstanceSelector) const { viewFormat } = useAppSelector(selectedKeySelector) @@ -79,7 +81,7 @@ const SimilaritySearchResultsTable = memo( enableColumnResizing minWidth={tableMinWidth} paginationEnabled={false} - emptyState={SIMILARITY_RESULTS_EMPTY_MESSAGE} + emptyState={t(SIMILARITY_RESULTS_EMPTY_MESSAGE)} data-testid={`${TEST_ID}-table`} /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.spec.tsx index f8bbe9bf1f..0d2a230815 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.spec.tsx @@ -1,5 +1,6 @@ import React from 'react' import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' +import i18n from 'uiSrc/i18n' import { MIDDLE_SCREEN_RESOLUTION } from 'uiSrc/constants' @@ -40,7 +41,7 @@ describe('SimilarityColumnsPopover', () => { const btn = screen.getByTestId(COLUMNS_BUTTON_TEST_ID) expect(btn).toBeInTheDocument() - expect(btn).toHaveTextContent(DEFAULT_TITLE) + expect(btn).toHaveTextContent(i18n.t(DEFAULT_TITLE)) }) it('renders icon-only trigger on narrow screens', () => { @@ -48,8 +49,8 @@ describe('SimilarityColumnsPopover', () => { const btn = screen.getByTestId(COLUMNS_BUTTON_TEST_ID) expect(btn).toBeInTheDocument() - expect(btn).not.toHaveTextContent(DEFAULT_TITLE) - expect(btn).toHaveAttribute('aria-label', DEFAULT_TITLE) + expect(btn).not.toHaveTextContent(i18n.t(DEFAULT_TITLE)) + expect(btn).toHaveAttribute('aria-label', i18n.t(DEFAULT_TITLE)) }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.tsx index 6c88c80ea5..a35a422658 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/components/SimilarityColumnsPopover/SimilarityColumnsPopover.tsx @@ -10,6 +10,7 @@ import { Checkbox } from 'uiSrc/components/base/forms/checkbox/Checkbox' import { Col } from 'uiSrc/components/base/layout/flex' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' +import { useTranslation } from 'uiSrc/i18n' import { COLUMNS_BUTTON_TEST_ID, @@ -30,8 +31,10 @@ const SimilarityColumnsPopover = ({ columnsMap, shownColumns, onShownColumnsChange, - title = DEFAULT_TITLE, + title, }: Props) => { + const { t } = useTranslation() + const resolvedTitle = title ?? t(DEFAULT_TITLE) const [isOpen, setIsOpen] = useState(false) const showLabel = width > MIDDLE_SCREEN_RESOLUTION const { id: databaseId } = useAppSelector(connectedInstanceSelector) @@ -63,21 +66,21 @@ const SimilarityColumnsPopover = ({ icon={ColumnsIcon} onClick={toggle} data-testid={COLUMNS_BUTTON_TEST_ID} - aria-label={title} + aria-label={resolvedTitle} > - {title} + {resolvedTitle} ) : ( ) return ( - + = { - [SimilarityResultsColumn.Name]: 'Element', - [SimilarityResultsColumn.Rank]: 'Rank', - [SimilarityResultsColumn.Similarity]: 'Similarity', + [SimilarityResultsColumn.Name]: 'browser.vectorSet.results.elementColumn', + [SimilarityResultsColumn.Rank]: 'browser.vectorSet.results.rankColumn', + [SimilarityResultsColumn.Similarity]: + 'browser.vectorSet.results.similarityColumn', [SimilarityResultsColumn.Actions]: '', } -export const SIMILARITY_RESULTS_EMPTY_MESSAGE = 'No matching elements found.' +export const SIMILARITY_RESULTS_EMPTY_MESSAGE: ParseKeys = + 'browser.vectorSet.results.empty' /** * Scores at or above this threshold are treated as a "high" match and diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/hooks/useSimilarityResultColumns.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/hooks/useSimilarityResultColumns.ts index 8ddc2acd3e..c77e2c3f5e 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/hooks/useSimilarityResultColumns.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/similarity-search-results/hooks/useSimilarityResultColumns.ts @@ -1,5 +1,6 @@ import { useCallback, useMemo, useState } from 'react' +import { useTranslation } from 'uiSrc/i18n' import { ColumnDef } from 'uiSrc/components/base/layout/table' import { VectorSetSimilarityMatch } from 'uiSrc/slices/interfaces/vectorSet' @@ -45,6 +46,7 @@ export const attributeColumnId = (key: string): string => export const useSimilarityResultColumns = ( matches: VectorSetSimilarityMatch[], ): UseSimilarityResultColumnsResult => { + const { t } = useTranslation() const parsedAttributesCache = useMemo( () => buildParsedAttributesCache(matches), [matches], @@ -60,8 +62,8 @@ export const useSimilarityResultColumns = ( >(() => new Set()) const columns = useMemo( - () => buildSimilarityResultsColumns(attributeKeys), - [attributeKeys], + () => buildSimilarityResultsColumns(attributeKeys, t), + [attributeKeys, t], ) const columnsMap = useMemo(() => { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/VectorSetElementFormFields.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/VectorSetElementFormFields.tsx index b05e741a9a..4e63285f47 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/VectorSetElementFormFields.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/VectorSetElementFormFields.tsx @@ -9,6 +9,7 @@ import { Text } from 'uiSrc/components/base/text' import { ChevronDownIcon, ChevronRightIcon } from 'uiSrc/components/base/icons' import { EntryContent } from 'uiSrc/pages/browser/modules/key-details/components/common/AddKeysContainer.styled' +import { useTranslation } from 'uiSrc/i18n' import { AttributeEditor } from '../attribute-editor' import { UseVectorSetElementFormResult } from '../hooks/useVectorSetElementForm/useVectorSetElementForm.types' import { getVectorFieldInfo } from './utils' @@ -28,96 +29,107 @@ const VectorSetElementFormFields = ({ isClearDisabled, getDimForElement, loading, -}: VectorSetElementFormFieldsProps) => ( - - - {(item, index) => { - const rowVectorDim = getDimForElement(index) - const vectorInfo = getVectorFieldInfo(item.vector, rowVectorDim) +}: VectorSetElementFormFieldsProps) => { + const { t } = useTranslation() + return ( + + + {(item, index) => { + const rowVectorDim = getDimForElement(index) + const vectorInfo = getVectorFieldInfo(item.vector, rowVectorDim, t) - return ( - - - - - - handleFieldChange('name', item.id, value) - } - ref={ - index === elements.length - 1 ? lastAddedNameRef : null - } - disabled={loading} - data-testid="element-name" - /> - - - - - - handleFieldChange('vector', item.id, value) + return ( + + + + + + handleFieldChange('name', item.id, value) + } + ref={ + index === elements.length - 1 ? lastAddedNameRef : null + } + disabled={loading} + data-testid="element-name" + /> + + + + + + handleFieldChange('vector', item.id, value) + } + disabled={loading} + error={vectorInfo.isError ? vectorInfo.text : undefined} + data-testid="element-vector" + /> + + + + + + toggleAttributes(item.id)} + pressed={item.showAttributes} + data-testid="toggle-attributes-btn" + > + {t('browser.vectorSet.form.addAttributes')} + - - - - - - toggleAttributes(item.id)} - pressed={item.showAttributes} - data-testid="toggle-attributes-btn" - > - Add attributes - {' '} + + {t('browser.vectorSet.form.optional')} + + + {item.showAttributes && ( + + handleFieldChange('attributes', item.id, val) } + isInEditMode={!loading} + height="120px" + testId="element-attributes" /> - {' '} - (Optional) - - {item.showAttributes && ( - - handleFieldChange('attributes', item.id, val) - } - isInEditMode={!loading} - height="120px" - testId="element-attributes" - /> - )} - - ) - }} - - -) + )} + + ) + }} + + + ) +} export default VectorSetElementFormFields diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/constants.ts index b19fa52bbc..4efc655b11 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/constants.ts @@ -1,3 +1,4 @@ +import { ParseKeys } from 'i18next' import { IVectorSetElementState } from './interfaces' export const INITIAL_VECTOR_SET_ELEMENT_STATE: IVectorSetElementState = { @@ -21,10 +22,12 @@ export const FP32_ESCAPE_REGEX = /^(?:\s*\\x[0-9a-fA-F]{2})+\s*$/ // instead of leaking through to the numeric parser as "not a number". export const FP32_ESCAPE_PREFIX_REGEX = /^\\x/ -export const DEFAULT_VECTOR_HELP_TEXT = - 'Format is detected automatically. The first vector defines the required dimension for this set.' +export const DEFAULT_VECTOR_HELP_TEXT: ParseKeys = + 'browser.vectorSet.form.vectorHelp' -export const INVALID_FP32_FORMAT_ERROR = 'Invalid FP32 byte string' -export const INVALID_FP32_BYTE_LENGTH_ERROR = - 'FP32 byte length must be a multiple of 4' -export const INVALID_NUMERIC_FORMAT_ERROR = 'Invalid number format in vector' +export const INVALID_FP32_FORMAT_ERROR: ParseKeys = + 'browser.vectorSet.form.invalidFp32' +export const INVALID_FP32_BYTE_LENGTH_ERROR: ParseKeys = + 'browser.vectorSet.form.invalidFp32Length' +export const INVALID_NUMERIC_FORMAT_ERROR: ParseKeys = + 'browser.vectorSet.form.invalidNumeric' diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.spec.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.spec.ts index cf33d9e111..3d13d10bb1 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.spec.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.spec.ts @@ -3,10 +3,12 @@ import { FP32_VECTOR_FIXTURE_1_2_3, vectorSetElementFormStateFactory, } from 'uiSrc/mocks/factories/browser/vectorSet/vectorSetElement.factory' +import i18n from 'uiSrc/i18n' import { DEFAULT_VECTOR_HELP_TEXT, INVALID_FP32_BYTE_LENGTH_ERROR, INVALID_FP32_FORMAT_ERROR, + INVALID_NUMERIC_FORMAT_ERROR, } from './constants' import { getRowDim, @@ -64,7 +66,8 @@ describe('getVectorError', () => { }) it('should return an error for an unparsable vector', () => { - expect(getVectorError('1, abc, 3')).toBe('Invalid number format in vector') + // getVectorError surfaces the raw i18n key; display code resolves it via t(). + expect(getVectorError('1, abc, 3')).toBe(INVALID_NUMERIC_FORMAT_ERROR) }) it('should return undefined for a valid vector without dimension check', () => { @@ -77,42 +80,42 @@ describe('getVectorError', () => { it('should return a dimension-mismatch error when dimension does not match', () => { expect(getVectorError('1, 2', 3)).toBe( - 'Dimension mismatch. Expected 3 values, but received 2', + 'browser.vectorSet.form.dimensionMismatch', ) }) }) describe('getVectorFieldInfo', () => { it('should return the default help text for an empty input', () => { - expect(getVectorFieldInfo('')).toEqual({ - text: DEFAULT_VECTOR_HELP_TEXT, + expect(getVectorFieldInfo('', undefined, i18n.t)).toEqual({ + text: i18n.t(DEFAULT_VECTOR_HELP_TEXT), isError: false, }) }) it('should return an error message when parsing fails', () => { - expect(getVectorFieldInfo('1, abc, 3')).toEqual({ + expect(getVectorFieldInfo('1, abc, 3', undefined, i18n.t)).toEqual({ text: 'Invalid number format in vector', isError: true, }) }) it('should return a dimension-mismatch error when dimension does not match', () => { - expect(getVectorFieldInfo('1, 2', 3)).toEqual({ + expect(getVectorFieldInfo('1, 2', 3, i18n.t)).toEqual({ text: 'Dimension mismatch. Expected 3 values, but received 2', isError: true, }) }) it('should return detected dimensions for a valid vector', () => { - expect(getVectorFieldInfo('1, 2, 3')).toEqual({ + expect(getVectorFieldInfo('1, 2, 3', undefined, i18n.t)).toEqual({ text: 'Detected numeric vector (3 dimensions).', isError: false, }) }) it('should return detected dimensions when dimension matches', () => { - expect(getVectorFieldInfo('1 2 3 4', 4)).toEqual({ + expect(getVectorFieldInfo('1 2 3 4', 4, i18n.t)).toEqual({ text: 'Detected numeric vector (4 dimensions).', isError: false, }) @@ -323,22 +326,24 @@ describe('FP32 detection in getVectorError', () => { it('should return a dimension-mismatch error when FP32 dim disagrees', () => { expect(getVectorError(FP32_ESCAPED_1_2_3, 5)).toBe( - 'Dimension mismatch. Expected 5 values, but received 3', + 'browser.vectorSet.form.dimensionMismatch', ) }) }) describe('FP32 detection in getVectorFieldInfo', () => { it('should return the FP32 detected message for a valid FP32 input', () => { - expect(getVectorFieldInfo(FP32_ESCAPED_1_2_3)).toEqual({ + expect(getVectorFieldInfo(FP32_ESCAPED_1_2_3, undefined, i18n.t)).toEqual({ text: 'Detected FP32 vector (3 dimensions).', isError: false, }) }) it('should return the FP32 byte-length error in the hint', () => { - expect(getVectorFieldInfo(FP32_INVALID_BYTE_LENGTH_INPUT)).toEqual({ - text: INVALID_FP32_BYTE_LENGTH_ERROR, + expect( + getVectorFieldInfo(FP32_INVALID_BYTE_LENGTH_INPUT, undefined, i18n.t), + ).toEqual({ + text: i18n.t(INVALID_FP32_BYTE_LENGTH_ERROR), isError: true, }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.ts index cd55f2390d..ec312fd57c 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-form/utils.ts @@ -1,3 +1,4 @@ +import { ParseKeys, TFunction } from 'i18next' import { DEFAULT_VECTOR_HELP_TEXT, FP32_ESCAPE_PREFIX_REGEX, @@ -7,6 +8,12 @@ import { INVALID_NUMERIC_FORMAT_ERROR, VECTOR_SEPARATOR, } from './constants' + +// Truthy marker stored on a validation result for a dimension mismatch. The +// displayed text is built with interpolation in `getVectorFieldInfo`; callers +// only test `error` for truthiness, so any non-empty value works here. +const DIMENSION_MISMATCH_ERROR: ParseKeys = + 'browser.vectorSet.form.dimensionMismatch' import { IVectorSetElementState, SubmitElement, @@ -75,7 +82,7 @@ export function validateVector( kind: 'fp32', fp32Bytes: bytes, dim, - error: `Dimension mismatch. Expected ${vectorDim} values, but received ${dim}`, + error: DIMENSION_MISMATCH_ERROR, } } return { kind: 'fp32', fp32Bytes: bytes, dim } @@ -89,7 +96,7 @@ export function validateVector( kind: 'numeric', numeric: parsed, dim: parsed.length, - error: `Dimension mismatch. Expected ${vectorDim} values, but received ${parsed.length}`, + error: DIMENSION_MISMATCH_ERROR, } } @@ -149,26 +156,36 @@ export function toSubmitElement( export function getVectorFieldInfo( raw: string, - vectorDim?: number, + vectorDim: number | undefined, + t: TFunction, ): VectorFieldInfo { if (!raw.trim()) { - return { text: DEFAULT_VECTOR_HELP_TEXT, isError: false } + return { text: t(DEFAULT_VECTOR_HELP_TEXT), isError: false } } const result = validateVector(raw, vectorDim) if (result.error) { - return { text: result.error, isError: true } + // A dimension mismatch carries a detected `kind`; static format errors + // don't. The mismatch text is interpolated; static errors are plain keys. + const text = + result.kind !== undefined + ? t('browser.vectorSet.form.dimensionMismatch', { + expected: vectorDim, + received: result.dim, + }) + : t(result.error as ParseKeys) + return { text, isError: true } } if (result.kind === 'fp32') { return { - text: `Detected FP32 vector (${result.dim} dimensions).`, + text: t('browser.vectorSet.form.detectedFp32', { dim: result.dim }), isError: false, } } return { - text: `Detected numeric vector (${result.dim} dimensions).`, + text: t('browser.vectorSet.form.detectedNumeric', { dim: result.dim }), isError: false, } } diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/VectorSetElementList.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/VectorSetElementList.tsx index 7b2ae3a2f9..051bc2c941 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/VectorSetElementList.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/VectorSetElementList.tsx @@ -1,5 +1,7 @@ -import React, { memo } from 'react' +import React, { memo, useMemo } from 'react' +import { ParseKeys } from 'i18next' +import { useTranslation } from 'uiSrc/i18n' import { useVectorSetElementListData } from '../hooks' import { TABLE_MIN_WIDTH, @@ -13,6 +15,7 @@ export interface Props { } const VectorSetElementList = memo(({ actionsConfig }: Props) => { + const { t } = useTranslation() const { meta, currentPageData, @@ -23,10 +26,20 @@ const VectorSetElementList = memo(({ actionsConfig }: Props) => { total, } = useVectorSetElementListData({ actionsConfig }) + const columns = useMemo( + () => + vectorSetColumns.map((col) => + typeof col.header === 'string' && col.header + ? { ...col, header: t(col.header as ParseKeys) } + : col, + ), + [t], + ) + return ( { + it('builds the test id from the raw name', () => { + render( + , + ) + + expect( + screen.getByTestId('vector-set-element-value-element-abc'), + ).toBeInTheDocument() + }) + + it('keeps the raw-name test id when the format renders JSX', () => { + render( + , + ) + + expect( + screen.getByTestId('vector-set-element-value-element-abc'), + ).toBeInTheDocument() + }) +}) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/ElementNameCell/ElementNameCell.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/ElementNameCell/ElementNameCell.tsx index e25f807928..4993994cfd 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/ElementNameCell/ElementNameCell.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/ElementNameCell/ElementNameCell.tsx @@ -1,11 +1,16 @@ import React from 'react' import { RedisResponseBuffer } from 'uiSrc/slices/interfaces' -import { createTooltipContent, formattingBuffer } from 'uiSrc/utils' +import { + bufferToString, + createTooltipContent, + formattingBuffer, +} from 'uiSrc/utils' import { TEXT_FAILED_CONVENT_FORMATTER } from 'uiSrc/constants' import { decompressingBuffer } from 'uiSrc/utils/decompressors' import { FormattedValue } from 'uiSrc/pages/browser/modules/key-details/shared' import { Row } from 'uiSrc/components/base/layout/flex' +import { useTranslation } from 'uiSrc/i18n' import { ElementNameCellProps } from '../../VectorSetElementList.types' export const ElementNameCell = ({ @@ -13,6 +18,7 @@ export const ElementNameCell = ({ compressor, viewFormat, }: ElementNameCellProps) => { + const { t } = useTranslation() const memberBuffer = element.name as RedisResponseBuffer const { value: decompressedItem } = decompressingBuffer( memberBuffer, @@ -31,15 +37,22 @@ export const ElementNameCell = ({ viewFormat, ) - const testIdSuffix = - typeof value === 'string' ? value?.substring(0, 200) : value + // Test ids must not depend on the view format: rich formats (Markdown, + // JSON) return JSX from formattingBuffer, not a string. + const testIdSuffix = bufferToString( + decompressedItem as RedisResponseBuffer, + ).substring(0, 200) return ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/RowActionsCell/RowActionsCell.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/RowActionsCell/RowActionsCell.tsx index fdafa539b9..3b5d17c7b9 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/RowActionsCell/RowActionsCell.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/components/RowActionsCell/RowActionsCell.tsx @@ -6,6 +6,7 @@ import { Row } from 'uiSrc/components/base/layout/flex' import { IconButton } from 'uiSrc/components/base/forms/buttons' import { SearchIcon } from 'uiSrc/components/base/icons' import { RiTooltip } from 'uiSrc/components' +import { useTranslation } from 'uiSrc/i18n' import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete' import { bufferToString, @@ -33,6 +34,7 @@ export const RowActionsCell = ({ viewFormat, testIdPrefix, }: RowActionsCellProps) => { + const { t } = useTranslation() const { name: nameBuffer } = target const { elementDeleteConfig, onViewElement, onSearchByElement } = actionsConfig @@ -57,14 +59,17 @@ export const RowActionsCell = ({ variant="primary-inline" color="informative400" > - View + {t('browser.vectorSet.list.viewAction')} - + onSearchByElement(target)} - aria-label="Find similar elements" + aria-label={t('browser.vectorSet.list.findSimilar')} data-testid={`${testIdPrefix}-search-similar-btn-${name}`} /> diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/constants.ts b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/constants.ts index 870661a1e2..3b413cb881 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/constants.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-element-list/constants.ts @@ -1,9 +1,11 @@ +import { ParseKeys } from 'i18next' import { VectorSetColumn } from './VectorSetElementList.types' export const DEFAULT_PAGE_SIZE = 10 +// Header values are i18n keys resolved with t() at render; Actions has no title. export const VECTOR_SET_COLUMN_HEADERS: Record = { - [VectorSetColumn.Name]: 'Element', + [VectorSetColumn.Name]: 'browser.vectorSet.list.elementColumn', [VectorSetColumn.Actions]: '', } @@ -20,8 +22,10 @@ export const MIN_COLUMN_WIDTH = 100 export const MIN_TABLE_WIDTH_FLOOR = 550 /** Empty-state messages shown in the element-list table. */ -export const ELEMENT_LIST_LOADING_MESSAGE = 'Loading...' -export const ELEMENT_LIST_EMPTY_MESSAGE = 'No results found.' +export const ELEMENT_LIST_LOADING_MESSAGE: ParseKeys = + 'browser.vectorSet.list.loading' +export const ELEMENT_LIST_EMPTY_MESSAGE: ParseKeys = + 'browser.vectorSet.list.empty' /** * Appended to a row id to scope the delete-confirmation popover to the diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-key-subheader/VectorSetKeySubheader.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-key-subheader/VectorSetKeySubheader.tsx index b0c21ef795..3326fffaac 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-key-subheader/VectorSetKeySubheader.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/vector-set-details/vector-set-key-subheader/VectorSetKeySubheader.tsx @@ -6,6 +6,7 @@ import { FlexItem, Row } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' import { KeyDetailsHeaderFormatter } from 'uiSrc/pages/browser/modules/key-details-header/components/key-details-header-formatter' import { AddItemsAction } from 'uiSrc/pages/browser/modules/key-details/components/key-details-actions' +import { useTranslation } from 'uiSrc/i18n' import { ClearResultsAction } from '../clear-results-action' import * as S from './VectorSetKeySubheader.styles' @@ -21,6 +22,7 @@ const VectorSetKeySubheader = ({ onClearResults, additionalActions, }: Props) => { + const { t } = useTranslation() return ( @@ -35,8 +37,14 @@ const VectorSetKeySubheader = ({ data-testid="vector-set-preview-summary" > {width > MIDDLE_SCREEN_RESOLUTION - ? `Previewing ${previewCount} out of ${total}` - : `${previewCount} out of ${total}`} + ? t('browser.vectorSet.subheader.previewingFull', { + count: previewCount, + total, + }) + : t('browser.vectorSet.subheader.previewingShort', { + count: previewCount, + total, + })} )} @@ -50,7 +58,7 @@ const VectorSetKeySubheader = ({ /> ) : ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/ZSetDetails.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/ZSetDetails.tsx index e45ec35a97..94af0ced52 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/ZSetDetails.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/ZSetDetails.tsx @@ -14,6 +14,7 @@ import AddZsetMembers from './add-zset-members/AddZsetMembers' import { AddItemsAction } from '../key-details-actions' import { KeyDetailsSubheader } from '../key-details-subheader/KeyDetailsSubheader' import { AddKeysContainer } from '../common/AddKeysContainer.styled' +import { useTranslation } from 'uiSrc/i18n' export interface Props extends KeyDetailsHeaderProps { onRemoveKey: () => void @@ -24,6 +25,7 @@ export interface Props extends KeyDetailsHeaderProps { const ZSetDetails = (props: Props) => { const keyType = KeyTypes.ZSet const { onRemoveKey, onOpenAddItemPanel, onCloseAddItemPanel } = props + const { t } = useTranslation() const { loading } = useAppSelector(selectedKeySelector) @@ -44,7 +46,7 @@ const ZSetDetails = (props: Props) => { const Actions = ({ width }: { width: number }) => ( diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/AddZsetMembers.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/AddZsetMembers.tsx index d9895defe9..86cdf4ba6a 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/AddZsetMembers.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/AddZsetMembers.tsx @@ -11,7 +11,7 @@ import { updateZsetScoreStateSelector, } from 'uiSrc/slices/browser/zset' -import { AddZsetFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' +import { getAddZsetFormConfig } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { INITIAL_ZSET_MEMBER_STATE, IZsetMemberState, @@ -30,6 +30,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import { EntryContent } from '../../common/AddKeysContainer.styled' @@ -39,6 +40,8 @@ export interface Props { const AddZsetMembers = (props: Props) => { const { closePanel } = props + const { t } = useTranslation() + const config = getAddZsetFormConfig(t) const dispatch = useAppDispatch() const [isFormValid, setIsFormValid] = useState(false) const [members, setMembers] = useState([ @@ -181,15 +184,11 @@ const AddZsetMembers = (props: Props) => { const handleSubmit = () => { requestConfirmation({ - title: 'Add members on production database?', - actionDescription: ( - <> - You are about to add {members.length} member - {members.length === 1 ? '' : 's'} to a sorted set on a production - database. - - ), - confirmButtonText: 'Add members', + title: t('browser.zset.add.confirmTitle'), + actionDescription: t('browser.zset.add.confirmMessage', { + count: members.length, + }), + confirmButtonText: t('browser.zset.add.confirmButton'), commandId: BrowserConfirmationCommandId.AddZsetMembers, disableConfirmationInput: true, onConfirm: submitData, @@ -258,7 +257,7 @@ const AddZsetMembers = (props: Props) => { onClick={() => closePanel(true)} data-testid="cancel-members-btn" > - Cancel + {t('browser.zset.add.cancel')}
    @@ -270,7 +269,7 @@ const AddZsetMembers = (props: Props) => { onClick={handleSubmit} data-testid="save-members-btn" > - Save + {t('browser.zset.add.save')}
    diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/zset-details-table/ZSetDetailsTable.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/zset-details-table/ZSetDetailsTable.tsx index 82a97031ac..8ed7804048 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/zset-details-table/ZSetDetailsTable.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/zset-details-table/ZSetDetailsTable.tsx @@ -23,9 +23,7 @@ import { KeyTypes, OVER_RENDER_BUFFER_COUNT, SortOrder, - TEXT_FAILED_CONVENT_FORMATTER, TableCellAlignment, - TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA, } from 'uiSrc/constants' import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api' import HelpTexts from 'uiSrc/constants/help-texts' @@ -72,6 +70,7 @@ import { import PopoverDelete from 'uiSrc/pages/browser/components/popover-delete/PopoverDelete' import { Text } from 'uiSrc/components/base/text' import { RiTooltip } from 'uiSrc/components' +import { useTranslation } from 'uiSrc/i18n' import { AddMembersToZSetDto, SearchZSetMembersResponse } from 'apiClient' import styles from './styles.module.scss' @@ -95,6 +94,7 @@ export interface Props { const ZSetDetailsTable = (props: Props) => { const { onRemoveKey } = props + const { t } = useTranslation() const { loading, searching } = useAppSelector(zsetSelector) const { loading: updateLoading } = useAppSelector( @@ -302,9 +302,9 @@ const ZSetDetailsTable = (props: Props) => { const columns: ITableColumn[] = [ { id: 'name', - label: 'Member', + label: t('browser.zset.column.member'), isSearchable: true, - prependSearchName: 'Member:', + prependSearchName: t('browser.zset.searchMemberPrefix'), initialSearchValue: '', truncateText: true, isResizable: true, @@ -349,8 +349,10 @@ const ZSetDetailsTable = (props: Props) => { expanded={expanded} title={ isValid - ? 'Member' - : TEXT_FAILED_CONVENT_FORMATTER(viewFormatProp) + ? t('browser.zset.column.member') + : t('browser.keyDetails.failedConvertFormatter', { + format: viewFormatProp, + }) } tooltipContent={tooltipContent} /> @@ -361,7 +363,7 @@ const ZSetDetailsTable = (props: Props) => { }, { id: 'score', - label: 'Score', + label: t('browser.zset.column.score'), minWidth: 154, isSortable: true, truncateText: true, @@ -377,13 +379,13 @@ const ZSetDetailsTable = (props: Props) => { const isTruncatedValue = isTruncatedString(nameItem) const isEditable = isNumber(score) && !isTruncatedValue const editToolTipContent = !isNumber(score) - ? 'Use CLI or Workbench to edit the score' - : TEXT_DISABLED_ACTION_WITH_TRUNCATED_DATA + ? t('browser.zset.scoreEditDisabledTooltip') + : t('browser.keyDetails.truncatedActionDisabled') return ( {
    {!expanded && ( { + const { t } = useTranslation() const isEmpty = command.length === 0 let displayText = command if (loading) { - displayText = LOADING_PLACEHOLDER + displayText = t('browser.keyDetails.commandPreview.building') } else if (isEmpty) { displayText = '' } return ( - - + + {displayText} ) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/command-preview/CommandPreview.types.ts b/redisinsight/ui/src/pages/browser/modules/key-details/shared/command-preview/CommandPreview.types.ts similarity index 75% rename from redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/command-preview/CommandPreview.types.ts rename to redisinsight/ui/src/pages/browser/modules/key-details/shared/command-preview/CommandPreview.types.ts index 91a40a6b19..85b0da8853 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/command-preview/CommandPreview.types.ts +++ b/redisinsight/ui/src/pages/browser/modules/key-details/shared/command-preview/CommandPreview.types.ts @@ -1,4 +1,5 @@ export interface CommandPreviewProps { command: string loading?: boolean + 'data-testid'?: string } diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/command-preview/index.ts b/redisinsight/ui/src/pages/browser/modules/key-details/shared/command-preview/index.ts similarity index 100% rename from redisinsight/ui/src/pages/browser/modules/key-details/components/array-details/command-preview/index.ts rename to redisinsight/ui/src/pages/browser/modules/key-details/shared/command-preview/index.ts diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-input/EditableInput.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-input/EditableInput.tsx index 1aaec5b1e3..253acea9dc 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-input/EditableInput.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-input/EditableInput.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react' import cx from 'classnames' import { RiTooltip } from 'uiSrc/components' +import { useTranslation } from 'uiSrc/i18n' import { StopPropagation } from 'uiSrc/components/virtual-table' import InlineItemEditor from 'uiSrc/components/inline-item-editor' import { Props as InlineItemEditorProps } from 'uiSrc/components/inline-item-editor/InlineItemEditor' @@ -49,6 +50,7 @@ const EditableInput = (props: Props) => { } = props const [isHovering, setIsHovering] = useState(false) + const { t } = useTranslation() const { requestConfirmation } = useProductionWriteConfirmation() if (!isEditing) { @@ -74,7 +76,7 @@ const EditableInput = (props: Props) => { > { @@ -107,10 +109,11 @@ const EditableInput = (props: Props) => { }} onApply={(value) => { requestConfirmation({ - title: 'Edit value on production database?', - actionDescription: - 'You are about to modify a value on a production database.', - confirmButtonText: 'Save', + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t( + 'browser.keyDetails.editable.confirmMessage', + ), + confirmButtonText: t('browser.keyDetails.editable.confirmButton'), commandId: BrowserConfirmationCommandId.EditValue, disableConfirmationInput: true, onConfirm: () => { diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-popover/EditablePopover.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-popover/EditablePopover.tsx index e072fe1375..0f7fafbf47 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-popover/EditablePopover.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-popover/EditablePopover.tsx @@ -14,6 +14,7 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -57,6 +58,7 @@ const EditablePopover = (props: Props) => { const [isHovering, setIsHovering] = useState(false) const [isPopoverOpen, setIsPopoverOpen] = useState(isOpen) const [isDelayed, setIsDelayed] = useState(false) + const { t } = useTranslation() const { requestConfirmation } = useProductionWriteConfirmation() const delayPopover = () => { @@ -89,10 +91,9 @@ const EditablePopover = (props: Props) => { const handleApply = (): void => { requestConfirmation({ - title: 'Edit value on production database?', - actionDescription: - 'You are about to modify a value on a production database.', - confirmButtonText: 'Save', + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t('browser.keyDetails.editable.confirmMessage'), + confirmButtonText: t('browser.keyDetails.editable.confirmButton'), commandId: BrowserConfirmationCommandId.EditValue, disableConfirmationInput: true, onConfirm: () => { @@ -123,7 +124,7 @@ const EditablePopover = (props: Props) => { {} : handleButtonClick} className={editBtnClassName} @@ -175,7 +176,7 @@ const EditablePopover = (props: Props) => { onClick={() => handleDecline()} data-testid="cancel-btn" > - Cancel + {t('browser.keyDetails.editable.cancelButton')} @@ -185,7 +186,7 @@ const EditablePopover = (props: Props) => { disabled={isDisabledApply()} data-testid="save-btn" > - Save + {t('browser.keyDetails.editable.saveButton')} diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.spec.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.spec.tsx index cd4c78b3bb..622711d761 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.spec.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.spec.tsx @@ -80,4 +80,41 @@ describe('EditableTextArea', () => { expect(onDecline).toBeCalled() }) + + it('should show the edit pencil on hover by default', () => { + render( + + + , + ) + + fireEvent.mouseEnter(screen.getByTestId('item_content-value-field')) + + expect(screen.getByTestId('item_edit-btn-field')).toBeInTheDocument() + }) + + it('should not render the edit pencil when hideEditButton is set', () => { + render( + + + , + ) + + fireEvent.mouseEnter(screen.getByTestId('item_content-value-field')) + + expect(screen.queryByTestId('item_edit-btn-field')).not.toBeInTheDocument() + }) }) diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.tsx b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.tsx index 7284abfd13..3b3cbf6ea0 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.tsx +++ b/redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.tsx @@ -13,6 +13,11 @@ import { BrowserConfirmationCommandId, useProductionWriteConfirmation, } from 'uiSrc/components/production-write-confirmation' +import { + NonUnicodeEditConfirmation, + useNonUnicodeEditGuard, +} from 'uiSrc/pages/browser/modules/key-details/shared/non-unicode-edit-confirmation' +import { useTranslation } from 'uiSrc/i18n' import styles from './styles.module.scss' export interface Props { @@ -28,6 +33,11 @@ export interface Props { disabledTooltipText?: { title: string; content: string } approveText?: { title: string; text: string } editToolTipContent?: React.ReactNode + /** Suppresses the built-in hover edit pencil (and the space reserved for + * it) in the non-editing state. Used where the edit trigger lives outside + * the cell (the array table drives editing from its actions column); + * defaults to false, so all other consumers are unchanged. */ + hideEditButton?: boolean approveByValidation?: (value: string) => boolean onEdit: (isEditing: boolean) => void onUpdateTextAreaHeight?: () => void @@ -51,6 +61,7 @@ const EditableTextArea = (props: Props) => { disabledTooltipText, approveText, editToolTipContent, + hideEditButton = false, approveByValidation = () => true, onEdit, onUpdateTextAreaHeight, @@ -63,7 +74,9 @@ const EditableTextArea = (props: Props) => { const [value, setValue] = useState('') const [isHovering, setIsHovering] = useState(false) const textAreaRef: Ref = useRef(null) + const { t } = useTranslation() const { requestConfirmation } = useProductionWriteConfirmation() + const editGuard = useNonUnicodeEditGuard() useEffect(() => { setValue(initialValue) @@ -93,7 +106,9 @@ const EditableTextArea = (props: Props) => { if (!isEditing) { return (
    setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} data-testid={`${testIdPrefix}_content-value-${field}`} @@ -105,25 +120,34 @@ const EditableTextArea = (props: Props) => { > {children} - {isHovering && ( - - { - e.stopPropagation() - onEdit?.(true) - setIsHovering(false) - }} - data-testid={`${testIdPrefix}_edit-btn-${field}`} - /> - + onCancel={editGuard.cancel} + onChangeToUnicode={editGuard.changeToUnicode} + onEditAnyway={editGuard.editAnyway} + button={ + + { + e.stopPropagation() + editGuard.requestEdit(() => onEdit?.(true)) + setIsHovering(false) + }} + data-testid={`${testIdPrefix}_edit-btn-${field}`} + /> + + } + /> )}
    ) @@ -134,7 +158,7 @@ const EditableTextArea = (props: Props) => { disableHeight onResize={() => setTimeout(updateTextAreaHeight, 0)} > - {({ width }) => ( + {({ width }: { width: number }) => (
    { }} onApply={() => { requestConfirmation({ - title: 'Edit value on production database?', - actionDescription: - 'You are about to modify a value on a production database.', - confirmButtonText: 'Save', + title: t('browser.keyDetails.editable.confirmTitle'), + actionDescription: t( + 'browser.keyDetails.editable.confirmMessage', + ), + confirmButtonText: t( + 'browser.keyDetails.editable.confirmButton', + ), commandId: BrowserConfirmationCommandId.EditValue, disableConfirmationInput: true, onConfirm: () => { @@ -177,7 +204,7 @@ const EditableTextArea = (props: Props) => {