From 0e837aa3237cd1e460dad9e58883913612bdb824 Mon Sep 17 00:00:00 2001 From: Em Shotton <10514138+emshotton@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:01:49 -0700 Subject: [PATCH 1/4] Fix 22 verified bugs and migrate to TypeScript with modernized toolchain Bug fixes (each with a regression test; 34 tests added, 61 -> 95): - playbackRate/volume setters now match nodes via instanceof MediaNode (minification-safe, covers AudioNode and custom subclasses) - audio() passes the real element cache instead of a never-assigned field - ProcessingNode binds Image-property samplers with the 0-based texture unit index instead of the TEXTURE0 enum - RenderGraph places index-connections on the port matching their zIndex - SourceNode._seek updates the clock before the waiting-state early return - new VideoContext.destroy() + UpdateablesManager.unregister() fix the permanent retention of every context by the module-level update loop - ProcessingNode.destroy() no longer clobbers its main output texture; also deletes the vertex buffer - ImageNode TYPE corrected from copy-pasted "CanvasNode"; user-supplied elements no longer crash _load and become ready; static image textures upload once instead of every frame - durationchange no longer re-fires every frame for endless sources - snapshot() records true input port indexes; element.onerror cleared on unload; destroyed nodes refuse start(); paused nodes unload on end; reset() clears callbacks before firing updates; unknown named ports on unlimited nodes throw; update loop starts without Worker/visibility API - exceptions are real Error subclasses; shader failures throw them TypeScript & toolchain migration: - all of src/ converted to strict TypeScript; tsc type-checks and emits declarations, Babel 7 (+preset-typescript) transpiles - 44 .frag/.vert shader files inlined as template literals (removes raw-loader, per-definition package.json stubs, and the jest glsl mock) - Jest 29 aligned (drops jest-cli 23 / babel-jest 23; explicit jsdom), ESLint 8 + @typescript-eslint, Prettier 3, TypeDoc replaces jsdoc, husky removed, CI on Node 20 with a typecheck step - packaging: UMD (main, unchanged path), per-module ESM (module/exports, sideEffects: false), generated .d.ts (types); zero runtime deps; browserslist "defaults" (drops IE11) Co-Authored-By: Claude Fable 5 --- .babelrc | 8 - .eslintrc.json | 48 +- .github/workflows/build.yaml | 3 +- .prettierrc | 4 +- babel.config.js | 15 + build-docs.sh | 3 +- ...26-08-14-typescript-toolchain-migration.md | 155 + ...4-typescript-toolchain-migration-design.md | 126 + jsdoc.json | 24 - package.json | 66 +- .../aaf_video_crop/aaf_video_crop.frag | 15 - .../aaf_video_crop/aaf_video_crop.js | 18 - .../aaf_video_crop/aaf_video_crop.vert | 7 - src/Definitions/aaf_video_crop/index.ts | 41 + src/Definitions/aaf_video_crop/package.json | 6 - .../aaf_video_flip/aaf_video_flip.frag | 8 - .../aaf_video_flip/aaf_video_flip.js | 13 - .../aaf_video_flip/aaf_video_flip.vert | 7 - src/Definitions/aaf_video_flip/index.ts | 29 + src/Definitions/aaf_video_flip/package.json | 6 - .../aaf_video_flop/aaf_video_flop.frag | 8 - .../aaf_video_flop/aaf_video_flop.js | 13 - .../aaf_video_flop/aaf_video_flop.vert | 7 - src/Definitions/aaf_video_flop/index.ts | 29 + src/Definitions/aaf_video_flop/package.json | 6 - .../aaf_video_position.frag | 14 - .../aaf_video_position/aaf_video_position.js | 16 - .../aaf_video_position.vert | 7 - src/Definitions/aaf_video_position/index.ts | 38 + .../aaf_video_position/package.json | 6 - .../aaf_video_scale/aaf_video_scale.frag | 14 - .../aaf_video_scale/aaf_video_scale.js | 16 - .../aaf_video_scale/aaf_video_scale.vert | 7 - src/Definitions/aaf_video_scale/index.ts | 38 + src/Definitions/aaf_video_scale/package.json | 6 - .../colorThreshold/colorThreshold.frag | 13 - .../colorThreshold/colorThreshold.js | 16 - .../colorThreshold/colorThreshold.vert | 7 - src/Definitions/colorThreshold/index.ts | 37 + src/Definitions/colorThreshold/package.json | 6 - src/Definitions/combine/combine.frag | 9 - src/Definitions/combine/combine.js | 16 - src/Definitions/combine/combine.vert | 7 - src/Definitions/combine/index.ts | 33 + src/Definitions/combine/package.json | 6 - src/Definitions/crop/crop.frag | 16 - src/Definitions/crop/crop.js | 18 - src/Definitions/crop/crop.vert | 7 - src/Definitions/crop/index.ts | 42 + src/Definitions/crop/package.json | 6 - src/Definitions/crossfade/crossfade.frag | 19 - src/Definitions/crossfade/crossfade.js | 15 - src/Definitions/crossfade/crossfade.vert | 7 - src/Definitions/crossfade/index.ts | 42 + src/Definitions/crossfade/package.json | 6 - src/Definitions/definitions.js | 47 - src/Definitions/definitions.ts | 47 + src/Definitions/dreamfade/dreamfade.js | 15 - src/Definitions/dreamfade/dreamfade.vert | 7 - .../dreamfade/{dreamfade.frag => index.ts} | 27 +- src/Definitions/dreamfade/package.json | 6 - .../horizontalBlur/horizontalBlur.frag | 22 - .../horizontalBlur/horizontalBlur.js | 16 - .../horizontalBlur/horizontalBlur.vert | 23 - src/Definitions/horizontalBlur/index.ts | 62 + src/Definitions/horizontalBlur/package.json | 6 - .../horizontalWipe/horizontalWipe.frag | 15 - .../horizontalWipe/horizontalWipe.js | 15 - .../horizontalWipe/horizontalWipe.vert | 7 - src/Definitions/horizontalWipe/index.ts | 38 + src/Definitions/horizontalWipe/package.json | 6 - src/Definitions/monochrome/index.ts | 39 + src/Definitions/monochrome/monochrome.frag | 14 - src/Definitions/monochrome/monochrome.js | 17 - src/Definitions/monochrome/monochrome.vert | 7 - src/Definitions/monochrome/package.json | 6 - src/Definitions/opacity/index.ts | 33 + src/Definitions/opacity/opacity.frag | 10 - src/Definitions/opacity/opacity.js | 15 - src/Definitions/opacity/opacity.vert | 7 - src/Definitions/opacity/package.json | 6 - src/Definitions/randomDissolve/index.ts | 41 + src/Definitions/randomDissolve/package.json | 6 - .../randomDissolve/randomDissolve.frag | 18 - .../randomDissolve/randomDissolve.js | 15 - .../randomDissolve/randomDissolve.vert | 7 - .../starWipe/{starWipe.frag => index.ts} | 27 +- src/Definitions/starWipe/package.json | 6 - src/Definitions/starWipe/starWipe.js | 15 - src/Definitions/starWipe/starWipe.vert | 7 - src/Definitions/staticDissolve/index.ts | 42 + src/Definitions/staticDissolve/package.json | 6 - .../staticDissolve/staticDissolve.frag | 19 - .../staticDissolve/staticDissolve.js | 15 - .../staticDissolve/staticDissolve.vert | 7 - src/Definitions/staticEffect/index.ts | 40 + src/Definitions/staticEffect/package.json | 6 - .../staticEffect/staticEffect.frag | 16 - src/Definitions/staticEffect/staticEffect.js | 16 - .../staticEffect/staticEffect.vert | 7 - src/Definitions/toColorAndBackFade/index.ts | 41 + .../toColorAndBackFade/package.json | 6 - .../toColorAndBackFade.frag | 17 - .../toColorAndBackFade/toColorAndBackFade.js | 16 - .../toColorAndBackFade.vert | 7 - src/Definitions/verticalBlur/index.ts | 62 + src/Definitions/verticalBlur/package.json | 6 - .../verticalBlur/verticalBlur.frag | 22 - src/Definitions/verticalBlur/verticalBlur.js | 16 - .../verticalBlur/verticalBlur.vert | 23 - src/Definitions/verticalWipe/index.ts | 38 + src/Definitions/verticalWipe/package.json | 6 - .../verticalWipe/verticalWipe.frag | 15 - src/Definitions/verticalWipe/verticalWipe.js | 15 - .../verticalWipe/verticalWipe.vert | 7 - src/DestinationNode/destinationnode.frag | 7 - ...{destinationnode.js => destinationnode.ts} | 38 +- src/DestinationNode/destinationnode.vert | 7 - ...{compositingnode.js => compositingnode.ts} | 24 +- .../{effectnode.js => effectnode.ts} | 31 +- .../{processingnode.js => processingnode.ts} | 155 +- .../{transitionnode.js => transitionnode.ts} | 90 +- .../{audionode.js => audionode.ts} | 11 +- .../{canvasnode.js => canvasnode.ts} | 26 +- src/SourceNodes/imagenode.js | 131 - src/SourceNodes/imagenode.ts | 161 + .../{medianode.js => medianode.ts} | 133 +- src/SourceNodes/nodes.js | 17 - src/SourceNodes/nodes.ts | 17 + .../{sourcenode.js => sourcenode.ts} | 176 +- .../{videonode.js => videonode.ts} | 8 +- src/exceptions.js | 10 - src/exceptions.ts | 19 + src/{graphnode.js => graphnode.ts} | 60 +- src/{rendergraph.js => rendergraph.ts} | 148 +- src/types.ts | 26 + src/{utils.js => utils.ts} | 554 +- src/{videocontext.js => videocontext.ts} | 516 +- ...eoelementcache.js => videoelementcache.ts} | 36 +- ...tcacheitem.js => videoelementcacheitem.ts} | 24 +- test/__mocks__/glsl.js | 2 - test/cypress/integration/transitions.spec.js | 34 +- test/integration/medianode.test.js | 86 +- test/integration/sourcenode.test.js | 42 +- test/integration/videocontext.test.js | 107 +- test/unit/exceptions.spec.js | 23 + test/unit/graphnode.spec.js | 12 +- test/unit/imagenode.spec.js | 86 + test/unit/processingnode.spec.js | 77 + test/unit/rendergraph.spec.js | 45 + test/unit/sourcenode.spec.js | 28 + test/unit/utils.spec.js | 81 + tsconfig.build.json | 9 + tsconfig.json | 15 + webpack.commonjs2.config.js | 22 +- webpack.config.js | 25 +- yarn.lock | 6853 +++++++---------- 157 files changed, 6006 insertions(+), 6247 deletions(-) delete mode 100644 .babelrc create mode 100644 babel.config.js create mode 100644 docs/superpowers/plans/2026-08-14-typescript-toolchain-migration.md create mode 100644 docs/superpowers/specs/2026-08-14-typescript-toolchain-migration-design.md delete mode 100644 jsdoc.json delete mode 100644 src/Definitions/aaf_video_crop/aaf_video_crop.frag delete mode 100644 src/Definitions/aaf_video_crop/aaf_video_crop.js delete mode 100644 src/Definitions/aaf_video_crop/aaf_video_crop.vert create mode 100644 src/Definitions/aaf_video_crop/index.ts delete mode 100644 src/Definitions/aaf_video_crop/package.json delete mode 100644 src/Definitions/aaf_video_flip/aaf_video_flip.frag delete mode 100644 src/Definitions/aaf_video_flip/aaf_video_flip.js delete mode 100644 src/Definitions/aaf_video_flip/aaf_video_flip.vert create mode 100644 src/Definitions/aaf_video_flip/index.ts delete mode 100644 src/Definitions/aaf_video_flip/package.json delete mode 100644 src/Definitions/aaf_video_flop/aaf_video_flop.frag delete mode 100644 src/Definitions/aaf_video_flop/aaf_video_flop.js delete mode 100644 src/Definitions/aaf_video_flop/aaf_video_flop.vert create mode 100644 src/Definitions/aaf_video_flop/index.ts delete mode 100644 src/Definitions/aaf_video_flop/package.json delete mode 100644 src/Definitions/aaf_video_position/aaf_video_position.frag delete mode 100644 src/Definitions/aaf_video_position/aaf_video_position.js delete mode 100644 src/Definitions/aaf_video_position/aaf_video_position.vert create mode 100644 src/Definitions/aaf_video_position/index.ts delete mode 100644 src/Definitions/aaf_video_position/package.json delete mode 100644 src/Definitions/aaf_video_scale/aaf_video_scale.frag delete mode 100644 src/Definitions/aaf_video_scale/aaf_video_scale.js delete mode 100644 src/Definitions/aaf_video_scale/aaf_video_scale.vert create mode 100644 src/Definitions/aaf_video_scale/index.ts delete mode 100644 src/Definitions/aaf_video_scale/package.json delete mode 100644 src/Definitions/colorThreshold/colorThreshold.frag delete mode 100644 src/Definitions/colorThreshold/colorThreshold.js delete mode 100644 src/Definitions/colorThreshold/colorThreshold.vert create mode 100644 src/Definitions/colorThreshold/index.ts delete mode 100644 src/Definitions/colorThreshold/package.json delete mode 100644 src/Definitions/combine/combine.frag delete mode 100644 src/Definitions/combine/combine.js delete mode 100644 src/Definitions/combine/combine.vert create mode 100644 src/Definitions/combine/index.ts delete mode 100644 src/Definitions/combine/package.json delete mode 100644 src/Definitions/crop/crop.frag delete mode 100644 src/Definitions/crop/crop.js delete mode 100644 src/Definitions/crop/crop.vert create mode 100644 src/Definitions/crop/index.ts delete mode 100644 src/Definitions/crop/package.json delete mode 100644 src/Definitions/crossfade/crossfade.frag delete mode 100644 src/Definitions/crossfade/crossfade.js delete mode 100644 src/Definitions/crossfade/crossfade.vert create mode 100644 src/Definitions/crossfade/index.ts delete mode 100644 src/Definitions/crossfade/package.json delete mode 100644 src/Definitions/definitions.js create mode 100644 src/Definitions/definitions.ts delete mode 100644 src/Definitions/dreamfade/dreamfade.js delete mode 100644 src/Definitions/dreamfade/dreamfade.vert rename src/Definitions/dreamfade/{dreamfade.frag => index.ts} (50%) delete mode 100644 src/Definitions/dreamfade/package.json delete mode 100644 src/Definitions/horizontalBlur/horizontalBlur.frag delete mode 100644 src/Definitions/horizontalBlur/horizontalBlur.js delete mode 100644 src/Definitions/horizontalBlur/horizontalBlur.vert create mode 100644 src/Definitions/horizontalBlur/index.ts delete mode 100644 src/Definitions/horizontalBlur/package.json delete mode 100644 src/Definitions/horizontalWipe/horizontalWipe.frag delete mode 100644 src/Definitions/horizontalWipe/horizontalWipe.js delete mode 100644 src/Definitions/horizontalWipe/horizontalWipe.vert create mode 100644 src/Definitions/horizontalWipe/index.ts delete mode 100644 src/Definitions/horizontalWipe/package.json create mode 100644 src/Definitions/monochrome/index.ts delete mode 100644 src/Definitions/monochrome/monochrome.frag delete mode 100644 src/Definitions/monochrome/monochrome.js delete mode 100644 src/Definitions/monochrome/monochrome.vert delete mode 100644 src/Definitions/monochrome/package.json create mode 100644 src/Definitions/opacity/index.ts delete mode 100644 src/Definitions/opacity/opacity.frag delete mode 100644 src/Definitions/opacity/opacity.js delete mode 100644 src/Definitions/opacity/opacity.vert delete mode 100644 src/Definitions/opacity/package.json create mode 100644 src/Definitions/randomDissolve/index.ts delete mode 100644 src/Definitions/randomDissolve/package.json delete mode 100644 src/Definitions/randomDissolve/randomDissolve.frag delete mode 100644 src/Definitions/randomDissolve/randomDissolve.js delete mode 100644 src/Definitions/randomDissolve/randomDissolve.vert rename src/Definitions/starWipe/{starWipe.frag => index.ts} (83%) delete mode 100644 src/Definitions/starWipe/package.json delete mode 100644 src/Definitions/starWipe/starWipe.js delete mode 100644 src/Definitions/starWipe/starWipe.vert create mode 100644 src/Definitions/staticDissolve/index.ts delete mode 100644 src/Definitions/staticDissolve/package.json delete mode 100644 src/Definitions/staticDissolve/staticDissolve.frag delete mode 100644 src/Definitions/staticDissolve/staticDissolve.js delete mode 100644 src/Definitions/staticDissolve/staticDissolve.vert create mode 100644 src/Definitions/staticEffect/index.ts delete mode 100644 src/Definitions/staticEffect/package.json delete mode 100644 src/Definitions/staticEffect/staticEffect.frag delete mode 100644 src/Definitions/staticEffect/staticEffect.js delete mode 100644 src/Definitions/staticEffect/staticEffect.vert create mode 100644 src/Definitions/toColorAndBackFade/index.ts delete mode 100644 src/Definitions/toColorAndBackFade/package.json delete mode 100644 src/Definitions/toColorAndBackFade/toColorAndBackFade.frag delete mode 100644 src/Definitions/toColorAndBackFade/toColorAndBackFade.js delete mode 100644 src/Definitions/toColorAndBackFade/toColorAndBackFade.vert create mode 100644 src/Definitions/verticalBlur/index.ts delete mode 100644 src/Definitions/verticalBlur/package.json delete mode 100644 src/Definitions/verticalBlur/verticalBlur.frag delete mode 100644 src/Definitions/verticalBlur/verticalBlur.js delete mode 100644 src/Definitions/verticalBlur/verticalBlur.vert create mode 100644 src/Definitions/verticalWipe/index.ts delete mode 100644 src/Definitions/verticalWipe/package.json delete mode 100644 src/Definitions/verticalWipe/verticalWipe.frag delete mode 100644 src/Definitions/verticalWipe/verticalWipe.js delete mode 100644 src/Definitions/verticalWipe/verticalWipe.vert delete mode 100644 src/DestinationNode/destinationnode.frag rename src/DestinationNode/{destinationnode.js => destinationnode.ts} (53%) delete mode 100644 src/DestinationNode/destinationnode.vert rename src/ProcessingNodes/{compositingnode.js => compositingnode.ts} (66%) rename src/ProcessingNodes/{effectnode.js => effectnode.ts} (61%) rename src/ProcessingNodes/{processingnode.js => processingnode.ts} (60%) rename src/ProcessingNodes/{transitionnode.js => transitionnode.ts} (64%) rename src/SourceNodes/{audionode.js => audionode.ts} (64%) rename src/SourceNodes/{canvasnode.js => canvasnode.ts} (75%) delete mode 100644 src/SourceNodes/imagenode.js create mode 100644 src/SourceNodes/imagenode.ts rename src/SourceNodes/{medianode.js => medianode.ts} (69%) delete mode 100644 src/SourceNodes/nodes.js create mode 100644 src/SourceNodes/nodes.ts rename src/SourceNodes/{sourcenode.js => sourcenode.ts} (70%) rename src/SourceNodes/{videonode.js => videonode.ts} (69%) delete mode 100644 src/exceptions.js create mode 100644 src/exceptions.ts rename src/{graphnode.js => graphnode.ts} (63%) rename src/{rendergraph.js => rendergraph.ts} (59%) create mode 100644 src/types.ts rename src/{utils.js => utils.ts} (52%) rename src/{videocontext.js => videocontext.ts} (69%) rename src/{videoelementcache.js => videoelementcache.ts} (71%) rename src/{videoelementcacheitem.js => videoelementcacheitem.ts} (64%) delete mode 100644 test/__mocks__/glsl.js create mode 100644 test/unit/exceptions.spec.js create mode 100644 test/unit/imagenode.spec.js create mode 100644 test/unit/processingnode.spec.js create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 1d682055..00000000 --- a/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "presets": [ - "env" - ], - "plugins": [ - "add-module-exports" - ] -} diff --git a/.eslintrc.json b/.eslintrc.json index 70142cfa..f4eb7570 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,36 +1,38 @@ { + "root": true, "plugins": ["cypress"], "env": { "browser": true, - "es6": true, + "es2021": true, "jest": true, "cypress/globals": true }, - "extends": "eslint:recommended", + "extends": ["eslint:recommended", "prettier"], "parserOptions": { "sourceType": "module", - "ecmaVersion": 2017 + "ecmaVersion": 2021 }, "rules": { - "indent": [ - "error", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double", - { - "allowTemplateLiterals": true - } - ], - "semi": [ - "error", - "always" - ], "no-console": 0 - } + }, + "overrides": [ + { + "files": ["src/**/*.ts"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "rules": { + "no-console": 0, + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { "argsIgnorePattern": "^_" } + ] + } + } + ] } diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 93cc54b1..68917539 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -20,10 +20,11 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: '18.x' + node-version: '20.x' cache: 'yarn' - run: yarn install --frozen-lockfile - run: yarn lint + - run: yarn typecheck - run: yarn ${{ matrix.test-suite }} - run: yarn build diff --git a/.prettierrc b/.prettierrc index 6a14fce2..4e2e35dd 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,6 +5,6 @@ "singleQuote": false, "trailingComma": "none", "bracketSpacing": true, - "parser": "babylon", - "semi": true + "semi": true, + "arrowParens": "avoid" } diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..deb4c4b2 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,15 @@ +/* eslint-env node */ +module.exports = { + presets: [ + "@babel/preset-env", + ["@babel/preset-typescript", { allowDeclareFields: true }] + ], + env: { + esm: { + presets: [ + ["@babel/preset-env", { modules: false }], + ["@babel/preset-typescript", { allowDeclareFields: true }] + ] + } + } +}; diff --git a/build-docs.sh b/build-docs.sh index cf332d73..1c708c38 100644 --- a/build-docs.sh +++ b/build-docs.sh @@ -1,11 +1,12 @@ set -o monitor echo "Generating API docs from code" -./node_modules/.bin/jsdoc -c jsdoc.json +./node_modules/.bin/typedoc --out docs/api src/videocontext.ts echo "Making fresh build to use in examples" yarn build echo "Copying build into docs dist" +mkdir -p docs/dist cp dist/videocontext.* docs/dist/ echo "Docs now ready for github pages deploy" diff --git a/docs/superpowers/plans/2026-08-14-typescript-toolchain-migration.md b/docs/superpowers/plans/2026-08-14-typescript-toolchain-migration.md new file mode 100644 index 00000000..d2ce7f49 --- /dev/null +++ b/docs/superpowers/plans/2026-08-14-typescript-toolchain-migration.md @@ -0,0 +1,155 @@ +# TypeScript & Toolchain Migration Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Convert `src/` to strict TypeScript on a modern Babel 7 / Jest 29 / ESLint 8 / Prettier 3 toolchain, shipping UMD + ESM + `.d.ts` outputs with zero public-API change. + +**Architecture:** Toolchain lands first with source still JS (isolating toolchain risk); files then convert bottom-up along the dependency graph with the 95-test suite as the behavioral contract after every step. Babel transpiles; `tsc` only type-checks and emits declarations. Shaders inline as template literals during conversion, which is what makes the plain-Babel ESM build possible. + +**Tech Stack:** TypeScript ~5.x, @babel/preset-{env,typescript}, webpack 5 (UMD), Jest 29 + jest-environment-jsdom, ESLint 8 + @typescript-eslint v8, Prettier 3, TypeDoc. + +**Spec:** `docs/superpowers/specs/2026-08-14-typescript-toolchain-migration-design.md` + +## Global Constraints + +- Public API unchanged; all 95 existing Jest tests must pass after every task. +- Tests remain JavaScript; only `src/` converts. +- Browser targets: `browserslist: ["defaults"]` (IE11 dropped) — classes are NOT transpiled, so `class extends Error` is safe. +- Prettier style preserved: 4-space indent, printWidth 100, double quotes, `trailingComma: "none"`, `arrowParens: "avoid"`. +- Internal import specifiers: explicit `./name.js` (or `./dir/index.js`) everywhere in `src/`. +- Cypress stack untouched. No git commits (user has not requested them); the gate after each task is the full verification command set. +- Verification command per task (referred to below as **GATE**): + `npx jest test/unit/*.js test/integration/*.js && npx eslint 'src/**/*.{js,ts}' 'test/**/*.js' && npx tsc --noEmit` (tsc from Task 2 onward) — expect 95 passed, 0 lint errors, 0 type errors. + +--- + +### Task 1: Toolchain swap (source stays JS) + +**Files:** +- Modify: `package.json` (devDependencies, scripts, jest config) +- Create: `babel.config.js`; Delete: `.babelrc` +- Modify: `.eslintrc`, `.prettierrc`, `webpack.config.js`, `webpack.commonjs2.config.js` + +**Interfaces:** Produces a working Babel 7 pipeline consumed by every later task (babel-jest via `babel.config.js`, babel-loader via webpack). + +- [ ] Remove devDeps: `babel-cli babel-core babel-jest babel-loader babel-plugin-add-module-exports babel-preset-env eslint eslint-loader husky jest-cli jsdoc prettier`; remove dependency `regenerator-runtime` (grep-verified unused). Add devDeps: `@babel/core @babel/cli @babel/preset-env @babel/preset-typescript babel-loader@^9 babel-jest@^29 jest@^29 jest-environment-jsdom@^29 eslint@^8 @typescript-eslint/parser@^8 @typescript-eslint/eslint-plugin@^8 eslint-config-prettier prettier@^3 typescript typedoc`. Keep `eslint-plugin-cypress`, `webpack`, `webpack-cli`, `raw-loader` (until Task 5), `sinon`, `webgl-mock`, cypress stack. +- [ ] `babel.config.js`: +```js +/* eslint-env node */ +module.exports = { + presets: ["@babel/preset-env", "@babel/preset-typescript"], + env: { + esm: { + presets: [["@babel/preset-env", { modules: false }], "@babel/preset-typescript"] + } + } +}; +``` +- [ ] package.json jest block: add `"testEnvironment": "jsdom"`, `"moduleFileExtensions": ["ts", "js"]`; keep glsl moduleNameMapper (until Task 5) and testMatch. +- [ ] `.eslintrc`: `extends: ["eslint:recommended", "prettier"]`, env `es2021`, `parserOptions.ecmaVersion: 2021`, keep `no-console: 0` and cypress plugin/globals; add TS override: +```json +{ + "files": ["src/**/*.ts"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "rules": { "no-console": 0, "@typescript-eslint/no-explicit-any": "off" } +} +``` +- [ ] `.prettierrc`: drop `"parser": "babylon"`, add `"arrowParens": "avoid"`; rest unchanged. +- [ ] `webpack.config.js`: drop `eslint-loader` and the dead `style!css` rule; `resolve: { extensions: [".ts", ".js"] }`; `.ts` added to the babel-loader test; `output.library: { name: "VideoContext", type: "umd", export: "default" }` (replaces add-module-exports behavior). Mirror in `webpack.commonjs2.config.js`. +- [ ] Scripts: remove `precommit`; add `"typecheck": "tsc --noEmit"` (activates Task 2); `"browserslist": ["defaults"]` in package.json. +- [ ] Reinstall (`yarn install`), run **GATE** (minus tsc), run `npx webpack`, then smoke: `node -e "const VC=require('./dist/videocontext.js'); if(typeof VC!=='function') throw new Error('not a class')"`. + +### Task 2: tsconfig + shared types + leaf conversions + +**Files:** +- Create: `tsconfig.json`, `tsconfig.build.json`, `src/types.ts` +- Rename+convert: `src/exceptions.js→.ts`, `src/graphnode.js→.ts`, `src/rendergraph.js→.ts` + +**Interfaces:** Produces `IDefinition`, `IDefinitionProperty`, `PropertyValue` (types.ts) consumed by all processing-node tasks; `ConnectException`/`RenderException` become `class … extends Error` (unit tests already lock `instanceof Error`, `.name`, `.message`, `.stack`). + +- [ ] `tsconfig.json`: `target es2019`, `lib ["dom","es2019"]`, `module esnext`, `moduleResolution bundler`, `strict true`, `noEmit true`, `esModuleInterop true`, `skipLibCheck true`, include `src/**/*.ts`. `tsconfig.build.json` extends it with `noEmit false, emitDeclarationOnly true, declaration true, declarationDir "dist/types"`. +- [ ] `src/types.ts`: +```ts +export type PropertyValue = number | number[] | HTMLImageElement; +export interface IDefinitionProperty { + type: string; + value: PropertyValue; +} +export interface IDefinition { + title?: string; + description?: string; + vertexShader: string; + fragmentShader: string; + properties: Record; + inputs: string[]; +} +``` +- [ ] Conversion recipe (applies to every file in Tasks 2–6): rename `.js→.ts`; type constructor params/fields; keep runtime behavior byte-identical; normalize internal imports to explicit `./x.js`; fix JSDoc typos in carried-over comments; run **GATE** after each file. +- [ ] Convert the three files; `exceptions.ts` uses real `class extends Error` with `this.name` set in constructor. + +### Task 3: Source-node family + +**Files:** Rename+convert `src/SourceNodes/{sourcenode,medianode,videonode,audionode,imagenode,canvasnode,nodes}.js→.ts`, `src/videoelementcacheitem.js→.ts`, `src/videoelementcache.js→.ts` + +**Interfaces:** `SourceNode` exposes `_element?: HTMLVideoElement | HTMLAudioElement | HTMLImageElement | HTMLCanvasElement | ImageBitmap`, `_state: number` (SOURCENODESTATE const object), `_startTime/_stopTime: number`. `MediaNode` generic optional — prefer simple union typing over redesign. + +- [ ] Convert bottom-up: sourcenode → medianode → video/audio/canvas/image nodes → nodes.ts → cacheitem → cache. `SOURCENODESTATE` becomes `const STATE = {...} as const`. GATE after each. + +### Task 4: Processing-node family + +**Files:** Rename+convert `src/ProcessingNodes/{processingnode,effectnode,transitionnode,compositingnode}.js→.ts`, `src/DestinationNode/destinationnode.js→.ts`; Delete `src/DestinationNode/destinationnode.{frag,vert}` (inline as template literals). + +**Interfaces:** `ProcessingNode` constructor takes `(gl: WebGLRenderingContext, renderGraph: RenderGraph, definition: IDefinition, inputNames: string[], limitConnections: boolean)`. Dynamic shader properties accessed via `(this as any)[propertyName]`; `_isTextureCleared` expando typed via `interface ManagedTexture extends WebGLTexture { _isTextureCleared?: boolean }` in utils. + +- [ ] Convert processingnode first, then subclasses; inline destinationnode's two shaders as exported consts in the same file; GATE after each. + +### Task 5: Definitions (scripted) + raw-loader removal + +**Files:** For each of the 22 dirs in `src/Definitions/`: create `/index.ts` (typed `IDefinition`, shaders inlined byte-identical, backslash/backtick/`${` escaped), delete `/{*.js,*.frag,*.vert,package.json}`. Convert `src/Definitions/definitions.js→.ts` importing `.//index.js`. Delete `test/__mocks__/glsl.js`, the jest `moduleNameMapper`, and the `raw-loader` devDep + webpack rule. + +- [ ] Write the conversion script in the scratchpad (not the repo), run it, eyeball two generated files against originals, GATE. + +### Task 6: utils + videocontext + +**Files:** Rename+convert `src/utils.js→.ts`, `src/videocontext.js→.ts`. + +**Interfaces:** `VideoContext` default export unchanged; statics (`STATE`, `EVENTS`, `DEFINITIONS`, `NODES`, visualise helpers) preserved. This is the heavy JSDoc-typo file — sweep while carrying comments. + +- [ ] Convert utils.ts then videocontext.ts; GATE. + +### Task 7: Packaging + +**Files:** Modify `package.json` (entry fields + build scripts). + +- [ ] Add: +```json +"main": "dist/videocontext.js", +"module": "dist/esm/videocontext.js", +"types": "dist/types/videocontext.d.ts", +"exports": { + ".": { + "types": "./dist/types/videocontext.d.ts", + "import": "./dist/esm/videocontext.js", + "require": "./dist/videocontext.js", + "default": "./dist/videocontext.js" + } +}, +"sideEffects": false +``` +- [ ] Scripts: `"build": "yarn build:umd && yarn build:esm && yarn build:types"`, `"build:umd": "webpack --config webpack.config.js"`, `"build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions \".ts\" --source-maps"`, `"build:types": "tsc -p tsconfig.build.json"`. +- [ ] Run all three builds. Smoke: UMD `require` returns a function; `node --input-type=module -e "import('./dist/esm/videocontext.js').then(m=>{if(typeof m.default!=='function')throw new Error('bad esm')})"` (import parse may touch DOM-free module scope only — expected to pass since module top-level has no DOM access). + +### Task 8: Docs + CI + +**Files:** Modify `build-docs.sh`, `package.json` docs script, `.github/workflows/build.yaml`. + +- [ ] `"docs": "typedoc --out docs src/videocontext.ts"` (build-docs.sh reduced to that call or deleted with script updated); verify TypeDoc runs clean. +- [ ] CI: `node-version: '20.x'`; insert `- run: yarn typecheck` before the test step. Cypress matrix entry untouched. + +### Task 9: Final verification + +- [ ] `npx prettier --write 'src/**/*.ts' 'test/**/*.js'` then `--list-different` clean. +- [ ] Full **GATE** + all three builds + both smokes + `git status` review of the complete diff. +- [ ] Report: test count, type-check status, build outputs, and any behavior notes. diff --git a/docs/superpowers/specs/2026-08-14-typescript-toolchain-migration-design.md b/docs/superpowers/specs/2026-08-14-typescript-toolchain-migration-design.md new file mode 100644 index 00000000..5ef91903 --- /dev/null +++ b/docs/superpowers/specs/2026-08-14-typescript-toolchain-migration-design.md @@ -0,0 +1,126 @@ +# TypeScript & Toolchain Migration — Design + +Date: 2026-08-14 +Status: Approved (in-chat) by Em + +## Goal + +Modernize VideoContext's language, toolchain, and packaging without changing its +public API or runtime behavior: + +1. Convert `src/` (20 modules, ~4,100 lines) to TypeScript. +2. Replace the Babel 6 / ESLint 4 / Prettier 1 / mixed-Jest toolchain with a + coherent modern stack. +3. Publish UMD + ESM + type declarations from one package. +4. Sweep the long-standing JSDoc typos while carrying comments over. + +Out of scope (explicitly deferred): Cypress 4 → 13 migration and its +image-snapshot plugin replacement; git hooks (husky is removed, CI is the gate). + +## Decisions (user-approved) + +- **Full TypeScript** for `src/`; tests remain JavaScript. +- **Core toolchain only**; Cypress untouched; husky removed entirely. +- **Packaging: UMD + ESM + types**; `main` keeps pointing at the existing UMD + bundle path so no consumer breaks. +- **Browser targets: `defaults`** browserslist (drops IE11). Consequence: + `@babel/preset-env` no longer transpiles classes, so `class extends Error` + is safe and `src/exceptions.js`'s manual prototype wiring can become real + `Error` subclasses. + +## Architecture + +### Language & type layer + +- `tsconfig.json`: `strict: true`, `lib: ["dom", "es2019"]`, + `moduleResolution: "bundler"`, `noEmit` (type-check only). +- `tsconfig.build.json`: `emitDeclarationOnly` → `dist/types`. +- Transpilation stays with Babel (`@babel/preset-env` + + `@babel/preset-typescript`); `tsc` never emits JS. +- Dynamic patterns get narrow escapes, not redesigns: + `ProcessingNode`'s `defineProperty`-generated shader properties use + `(this as any)[propertyName]` at the access sites; the `_isTextureCleared` + expando on `WebGLTexture` gets a small declared interface extension. +- Shared types in `src/types.ts`: `IDefinition` (vertex/fragment shader + sources, `properties` record, `inputs`), property value unions + (`number | number[] | HTMLImageElement`). +- Internal import specifiers are normalized to explicit `./name.js` + (TS resolves them to `.ts` sources; Node ESM and bundlers resolve them in + the compiled output). + +### Shaders + +All 44 `.frag`/`.vert` files are inlined into their owning modules as +template-literal string constants during conversion (byte-identical content). +Each `src/Definitions//` directory collapses from +`{name.js, name.frag, name.vert, package.json}` to a single `/index.ts`. +`raw-loader`, the per-directory stub `package.json` files, and the Jest glsl +`moduleNameMapper` mock are deleted once the last shader import is gone. + +### Build & packaging + +Three outputs from `yarn build`: + +| Output | Tool | Path | package.json field | +|---|---|---|---| +| UMD bundle | webpack 5 + babel-loader 9 | `dist/videocontext.js` (unchanged) | `main` | +| Per-module ESM | `babel src --extensions .ts` (`BABEL_ENV=esm`, `modules: false`) | `dist/esm/` | `module`, `exports.import` | +| Declarations | `tsc -p tsconfig.build.json` | `dist/types/` | `types` | + +- webpack `output.library` gains `export: "default"` to preserve + `window.VideoContext` being the class itself (this replaces the Babel 6 + `add-module-exports` plugin's job). +- `package.json` adds `exports` (with `types`/`import`/`require` conditions), + `sideEffects: false`, and `browserslist: ["defaults"]`. +- The `regenerator-runtime` runtime dependency is removed (no async/generator + code exists in `src/`); the package ends with zero runtime dependencies. + +### Lint / format / test stack + +- **ESLint 8**, classic `.eslintrc`: `eslint:recommended` + `prettier` + (via `eslint-config-prettier`), with a TS override block using + `@typescript-eslint` parser + recommended rules for `src/**/*.ts`. + `eslint-loader` is removed from webpack (linting runs standalone). +- **Prettier 3**, configured to preserve the current style (4-space indent, + printWidth 100, double quotes, `trailingComma: "none"`, + `arrowParens: "avoid"`) to keep the reformat diff minimal. The dead + `parser: "babylon"` option is dropped. +- **Jest 29** aligned: `jest-cli@23` and `babel-jest@23` removed; + `babel-jest@29` + `jest-environment-jsdom` added with + `testEnvironment: "jsdom"` declared explicitly (today jsdom only works + because the v23 binary happens to win `.bin` resolution). +- `webgl-mock` and `sinon` unchanged. Tests stay `.js`. +- `husky` and the `precommit` script are removed. + +### Docs & CI + +- `jsdoc` → **TypeDoc** (JSDoc cannot parse TS). `build-docs.sh` and the + `docs` script updated; same `docs/` output location. +- JSDoc typos ("dosen't", "attmept", "spearte", "curernt", "transistion", + "seqeuncing", …) are fixed as each file's comments are carried into TS. +- CI `build.yaml`: Node 18 → 20; new `yarn typecheck` step before tests. + The Cypress matrix entry is untouched. + +## Migration order & safety + +1. **Toolchain first, source still JS**: land Babel 7 / Jest 29 / ESLint 8 / + Prettier 3 / webpack changes with all 95 existing tests green. This + isolates toolchain risk from conversion risk. +2. **Convert bottom-up** along the dependency graph: + `exceptions` → `graphnode` → `rendergraph` → `sourcenode` → media/video/ + audio/image/canvas nodes → `videoelementcache(item)` → `processingnode` → + effect/transition/compositing/destination nodes (+ shader inlining) → + `Definitions/*` (scripted) → `utils` → `videocontext`. + Full test suite runs after each conversion step. +3. **Gates**: `eslint` clean, `tsc --noEmit` clean, 95/95 Jest tests, all + three build outputs produced, plus smoke checks — `require()` of the UMD + bundle returns the VideoContext class; `import` of `dist/esm/videocontext.js` + parses under Node. + +## Error handling & compatibility notes + +- Public API surface is unchanged; the existing 95-test suite is the + behavioral contract. +- `exceptions.ts` becomes `class … extends Error` (safe under `defaults` + targets); `instanceof` behavior is already locked by unit tests. +- Dropping IE11 via browserslist is the only intentional support change. diff --git a/jsdoc.json b/jsdoc.json deleted file mode 100644 index fce1004b..00000000 --- a/jsdoc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "opts": { - "encoding": "utf8", - "destination": "./docs/api/", - "recurse": true - }, - "tags": { - "allowUnknownTags": true, - "dictionaries": ["jsdoc", "closure"] - }, - "source": { - "include": ["./src/", "./src/DestinationNode", "./src/ProcessingNodes", "./src/SourceNodes/"], - "includePattern": ".+\\.js(doc)?$", - "excludePattern": "(^|\\/|\\\\)_" - }, - "plugins": ["plugins/markdown"], - "templates": { - "cleverLinks": true, - "monospaceLinks": false, - "default": { - "includeDate": false - } - } -} diff --git a/package.json b/package.json index d8bcc7ea..9c3b5157 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,17 @@ }, "license": "Apache-2.0", "main": "dist/videocontext.js", + "module": "dist/esm/videocontext.js", + "types": "dist/types/videocontext.d.ts", + "exports": { + ".": { + "types": "./dist/types/videocontext.d.ts", + "import": "./dist/esm/videocontext.js", + "require": "./dist/videocontext.js", + "default": "./dist/videocontext.js" + } + }, + "sideEffects": false, "keywords": [ "video", "context", @@ -24,12 +35,16 @@ ], "scripts": { "dev": "webpack --config webpack.config.js --watch", - "build": "webpack --config webpack.config.js", + "build": "yarn build:umd && yarn build:esm && yarn build:types", + "build:umd": "webpack --config webpack.config.js", + "build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions \".ts\" --source-maps && node -e \"require('fs').writeFileSync('dist/esm/package.json', JSON.stringify({ type: 'module' }) + '\\n')\"", + "build:types": "tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", "test": "bash ./test.sh", "test-unit": "jest test/unit/*.js", "test-integration": "jest test/integration/*.js", "test-watch": "jest --watch", - "test-coverage": "jest test/unit/*.js --coverage --collectCoverageFrom 'src/**/*.js'", + "test-coverage": "jest test/unit/*.js --coverage --collectCoverageFrom 'src/**/*.{js,ts}'", "test-ci:cypress": "yarn _server_cy_then _cy:run", "cypress": "./cypress-run.sh docker", "cypress:update-snapshots": "./cypress-run.sh docker-update-snapshots", @@ -42,41 +57,38 @@ "_server_cy_then": "start-server-and-test _cy-server http://localhost:3001", "docs": "bash ./build-docs.sh", "docs-commit": "yarn docs && git add docs && git diff-index --quiet HEAD || git commit -m 'update docs in preparation for release'", - "format": "prettier --write '{src,test}/**/*.js'", - "lint": "eslint '{src,test}/**/*.js'", - "precommit": "yarn lint && yarn format && yarn test-unit", + "format": "prettier --write '{src,test}/**/*.{js,ts}'", + "lint": "eslint '{src,test}/**/*.{js,ts}'", "release:major": "yarn docs-commit && changelog -M && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && yarn version --new-version major", "release:minor": "yarn docs-commit && changelog -m && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && yarn version --new-version minor", "release:patch": "yarn docs-commit && changelog -p && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && yarn version --new-version patch", "postversion": "git push -u origin HEAD --follow-tags" }, - "dependencies": { - "regenerator-runtime": "^0.11.1" - }, "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-jest": "^23.2.0", - "babel-loader": "^7.1.4", - "babel-plugin-add-module-exports": "^1.0.0", - "babel-preset-env": "^1.7.0", + "@babel/cli": "^7.24.0", + "@babel/core": "^7.24.0", + "@babel/preset-env": "^7.24.0", + "@babel/preset-typescript": "^7.24.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "babel-jest": "^29.7.0", + "babel-loader": "^9.1.3", "concurrently": "^7.0.0", "cypress": "^4.4.0", "cypress-image-snapshot": "^4.0.1", - "eslint": "^4.18.2", - "eslint-loader": "^2.0.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-cypress": "^2.2.0", "generate-changelog": "^1.7.1", - "husky": "^0.14.3", - "jest": "^29.3.1", - "jest-cli": "^23.1.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jest-image-snapshot": "^6.0.0", - "jsdoc": "^3.4.3", "local-web-server": "^2.6.1", - "prettier": "^1.13.2", - "raw-loader": "^0.5.1", + "prettier": "^3.3.0", "sinon": "^7.2.7", "start-server-and-test": "^1.7.11", + "typedoc": "^0.27.0", + "typescript": "~5.7.0", "webgl-mock": "^0.1.7", "webpack": "^5.75.0", "webpack-cli": "^5.0.0" @@ -84,9 +96,17 @@ "files": [ "dist" ], + "browserslist": [ + "defaults" + ], "jest": { + "testEnvironment": "jsdom", + "moduleFileExtensions": [ + "ts", + "js" + ], "moduleNameMapper": { - "\\.(frag|vert)$": "/test/__mocks__/glsl.js" + "^(\\.{1,2}/.*)\\.js$": "$1" }, "testMatch": [ "**/test/(integration|unit)/?(*.)+(spec|test).js?(x)" diff --git a/src/Definitions/aaf_video_crop/aaf_video_crop.frag b/src/Definitions/aaf_video_crop/aaf_video_crop.frag deleted file mode 100644 index 47f47e21..00000000 --- a/src/Definitions/aaf_video_crop/aaf_video_crop.frag +++ /dev/null @@ -1,15 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float cropLeft; -uniform float cropRight; -uniform float cropTop; -uniform float cropBottom; -varying vec2 v_texCoord; -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - if (v_texCoord[0] < (cropLeft+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); - if (v_texCoord[0] > (cropRight+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); - if (v_texCoord[1] < (-cropBottom+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); - if (v_texCoord[1] > (-cropTop+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); - gl_FragColor = color; -} diff --git a/src/Definitions/aaf_video_crop/aaf_video_crop.js b/src/Definitions/aaf_video_crop/aaf_video_crop.js deleted file mode 100644 index 349705a7..00000000 --- a/src/Definitions/aaf_video_crop/aaf_video_crop.js +++ /dev/null @@ -1,18 +0,0 @@ -import vertexShader from "./aaf_video_crop.vert"; -import fragmentShader from "./aaf_video_crop.frag"; - -let aaf_video_crop = { - title: "AAF Video Crop Effect", - description: "A crop effect based on the AAF spec.", - vertexShader, - fragmentShader, - properties: { - cropLeft: { type: "uniform", value: -1.0 }, - cropRight: { type: "uniform", value: 1.0 }, - cropTop: { type: "uniform", value: -1.0 }, - cropBottom: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default aaf_video_crop; diff --git a/src/Definitions/aaf_video_crop/aaf_video_crop.vert b/src/Definitions/aaf_video_crop/aaf_video_crop.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/aaf_video_crop/aaf_video_crop.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/aaf_video_crop/index.ts b/src/Definitions/aaf_video_crop/index.ts new file mode 100644 index 00000000..d67fc565 --- /dev/null +++ b/src/Definitions/aaf_video_crop/index.ts @@ -0,0 +1,41 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float cropLeft; +uniform float cropRight; +uniform float cropTop; +uniform float cropBottom; +varying vec2 v_texCoord; +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + if (v_texCoord[0] < (cropLeft+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); + if (v_texCoord[0] > (cropRight+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); + if (v_texCoord[1] < (-cropBottom+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); + if (v_texCoord[1] > (-cropTop+1.0)/2.0) color = vec4(0.0,0.0,0.0,0.0); + gl_FragColor = color; +}`; + +const aaf_video_crop: IDefinition = { + title: "AAF Video Crop Effect", + description: "A crop effect based on the AAF spec.", + vertexShader, + fragmentShader, + properties: { + cropLeft: { type: "uniform", value: -1.0 }, + cropRight: { type: "uniform", value: 1.0 }, + cropTop: { type: "uniform", value: -1.0 }, + cropBottom: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default aaf_video_crop; diff --git a/src/Definitions/aaf_video_crop/package.json b/src/Definitions/aaf_video_crop/package.json deleted file mode 100644 index 0e52edd4..00000000 --- a/src/Definitions/aaf_video_crop/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "aaf_video_crop", - "version": "0.0.0", - "private": true, - "main": "./aaf_video_crop.js" -} diff --git a/src/Definitions/aaf_video_flip/aaf_video_flip.frag b/src/Definitions/aaf_video_flip/aaf_video_flip.frag deleted file mode 100644 index c3a4bb15..00000000 --- a/src/Definitions/aaf_video_flip/aaf_video_flip.frag +++ /dev/null @@ -1,8 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -varying vec2 v_texCoord; -void main(){ - vec2 coord = vec2(v_texCoord[0] ,1.0 - v_texCoord[1]); - vec4 color = texture2D(u_image, coord); - gl_FragColor = color; -} diff --git a/src/Definitions/aaf_video_flip/aaf_video_flip.js b/src/Definitions/aaf_video_flip/aaf_video_flip.js deleted file mode 100644 index 84d94f64..00000000 --- a/src/Definitions/aaf_video_flip/aaf_video_flip.js +++ /dev/null @@ -1,13 +0,0 @@ -import vertexShader from "./aaf_video_flip.vert"; -import fragmentShader from "./aaf_video_flip.frag"; - -let aaf_video_flip = { - title: "AAF Video Flip Effect", - description: "A flip effect based on the AAF spec. Mirrors the image in the x-axis", - vertexShader, - fragmentShader, - properties: {}, - inputs: ["u_image"] -}; - -export default aaf_video_flip; diff --git a/src/Definitions/aaf_video_flip/aaf_video_flip.vert b/src/Definitions/aaf_video_flip/aaf_video_flip.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/aaf_video_flip/aaf_video_flip.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/aaf_video_flip/index.ts b/src/Definitions/aaf_video_flip/index.ts new file mode 100644 index 00000000..33214ff9 --- /dev/null +++ b/src/Definitions/aaf_video_flip/index.ts @@ -0,0 +1,29 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +varying vec2 v_texCoord; +void main(){ + vec2 coord = vec2(v_texCoord[0] ,1.0 - v_texCoord[1]); + vec4 color = texture2D(u_image, coord); + gl_FragColor = color; +}`; + +const aaf_video_flip: IDefinition = { + title: "AAF Video Flip Effect", + description: "A flip effect based on the AAF spec. Mirrors the image in the x-axis", + vertexShader, + fragmentShader, + properties: {}, + inputs: ["u_image"] +}; + +export default aaf_video_flip; diff --git a/src/Definitions/aaf_video_flip/package.json b/src/Definitions/aaf_video_flip/package.json deleted file mode 100644 index 40f34611..00000000 --- a/src/Definitions/aaf_video_flip/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "aaf_video_flip", - "version": "0.0.0", - "private": true, - "main": "./aaf_video_flip.js" -} diff --git a/src/Definitions/aaf_video_flop/aaf_video_flop.frag b/src/Definitions/aaf_video_flop/aaf_video_flop.frag deleted file mode 100644 index 37747f54..00000000 --- a/src/Definitions/aaf_video_flop/aaf_video_flop.frag +++ /dev/null @@ -1,8 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -varying vec2 v_texCoord; -void main(){ - vec2 coord = vec2(1.0 - v_texCoord[0] ,v_texCoord[1]); - vec4 color = texture2D(u_image, coord); - gl_FragColor = color; -} diff --git a/src/Definitions/aaf_video_flop/aaf_video_flop.js b/src/Definitions/aaf_video_flop/aaf_video_flop.js deleted file mode 100644 index 03c1546a..00000000 --- a/src/Definitions/aaf_video_flop/aaf_video_flop.js +++ /dev/null @@ -1,13 +0,0 @@ -import vertexShader from "./aaf_video_flop.vert"; -import fragmentShader from "./aaf_video_flop.frag"; - -let aaf_video_flop = { - title: "AAF Video Flop Effect", - description: "A flop effect based on the AAF spec. Mirrors the image in the y-axis", - vertexShader, - fragmentShader, - properties: {}, - inputs: ["u_image"] -}; - -export default aaf_video_flop; diff --git a/src/Definitions/aaf_video_flop/aaf_video_flop.vert b/src/Definitions/aaf_video_flop/aaf_video_flop.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/aaf_video_flop/aaf_video_flop.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/aaf_video_flop/index.ts b/src/Definitions/aaf_video_flop/index.ts new file mode 100644 index 00000000..69535fa4 --- /dev/null +++ b/src/Definitions/aaf_video_flop/index.ts @@ -0,0 +1,29 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +varying vec2 v_texCoord; +void main(){ + vec2 coord = vec2(1.0 - v_texCoord[0] ,v_texCoord[1]); + vec4 color = texture2D(u_image, coord); + gl_FragColor = color; +}`; + +const aaf_video_flop: IDefinition = { + title: "AAF Video Flop Effect", + description: "A flop effect based on the AAF spec. Mirrors the image in the y-axis", + vertexShader, + fragmentShader, + properties: {}, + inputs: ["u_image"] +}; + +export default aaf_video_flop; diff --git a/src/Definitions/aaf_video_flop/package.json b/src/Definitions/aaf_video_flop/package.json deleted file mode 100644 index ad603110..00000000 --- a/src/Definitions/aaf_video_flop/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "aaf_video_flop", - "version": "0.0.0", - "private": true, - "main": "./aaf_video_flop.js" -} diff --git a/src/Definitions/aaf_video_position/aaf_video_position.frag b/src/Definitions/aaf_video_position/aaf_video_position.frag deleted file mode 100644 index b1584476..00000000 --- a/src/Definitions/aaf_video_position/aaf_video_position.frag +++ /dev/null @@ -1,14 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float positionOffsetX; -uniform float positionOffsetY; -varying vec2 v_texCoord; -varying float v_progress; -void main(){ - vec2 pos = vec2(v_texCoord[0] - positionOffsetX/2.0, v_texCoord[1] - positionOffsetY/2.0); - vec4 color = texture2D(u_image, pos); - if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ - color = vec4(0.0,0.0,0.0,0.0); - } - gl_FragColor = color; -} diff --git a/src/Definitions/aaf_video_position/aaf_video_position.js b/src/Definitions/aaf_video_position/aaf_video_position.js deleted file mode 100644 index b51ae8b3..00000000 --- a/src/Definitions/aaf_video_position/aaf_video_position.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./aaf_video_position.vert"; -import fragmentShader from "./aaf_video_position.frag"; - -let aaf_video_position = { - title: "AAF Video Position Effect", - description: "A position effect based on the AAF spec.", - vertexShader, - fragmentShader, - properties: { - positionOffsetX: { type: "uniform", value: 0.0 }, - positionOffsetY: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image"] -}; - -export default aaf_video_position; diff --git a/src/Definitions/aaf_video_position/aaf_video_position.vert b/src/Definitions/aaf_video_position/aaf_video_position.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/aaf_video_position/aaf_video_position.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/aaf_video_position/index.ts b/src/Definitions/aaf_video_position/index.ts new file mode 100644 index 00000000..ae28c368 --- /dev/null +++ b/src/Definitions/aaf_video_position/index.ts @@ -0,0 +1,38 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float positionOffsetX; +uniform float positionOffsetY; +varying vec2 v_texCoord; +varying float v_progress; +void main(){ + vec2 pos = vec2(v_texCoord[0] - positionOffsetX/2.0, v_texCoord[1] - positionOffsetY/2.0); + vec4 color = texture2D(u_image, pos); + if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ + color = vec4(0.0,0.0,0.0,0.0); + } + gl_FragColor = color; +}`; + +const aaf_video_position: IDefinition = { + title: "AAF Video Position Effect", + description: "A position effect based on the AAF spec.", + vertexShader, + fragmentShader, + properties: { + positionOffsetX: { type: "uniform", value: 0.0 }, + positionOffsetY: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image"] +}; + +export default aaf_video_position; diff --git a/src/Definitions/aaf_video_position/package.json b/src/Definitions/aaf_video_position/package.json deleted file mode 100644 index 31bc06cf..00000000 --- a/src/Definitions/aaf_video_position/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "aaf_video_position", - "version": "0.0.0", - "private": true, - "main": "./aaf_video_position.js" -} diff --git a/src/Definitions/aaf_video_scale/aaf_video_scale.frag b/src/Definitions/aaf_video_scale/aaf_video_scale.frag deleted file mode 100644 index 90871202..00000000 --- a/src/Definitions/aaf_video_scale/aaf_video_scale.frag +++ /dev/null @@ -1,14 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float scaleX; -uniform float scaleY; -varying vec2 v_texCoord; -varying float v_progress; -void main(){ - vec2 pos = vec2(v_texCoord[0]*1.0/scaleX - (1.0/scaleX/2.0 -0.5), v_texCoord[1]*1.0/scaleY - (1.0/scaleY/2.0 -0.5)); - vec4 color = texture2D(u_image, pos); - if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ - color = vec4(0.0,0.0,0.0,0.0); - } - gl_FragColor = color; -} diff --git a/src/Definitions/aaf_video_scale/aaf_video_scale.js b/src/Definitions/aaf_video_scale/aaf_video_scale.js deleted file mode 100644 index c80479c9..00000000 --- a/src/Definitions/aaf_video_scale/aaf_video_scale.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./aaf_video_scale.vert"; -import fragmentShader from "./aaf_video_scale.frag"; - -let aaf_video_scale = { - title: "AAF Video Scale Effect", - description: "A scale effect based on the AAF spec.", - vertexShader, - fragmentShader, - properties: { - scaleX: { type: "uniform", value: 1.0 }, - scaleY: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default aaf_video_scale; diff --git a/src/Definitions/aaf_video_scale/aaf_video_scale.vert b/src/Definitions/aaf_video_scale/aaf_video_scale.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/aaf_video_scale/aaf_video_scale.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/aaf_video_scale/index.ts b/src/Definitions/aaf_video_scale/index.ts new file mode 100644 index 00000000..6a1c4c26 --- /dev/null +++ b/src/Definitions/aaf_video_scale/index.ts @@ -0,0 +1,38 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float scaleX; +uniform float scaleY; +varying vec2 v_texCoord; +varying float v_progress; +void main(){ + vec2 pos = vec2(v_texCoord[0]*1.0/scaleX - (1.0/scaleX/2.0 -0.5), v_texCoord[1]*1.0/scaleY - (1.0/scaleY/2.0 -0.5)); + vec4 color = texture2D(u_image, pos); + if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ + color = vec4(0.0,0.0,0.0,0.0); + } + gl_FragColor = color; +}`; + +const aaf_video_scale: IDefinition = { + title: "AAF Video Scale Effect", + description: "A scale effect based on the AAF spec.", + vertexShader, + fragmentShader, + properties: { + scaleX: { type: "uniform", value: 1.0 }, + scaleY: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default aaf_video_scale; diff --git a/src/Definitions/aaf_video_scale/package.json b/src/Definitions/aaf_video_scale/package.json deleted file mode 100644 index 4e71baae..00000000 --- a/src/Definitions/aaf_video_scale/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "aaf_video_scale", - "version": "0.0.0", - "private": true, - "main": "./aaf_video_scale.js" -} diff --git a/src/Definitions/colorThreshold/colorThreshold.frag b/src/Definitions/colorThreshold/colorThreshold.frag deleted file mode 100644 index 0a5886b8..00000000 --- a/src/Definitions/colorThreshold/colorThreshold.frag +++ /dev/null @@ -1,13 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float a; -uniform vec3 colorAlphaThreshold; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - if (color[0] > colorAlphaThreshold[0] && color[1]> colorAlphaThreshold[1] && color[2]> colorAlphaThreshold[2]){ - color = vec4(0.0,0.0,0.0,0.0); - } - gl_FragColor = color; -} diff --git a/src/Definitions/colorThreshold/colorThreshold.js b/src/Definitions/colorThreshold/colorThreshold.js deleted file mode 100644 index 2a42f6c3..00000000 --- a/src/Definitions/colorThreshold/colorThreshold.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./colorThreshold.vert"; -import fragmentShader from "./colorThreshold.frag"; - -let colorThreshold = { - title: "Color Threshold", - description: "Turns all pixels with a greater value than the specified threshold transparent.", - vertexShader, - fragmentShader, - properties: { - a: { type: "uniform", value: 0.0 }, - colorAlphaThreshold: { type: "uniform", value: [0.0, 0.55, 0.0] } - }, - inputs: ["u_image"] -}; - -export default colorThreshold; diff --git a/src/Definitions/colorThreshold/colorThreshold.vert b/src/Definitions/colorThreshold/colorThreshold.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/colorThreshold/colorThreshold.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/colorThreshold/index.ts b/src/Definitions/colorThreshold/index.ts new file mode 100644 index 00000000..04e2ef4a --- /dev/null +++ b/src/Definitions/colorThreshold/index.ts @@ -0,0 +1,37 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float a; +uniform vec3 colorAlphaThreshold; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + if (color[0] > colorAlphaThreshold[0] && color[1]> colorAlphaThreshold[1] && color[2]> colorAlphaThreshold[2]){ + color = vec4(0.0,0.0,0.0,0.0); + } + gl_FragColor = color; +}`; + +const colorThreshold: IDefinition = { + title: "Color Threshold", + description: "Turns all pixels with a greater value than the specified threshold transparent.", + vertexShader, + fragmentShader, + properties: { + a: { type: "uniform", value: 0.0 }, + colorAlphaThreshold: { type: "uniform", value: [0.0, 0.55, 0.0] } + }, + inputs: ["u_image"] +}; + +export default colorThreshold; diff --git a/src/Definitions/colorThreshold/package.json b/src/Definitions/colorThreshold/package.json deleted file mode 100644 index 5074ece5..00000000 --- a/src/Definitions/colorThreshold/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "colorThreshold", - "version": "0.0.0", - "private": true, - "main": "./colorThreshold.js" -} diff --git a/src/Definitions/combine/combine.frag b/src/Definitions/combine/combine.frag deleted file mode 100644 index dee09d60..00000000 --- a/src/Definitions/combine/combine.frag +++ /dev/null @@ -1,9 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float a; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - gl_FragColor = color; -} diff --git a/src/Definitions/combine/combine.js b/src/Definitions/combine/combine.js deleted file mode 100644 index 6baf29b5..00000000 --- a/src/Definitions/combine/combine.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./combine.vert"; -import fragmentShader from "./combine.frag"; - -let combine = { - title: "Combine", - description: - "A basic effect which renders the input to the output, Typically used as a combine node for layering up media with alpha transparency.", - vertexShader, - fragmentShader, - properties: { - a: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image"] -}; - -export default combine; diff --git a/src/Definitions/combine/combine.vert b/src/Definitions/combine/combine.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/combine/combine.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/combine/index.ts b/src/Definitions/combine/index.ts new file mode 100644 index 00000000..804755de --- /dev/null +++ b/src/Definitions/combine/index.ts @@ -0,0 +1,33 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float a; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + gl_FragColor = color; +}`; + +const combine: IDefinition = { + title: "Combine", + description: + "A basic effect which renders the input to the output, Typically used as a combine node for layering up media with alpha transparency.", + vertexShader, + fragmentShader, + properties: { + a: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image"] +}; + +export default combine; diff --git a/src/Definitions/combine/package.json b/src/Definitions/combine/package.json deleted file mode 100644 index 15ae2ef9..00000000 --- a/src/Definitions/combine/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "combine", - "version": "0.0.0", - "private": true, - "main": "./combine.js" -} diff --git a/src/Definitions/crop/crop.frag b/src/Definitions/crop/crop.frag deleted file mode 100644 index 47a6a92f..00000000 --- a/src/Definitions/crop/crop.frag +++ /dev/null @@ -1,16 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float x; -uniform float y; -uniform float width; -uniform float height; -varying vec2 v_texCoord; -varying float v_progress; -void main(){ - vec2 pos = (((v_texCoord)*vec2(width, height)) + vec2(0, 1.0-height)) +vec2(x,-y); - vec4 color = texture2D(u_image, pos); - if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ - color = vec4(0.0,0.0,0.0,0.0); - } - gl_FragColor = color; -} diff --git a/src/Definitions/crop/crop.js b/src/Definitions/crop/crop.js deleted file mode 100644 index db776ba9..00000000 --- a/src/Definitions/crop/crop.js +++ /dev/null @@ -1,18 +0,0 @@ -import vertexShader from "./crop.vert"; -import fragmentShader from "./crop.frag"; - -let crop = { - title: "Primer Simple Crop", - description: "A simple crop processors for primer", - vertexShader, - fragmentShader, - properties: { - x: { type: "uniform", value: 0.0 }, - y: { type: "uniform", value: 0.0 }, - width: { type: "uniform", value: 1.0 }, - height: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default crop; diff --git a/src/Definitions/crop/crop.vert b/src/Definitions/crop/crop.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/crop/crop.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/crop/index.ts b/src/Definitions/crop/index.ts new file mode 100644 index 00000000..2309c0d8 --- /dev/null +++ b/src/Definitions/crop/index.ts @@ -0,0 +1,42 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float x; +uniform float y; +uniform float width; +uniform float height; +varying vec2 v_texCoord; +varying float v_progress; +void main(){ + vec2 pos = (((v_texCoord)*vec2(width, height)) + vec2(0, 1.0-height)) +vec2(x,-y); + vec4 color = texture2D(u_image, pos); + if (pos[0] < 0.0 || pos[0] > 1.0 || pos[1] < 0.0 || pos[1] > 1.0){ + color = vec4(0.0,0.0,0.0,0.0); + } + gl_FragColor = color; +}`; + +const crop: IDefinition = { + title: "Primer Simple Crop", + description: "A simple crop processors for primer", + vertexShader, + fragmentShader, + properties: { + x: { type: "uniform", value: 0.0 }, + y: { type: "uniform", value: 0.0 }, + width: { type: "uniform", value: 1.0 }, + height: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default crop; diff --git a/src/Definitions/crop/package.json b/src/Definitions/crop/package.json deleted file mode 100644 index 190f8873..00000000 --- a/src/Definitions/crop/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "crop", - "version": "0.0.0", - "private": true, - "main": "./crop.js" -} diff --git a/src/Definitions/crossfade/crossfade.frag b/src/Definitions/crossfade/crossfade.frag deleted file mode 100644 index 68a11b0c..00000000 --- a/src/Definitions/crossfade/crossfade.frag +++ /dev/null @@ -1,19 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - color_a[0] *= (1.0 - mix); - color_a[1] *= (1.0 - mix); - color_a[2] *= (1.0 - mix); - color_a[3] *= (1.0 - mix); - color_b[0] *= mix; - color_b[1] *= mix; - color_b[2] *= mix; - color_b[3] *= mix; - gl_FragColor = color_a + color_b; -} diff --git a/src/Definitions/crossfade/crossfade.js b/src/Definitions/crossfade/crossfade.js deleted file mode 100644 index b394f6d5..00000000 --- a/src/Definitions/crossfade/crossfade.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./crossfade.vert"; -import fragmentShader from "./crossfade.frag"; - -let crossfade = { - title: "Cross-Fade", - description: "A cross-fade effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default crossfade; diff --git a/src/Definitions/crossfade/crossfade.vert b/src/Definitions/crossfade/crossfade.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/crossfade/crossfade.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/crossfade/index.ts b/src/Definitions/crossfade/index.ts new file mode 100644 index 00000000..b570170e --- /dev/null +++ b/src/Definitions/crossfade/index.ts @@ -0,0 +1,42 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + color_a[0] *= (1.0 - mix); + color_a[1] *= (1.0 - mix); + color_a[2] *= (1.0 - mix); + color_a[3] *= (1.0 - mix); + color_b[0] *= mix; + color_b[1] *= mix; + color_b[2] *= mix; + color_b[3] *= mix; + gl_FragColor = color_a + color_b; +}`; + +const crossfade: IDefinition = { + title: "Cross-Fade", + description: "A cross-fade effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default crossfade; diff --git a/src/Definitions/crossfade/package.json b/src/Definitions/crossfade/package.json deleted file mode 100644 index 4bbc41dc..00000000 --- a/src/Definitions/crossfade/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "crossfade", - "version": "0.0.0", - "private": true, - "main": "./crossfade.js" -} diff --git a/src/Definitions/definitions.js b/src/Definitions/definitions.js deleted file mode 100644 index 4285d1cc..00000000 --- a/src/Definitions/definitions.js +++ /dev/null @@ -1,47 +0,0 @@ -import aaf_video_scale from "./aaf_video_scale"; -import crossfade from "./crossfade"; -import horizontalWipe from "./horizontalWipe"; -import verticalWipe from "./verticalWipe"; -import randomDissolve from "./randomDissolve"; -import toColorAndBackFade from "./toColorAndBackFade"; -import starWipe from "./starWipe"; -import combine from "./combine"; -import colorThreshold from "./colorThreshold"; -import monochrome from "./monochrome"; -import horizontalBlur from "./horizontalBlur"; -import verticalBlur from "./verticalBlur"; -import aaf_video_flop from "./aaf_video_flop"; -import aaf_video_flip from "./aaf_video_flip"; -import aaf_video_position from "./aaf_video_position"; -import aaf_video_crop from "./aaf_video_crop"; -import staticDissolve from "./staticDissolve"; -import staticEffect from "./staticEffect"; -import dreamfade from "./dreamfade"; -import opacity from "./opacity"; -import crop from "./crop"; - -let DEFINITIONS = { - AAF_VIDEO_SCALE: aaf_video_scale, - CROSSFADE: crossfade, - DREAMFADE: dreamfade, - HORIZONTAL_WIPE: horizontalWipe, - VERTICAL_WIPE: verticalWipe, - RANDOM_DISSOLVE: randomDissolve, - STATIC_DISSOLVE: staticDissolve, - STATIC_EFFECT: staticEffect, - TO_COLOR_AND_BACK: toColorAndBackFade, - STAR_WIPE: starWipe, - COMBINE: combine, - COLORTHRESHOLD: colorThreshold, - MONOCHROME: monochrome, - HORIZONTAL_BLUR: horizontalBlur, - VERTICAL_BLUR: verticalBlur, - AAF_VIDEO_CROP: aaf_video_crop, - AAF_VIDEO_POSITION: aaf_video_position, - AAF_VIDEO_FLIP: aaf_video_flip, - AAF_VIDEO_FLOP: aaf_video_flop, - OPACITY: opacity, - CROP: crop -}; - -export default DEFINITIONS; diff --git a/src/Definitions/definitions.ts b/src/Definitions/definitions.ts new file mode 100644 index 00000000..24446a5f --- /dev/null +++ b/src/Definitions/definitions.ts @@ -0,0 +1,47 @@ +import aaf_video_scale from "./aaf_video_scale/index.js"; +import crossfade from "./crossfade/index.js"; +import horizontalWipe from "./horizontalWipe/index.js"; +import verticalWipe from "./verticalWipe/index.js"; +import randomDissolve from "./randomDissolve/index.js"; +import toColorAndBackFade from "./toColorAndBackFade/index.js"; +import starWipe from "./starWipe/index.js"; +import combine from "./combine/index.js"; +import colorThreshold from "./colorThreshold/index.js"; +import monochrome from "./monochrome/index.js"; +import horizontalBlur from "./horizontalBlur/index.js"; +import verticalBlur from "./verticalBlur/index.js"; +import aaf_video_flop from "./aaf_video_flop/index.js"; +import aaf_video_flip from "./aaf_video_flip/index.js"; +import aaf_video_position from "./aaf_video_position/index.js"; +import aaf_video_crop from "./aaf_video_crop/index.js"; +import staticDissolve from "./staticDissolve/index.js"; +import staticEffect from "./staticEffect/index.js"; +import dreamfade from "./dreamfade/index.js"; +import opacity from "./opacity/index.js"; +import crop from "./crop/index.js"; + +const DEFINITIONS = { + AAF_VIDEO_SCALE: aaf_video_scale, + CROSSFADE: crossfade, + DREAMFADE: dreamfade, + HORIZONTAL_WIPE: horizontalWipe, + VERTICAL_WIPE: verticalWipe, + RANDOM_DISSOLVE: randomDissolve, + STATIC_DISSOLVE: staticDissolve, + STATIC_EFFECT: staticEffect, + TO_COLOR_AND_BACK: toColorAndBackFade, + STAR_WIPE: starWipe, + COMBINE: combine, + COLORTHRESHOLD: colorThreshold, + MONOCHROME: monochrome, + HORIZONTAL_BLUR: horizontalBlur, + VERTICAL_BLUR: verticalBlur, + AAF_VIDEO_CROP: aaf_video_crop, + AAF_VIDEO_POSITION: aaf_video_position, + AAF_VIDEO_FLIP: aaf_video_flip, + AAF_VIDEO_FLOP: aaf_video_flop, + OPACITY: opacity, + CROP: crop +}; + +export default DEFINITIONS; diff --git a/src/Definitions/dreamfade/dreamfade.js b/src/Definitions/dreamfade/dreamfade.js deleted file mode 100644 index 1ab9e386..00000000 --- a/src/Definitions/dreamfade/dreamfade.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./dreamfade.vert"; -import fragmentShader from "./dreamfade.frag"; - -let dreamfade = { - title: "Dream-Fade", - description: "A wobbly dream effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default dreamfade; diff --git a/src/Definitions/dreamfade/dreamfade.vert b/src/Definitions/dreamfade/dreamfade.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/dreamfade/dreamfade.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/dreamfade/dreamfade.frag b/src/Definitions/dreamfade/index.ts similarity index 50% rename from src/Definitions/dreamfade/dreamfade.frag rename to src/Definitions/dreamfade/index.ts index 533bd06c..d353ff9d 100644 --- a/src/Definitions/dreamfade/dreamfade.frag +++ b/src/Definitions/dreamfade/index.ts @@ -1,4 +1,14 @@ -precision mediump float; +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; uniform sampler2D u_image_a; uniform sampler2D u_image_b; uniform float mix; @@ -18,4 +28,17 @@ void main(){ color_b[2] *= mix; color_b[3] *= mix; gl_FragColor = color_a + color_b; -} +}`; + +const dreamfade: IDefinition = { + title: "Dream-Fade", + description: "A wobbly dream effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default dreamfade; diff --git a/src/Definitions/dreamfade/package.json b/src/Definitions/dreamfade/package.json deleted file mode 100644 index 61acea1a..00000000 --- a/src/Definitions/dreamfade/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "dreamfade", - "version": "0.0.0", - "private": true, - "main": "./dreamfade.js" -} diff --git a/src/Definitions/horizontalBlur/horizontalBlur.frag b/src/Definitions/horizontalBlur/horizontalBlur.frag deleted file mode 100644 index 4f973741..00000000 --- a/src/Definitions/horizontalBlur/horizontalBlur.frag +++ /dev/null @@ -1,22 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -varying vec2 v_texCoord; -varying vec2 v_blurTexCoords[14]; -void main(){ - gl_FragColor = vec4(0.0); - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 0])*0.0044299121055113265; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 1])*0.00895781211794; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 2])*0.0215963866053; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 3])*0.0443683338718; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 4])*0.0776744219933; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 5])*0.115876621105; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 6])*0.147308056121; - gl_FragColor += texture2D(u_image, v_texCoord )*0.159576912161; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 7])*0.147308056121; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 8])*0.115876621105; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 9])*0.0776744219933; - gl_FragColor += texture2D(u_image, v_blurTexCoords[10])*0.0443683338718; - gl_FragColor += texture2D(u_image, v_blurTexCoords[11])*0.0215963866053; - gl_FragColor += texture2D(u_image, v_blurTexCoords[12])*0.00895781211794; - gl_FragColor += texture2D(u_image, v_blurTexCoords[13])*0.0044299121055113265; -} diff --git a/src/Definitions/horizontalBlur/horizontalBlur.js b/src/Definitions/horizontalBlur/horizontalBlur.js deleted file mode 100644 index be43283a..00000000 --- a/src/Definitions/horizontalBlur/horizontalBlur.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./horizontalBlur.vert"; -import fragmentShader from "./horizontalBlur.frag"; - -let horizontal_blur = { - title: "Horizontal Blur", - description: - "A horizontal blur effect. Adpated from http://xissburg.com/faster-gaussian-blur-in-glsl/", - vertexShader, - fragmentShader, - properties: { - blurAmount: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default horizontal_blur; diff --git a/src/Definitions/horizontalBlur/horizontalBlur.vert b/src/Definitions/horizontalBlur/horizontalBlur.vert deleted file mode 100644 index 884d9263..00000000 --- a/src/Definitions/horizontalBlur/horizontalBlur.vert +++ /dev/null @@ -1,23 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -uniform float blurAmount; -varying vec2 v_texCoord; -varying vec2 v_blurTexCoords[14]; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; - v_blurTexCoords[ 0] = v_texCoord + vec2(-0.028 * blurAmount, 0.0); - v_blurTexCoords[ 1] = v_texCoord + vec2(-0.024 * blurAmount, 0.0); - v_blurTexCoords[ 2] = v_texCoord + vec2(-0.020 * blurAmount, 0.0); - v_blurTexCoords[ 3] = v_texCoord + vec2(-0.016 * blurAmount, 0.0); - v_blurTexCoords[ 4] = v_texCoord + vec2(-0.012 * blurAmount, 0.0); - v_blurTexCoords[ 5] = v_texCoord + vec2(-0.008 * blurAmount, 0.0); - v_blurTexCoords[ 6] = v_texCoord + vec2(-0.004 * blurAmount, 0.0); - v_blurTexCoords[ 7] = v_texCoord + vec2( 0.004 * blurAmount, 0.0); - v_blurTexCoords[ 8] = v_texCoord + vec2( 0.008 * blurAmount, 0.0); - v_blurTexCoords[ 9] = v_texCoord + vec2( 0.012 * blurAmount, 0.0); - v_blurTexCoords[10] = v_texCoord + vec2( 0.016 * blurAmount, 0.0); - v_blurTexCoords[11] = v_texCoord + vec2( 0.020 * blurAmount, 0.0); - v_blurTexCoords[12] = v_texCoord + vec2( 0.024 * blurAmount, 0.0); - v_blurTexCoords[13] = v_texCoord + vec2( 0.028 * blurAmount, 0.0); -} diff --git a/src/Definitions/horizontalBlur/index.ts b/src/Definitions/horizontalBlur/index.ts new file mode 100644 index 00000000..489f40ad --- /dev/null +++ b/src/Definitions/horizontalBlur/index.ts @@ -0,0 +1,62 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +uniform float blurAmount; +varying vec2 v_texCoord; +varying vec2 v_blurTexCoords[14]; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; + v_blurTexCoords[ 0] = v_texCoord + vec2(-0.028 * blurAmount, 0.0); + v_blurTexCoords[ 1] = v_texCoord + vec2(-0.024 * blurAmount, 0.0); + v_blurTexCoords[ 2] = v_texCoord + vec2(-0.020 * blurAmount, 0.0); + v_blurTexCoords[ 3] = v_texCoord + vec2(-0.016 * blurAmount, 0.0); + v_blurTexCoords[ 4] = v_texCoord + vec2(-0.012 * blurAmount, 0.0); + v_blurTexCoords[ 5] = v_texCoord + vec2(-0.008 * blurAmount, 0.0); + v_blurTexCoords[ 6] = v_texCoord + vec2(-0.004 * blurAmount, 0.0); + v_blurTexCoords[ 7] = v_texCoord + vec2( 0.004 * blurAmount, 0.0); + v_blurTexCoords[ 8] = v_texCoord + vec2( 0.008 * blurAmount, 0.0); + v_blurTexCoords[ 9] = v_texCoord + vec2( 0.012 * blurAmount, 0.0); + v_blurTexCoords[10] = v_texCoord + vec2( 0.016 * blurAmount, 0.0); + v_blurTexCoords[11] = v_texCoord + vec2( 0.020 * blurAmount, 0.0); + v_blurTexCoords[12] = v_texCoord + vec2( 0.024 * blurAmount, 0.0); + v_blurTexCoords[13] = v_texCoord + vec2( 0.028 * blurAmount, 0.0); +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +varying vec2 v_texCoord; +varying vec2 v_blurTexCoords[14]; +void main(){ + gl_FragColor = vec4(0.0); + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 0])*0.0044299121055113265; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 1])*0.00895781211794; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 2])*0.0215963866053; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 3])*0.0443683338718; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 4])*0.0776744219933; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 5])*0.115876621105; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 6])*0.147308056121; + gl_FragColor += texture2D(u_image, v_texCoord )*0.159576912161; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 7])*0.147308056121; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 8])*0.115876621105; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 9])*0.0776744219933; + gl_FragColor += texture2D(u_image, v_blurTexCoords[10])*0.0443683338718; + gl_FragColor += texture2D(u_image, v_blurTexCoords[11])*0.0215963866053; + gl_FragColor += texture2D(u_image, v_blurTexCoords[12])*0.00895781211794; + gl_FragColor += texture2D(u_image, v_blurTexCoords[13])*0.0044299121055113265; +}`; + +const horizontal_blur: IDefinition = { + title: "Horizontal Blur", + description: + "A horizontal blur effect. Adpated from http://xissburg.com/faster-gaussian-blur-in-glsl/", + vertexShader, + fragmentShader, + properties: { + blurAmount: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default horizontal_blur; diff --git a/src/Definitions/horizontalBlur/package.json b/src/Definitions/horizontalBlur/package.json deleted file mode 100644 index 2dc9290d..00000000 --- a/src/Definitions/horizontalBlur/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "horizontalBlur", - "version": "0.0.0", - "private": true, - "main": "./horizontalBlur.js" -} diff --git a/src/Definitions/horizontalWipe/horizontalWipe.frag b/src/Definitions/horizontalWipe/horizontalWipe.frag deleted file mode 100644 index 5c10baec..00000000 --- a/src/Definitions/horizontalWipe/horizontalWipe.frag +++ /dev/null @@ -1,15 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - if (v_texCoord[0] > mix){ - gl_FragColor = color_a; - } else { - gl_FragColor = color_b; - } -} diff --git a/src/Definitions/horizontalWipe/horizontalWipe.js b/src/Definitions/horizontalWipe/horizontalWipe.js deleted file mode 100644 index 1a98ba0c..00000000 --- a/src/Definitions/horizontalWipe/horizontalWipe.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./horizontalWipe.vert"; -import fragmentShader from "./horizontalWipe.frag"; - -let horizontal_wipe = { - title: "Horizontal Wipe", - description: "A horizontal wipe effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default horizontal_wipe; diff --git a/src/Definitions/horizontalWipe/horizontalWipe.vert b/src/Definitions/horizontalWipe/horizontalWipe.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/horizontalWipe/horizontalWipe.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/horizontalWipe/index.ts b/src/Definitions/horizontalWipe/index.ts new file mode 100644 index 00000000..5b11e31e --- /dev/null +++ b/src/Definitions/horizontalWipe/index.ts @@ -0,0 +1,38 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + if (v_texCoord[0] > mix){ + gl_FragColor = color_a; + } else { + gl_FragColor = color_b; + } +}`; + +const horizontal_wipe: IDefinition = { + title: "Horizontal Wipe", + description: "A horizontal wipe effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default horizontal_wipe; diff --git a/src/Definitions/horizontalWipe/package.json b/src/Definitions/horizontalWipe/package.json deleted file mode 100644 index 40c731dc..00000000 --- a/src/Definitions/horizontalWipe/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "horizontalWipe", - "version": "0.0.0", - "private": true, - "main": "./horizontalWipe.js" -} diff --git a/src/Definitions/monochrome/index.ts b/src/Definitions/monochrome/index.ts new file mode 100644 index 00000000..240ba15e --- /dev/null +++ b/src/Definitions/monochrome/index.ts @@ -0,0 +1,39 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform vec3 inputMix; +uniform vec3 outputMix; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + float mono = color[0]*inputMix[0] + color[1]*inputMix[1] + color[2]*inputMix[2]; + color[0] = mono * outputMix[0]; + color[1] = mono * outputMix[1]; + color[2] = mono * outputMix[2]; + gl_FragColor = color; +}`; + +const monochrome: IDefinition = { + title: "Monochrome", + description: + "Change images to a single chroma (e.g can be used to make a black & white filter). Input color mix and output color mix can be adjusted.", + vertexShader, + fragmentShader, + properties: { + inputMix: { type: "uniform", value: [0.4, 0.6, 0.2] }, + outputMix: { type: "uniform", value: [1.0, 1.0, 1.0] } + }, + inputs: ["u_image"] +}; + +export default monochrome; diff --git a/src/Definitions/monochrome/monochrome.frag b/src/Definitions/monochrome/monochrome.frag deleted file mode 100644 index 3bd7de7f..00000000 --- a/src/Definitions/monochrome/monochrome.frag +++ /dev/null @@ -1,14 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform vec3 inputMix; -uniform vec3 outputMix; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - float mono = color[0]*inputMix[0] + color[1]*inputMix[1] + color[2]*inputMix[2]; - color[0] = mono * outputMix[0]; - color[1] = mono * outputMix[1]; - color[2] = mono * outputMix[2]; - gl_FragColor = color; -} diff --git a/src/Definitions/monochrome/monochrome.js b/src/Definitions/monochrome/monochrome.js deleted file mode 100644 index 97db6509..00000000 --- a/src/Definitions/monochrome/monochrome.js +++ /dev/null @@ -1,17 +0,0 @@ -import vertexShader from "./monochrome.vert"; -import fragmentShader from "./monochrome.frag"; - -let monochrome = { - title: "Monochrome", - description: - "Change images to a single chroma (e.g can be used to make a black & white filter). Input color mix and output color mix can be adjusted.", - vertexShader, - fragmentShader, - properties: { - inputMix: { type: "uniform", value: [0.4, 0.6, 0.2] }, - outputMix: { type: "uniform", value: [1.0, 1.0, 1.0] } - }, - inputs: ["u_image"] -}; - -export default monochrome; diff --git a/src/Definitions/monochrome/monochrome.vert b/src/Definitions/monochrome/monochrome.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/monochrome/monochrome.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/monochrome/package.json b/src/Definitions/monochrome/package.json deleted file mode 100644 index adad0cb8..00000000 --- a/src/Definitions/monochrome/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "monochrome", - "version": "0.0.0", - "private": true, - "main": "./monochrome.js" -} diff --git a/src/Definitions/opacity/index.ts b/src/Definitions/opacity/index.ts new file mode 100644 index 00000000..acaddfe0 --- /dev/null +++ b/src/Definitions/opacity/index.ts @@ -0,0 +1,33 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float opacity; +varying vec2 v_texCoord; +varying float v_opacity; +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + color[3] *= opacity; + gl_FragColor = color; +}`; + +const opacity: IDefinition = { + title: "Opacity", + description: "Sets the opacity of an input.", + vertexShader, + fragmentShader, + properties: { + opacity: { type: "uniform", value: 0.7 } + }, + inputs: ["u_image"] +}; + +export default opacity; diff --git a/src/Definitions/opacity/opacity.frag b/src/Definitions/opacity/opacity.frag deleted file mode 100644 index f007ba17..00000000 --- a/src/Definitions/opacity/opacity.frag +++ /dev/null @@ -1,10 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float opacity; -varying vec2 v_texCoord; -varying float v_opacity; -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - color[3] *= opacity; - gl_FragColor = color; -} diff --git a/src/Definitions/opacity/opacity.js b/src/Definitions/opacity/opacity.js deleted file mode 100644 index 2c2de9d0..00000000 --- a/src/Definitions/opacity/opacity.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./opacity.vert"; -import fragmentShader from "./opacity.frag"; - -const opacity = { - title: "Opacity", - description: "Sets the opacity of an input.", - vertexShader, - fragmentShader, - properties: { - opacity: { type: "uniform", value: 0.7 } - }, - inputs: ["u_image"] -}; - -export default opacity; diff --git a/src/Definitions/opacity/opacity.vert b/src/Definitions/opacity/opacity.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/opacity/opacity.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/opacity/package.json b/src/Definitions/opacity/package.json deleted file mode 100644 index 1ec2225f..00000000 --- a/src/Definitions/opacity/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "opacity", - "version": "0.0.0", - "private": true, - "main": "./opacity.js" -} diff --git a/src/Definitions/randomDissolve/index.ts b/src/Definitions/randomDissolve/index.ts new file mode 100644 index 00000000..33d4fb7d --- /dev/null +++ b/src/Definitions/randomDissolve/index.ts @@ -0,0 +1,41 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +varying vec2 v_texCoord; +varying float v_mix; +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + if (clamp(rand(v_texCoord), 0.01, 1.001) > mix){ + gl_FragColor = color_a; + } else { + gl_FragColor = color_b; + } +}`; + +const randomDissolve: IDefinition = { + title: "Random Dissolve", + description: "A random dissolve effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default randomDissolve; diff --git a/src/Definitions/randomDissolve/package.json b/src/Definitions/randomDissolve/package.json deleted file mode 100644 index 3e277269..00000000 --- a/src/Definitions/randomDissolve/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "randomDissolve", - "version": "0.0.0", - "private": true, - "main": "./randomDissolve.js" -} diff --git a/src/Definitions/randomDissolve/randomDissolve.frag b/src/Definitions/randomDissolve/randomDissolve.frag deleted file mode 100644 index 69bcefbc..00000000 --- a/src/Definitions/randomDissolve/randomDissolve.frag +++ /dev/null @@ -1,18 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -varying vec2 v_texCoord; -varying float v_mix; -float rand(vec2 co){ - return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); -} -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - if (clamp(rand(v_texCoord), 0.01, 1.001) > mix){ - gl_FragColor = color_a; - } else { - gl_FragColor = color_b; - } -} diff --git a/src/Definitions/randomDissolve/randomDissolve.js b/src/Definitions/randomDissolve/randomDissolve.js deleted file mode 100644 index 56e3ec6d..00000000 --- a/src/Definitions/randomDissolve/randomDissolve.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./randomDissolve.vert"; -import fragmentShader from "./randomDissolve.frag"; - -let randomDissolve = { - title: "Random Dissolve", - description: "A random dissolve effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default randomDissolve; diff --git a/src/Definitions/randomDissolve/randomDissolve.vert b/src/Definitions/randomDissolve/randomDissolve.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/randomDissolve/randomDissolve.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/starWipe/starWipe.frag b/src/Definitions/starWipe/index.ts similarity index 83% rename from src/Definitions/starWipe/starWipe.frag rename to src/Definitions/starWipe/index.ts index 86e203d8..89e0d150 100644 --- a/src/Definitions/starWipe/starWipe.frag +++ b/src/Definitions/starWipe/index.ts @@ -1,4 +1,14 @@ -precision mediump float; +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; uniform sampler2D u_image_a; uniform sampler2D u_image_b; uniform float mix; @@ -76,4 +86,17 @@ void main(){ } else { gl_FragColor = color_b; } -} +}`; + +const starWipe: IDefinition = { + title: "Star Wipe Fade", + description: "A classic star wipe transition. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default starWipe; diff --git a/src/Definitions/starWipe/package.json b/src/Definitions/starWipe/package.json deleted file mode 100644 index 7b8eab54..00000000 --- a/src/Definitions/starWipe/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "starWipe", - "version": "0.0.0", - "private": true, - "main": "./starWipe.js" -} diff --git a/src/Definitions/starWipe/starWipe.js b/src/Definitions/starWipe/starWipe.js deleted file mode 100644 index 395dc160..00000000 --- a/src/Definitions/starWipe/starWipe.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./starWipe.vert"; -import fragmentShader from "./starWipe.frag"; - -let starWipe = { - title: "Star Wipe Fade", - description: "A classic star wipe transistion. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default starWipe; diff --git a/src/Definitions/starWipe/starWipe.vert b/src/Definitions/starWipe/starWipe.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/starWipe/starWipe.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/staticDissolve/index.ts b/src/Definitions/staticDissolve/index.ts new file mode 100644 index 00000000..41f38704 --- /dev/null +++ b/src/Definitions/staticDissolve/index.ts @@ -0,0 +1,42 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +uniform float currentTime; +varying vec2 v_texCoord; +varying float v_mix; +float rand(vec2 co, float currentTime){ + return fract(sin(dot(co.xy,vec2(12.9898,78.233))+currentTime) * 43758.5453); +} +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + if (clamp(rand(v_texCoord, currentTime), 0.01, 1.001) > mix){ + gl_FragColor = color_a; + } else { + gl_FragColor = color_b; + } +}`; + +const staticDissolve: IDefinition = { + title: "Static Dissolve", + description: "A static dissolve effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default staticDissolve; diff --git a/src/Definitions/staticDissolve/package.json b/src/Definitions/staticDissolve/package.json deleted file mode 100644 index 1acea984..00000000 --- a/src/Definitions/staticDissolve/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "staticDissolve", - "version": "0.0.0", - "private": true, - "main": "./staticDissolve.js" -} diff --git a/src/Definitions/staticDissolve/staticDissolve.frag b/src/Definitions/staticDissolve/staticDissolve.frag deleted file mode 100644 index 27201496..00000000 --- a/src/Definitions/staticDissolve/staticDissolve.frag +++ /dev/null @@ -1,19 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -uniform float currentTime; -varying vec2 v_texCoord; -varying float v_mix; -float rand(vec2 co, float currentTime){ - return fract(sin(dot(co.xy,vec2(12.9898,78.233))+currentTime) * 43758.5453); -} -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - if (clamp(rand(v_texCoord, currentTime), 0.01, 1.001) > mix){ - gl_FragColor = color_a; - } else { - gl_FragColor = color_b; - } -} diff --git a/src/Definitions/staticDissolve/staticDissolve.js b/src/Definitions/staticDissolve/staticDissolve.js deleted file mode 100644 index f3303659..00000000 --- a/src/Definitions/staticDissolve/staticDissolve.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./staticDissolve.vert"; -import fragmentShader from "./staticDissolve.frag"; - -let staticDissolve = { - title: "Static Dissolve", - description: "A static dissolve effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default staticDissolve; diff --git a/src/Definitions/staticDissolve/staticDissolve.vert b/src/Definitions/staticDissolve/staticDissolve.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/staticDissolve/staticDissolve.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/staticEffect/index.ts b/src/Definitions/staticEffect/index.ts new file mode 100644 index 00000000..26dc8948 --- /dev/null +++ b/src/Definitions/staticEffect/index.ts @@ -0,0 +1,40 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +uniform float currentTime; +uniform float amount; +varying vec2 v_texCoord; +uniform vec3 weight; +float rand(vec2 co, float currentTime){ + return fract(sin(dot(co.xy,vec2(12.9898,78.233))+currentTime) * 43758.5453); +} +void main(){ + vec4 color = texture2D(u_image, v_texCoord); + color[0] = color[0] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[0] * amount; + color[1] = color[1] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[1] * amount; + color[2] = color[2] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[2] *amount; + gl_FragColor = color; +}`; + +const staticEffect: IDefinition = { + title: "Static", + description: "A static effect to add pseudo random noise to a video", + vertexShader, + fragmentShader, + properties: { + weight: { type: "uniform", value: [1.0, 1.0, 1.0] }, + amount: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default staticEffect; diff --git a/src/Definitions/staticEffect/package.json b/src/Definitions/staticEffect/package.json deleted file mode 100644 index babfc630..00000000 --- a/src/Definitions/staticEffect/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "staticEffect", - "version": "0.0.0", - "private": true, - "main": "./staticEffect.js" -} diff --git a/src/Definitions/staticEffect/staticEffect.frag b/src/Definitions/staticEffect/staticEffect.frag deleted file mode 100644 index 98f6eca1..00000000 --- a/src/Definitions/staticEffect/staticEffect.frag +++ /dev/null @@ -1,16 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -uniform float currentTime; -uniform float amount; -varying vec2 v_texCoord; -uniform vec3 weight; -float rand(vec2 co, float currentTime){ - return fract(sin(dot(co.xy,vec2(12.9898,78.233))+currentTime) * 43758.5453); -} -void main(){ - vec4 color = texture2D(u_image, v_texCoord); - color[0] = color[0] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[0] * amount; - color[1] = color[1] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[1] * amount; - color[2] = color[2] + (2.0*(clamp(rand(v_texCoord, currentTime), 0.01, 1.001)-0.5)) * weight[2] *amount; - gl_FragColor = color; -} diff --git a/src/Definitions/staticEffect/staticEffect.js b/src/Definitions/staticEffect/staticEffect.js deleted file mode 100644 index 3958108c..00000000 --- a/src/Definitions/staticEffect/staticEffect.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./staticEffect.vert"; -import fragmentShader from "./staticEffect.frag"; - -let staticEffect = { - title: "Static", - description: "A static effect to add pseudo random noise to a video", - vertexShader, - fragmentShader, - properties: { - weight: { type: "uniform", value: [1.0, 1.0, 1.0] }, - amount: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default staticEffect; diff --git a/src/Definitions/staticEffect/staticEffect.vert b/src/Definitions/staticEffect/staticEffect.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/staticEffect/staticEffect.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/toColorAndBackFade/index.ts b/src/Definitions/toColorAndBackFade/index.ts new file mode 100644 index 00000000..9cc11c7a --- /dev/null +++ b/src/Definitions/toColorAndBackFade/index.ts @@ -0,0 +1,41 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +uniform vec4 color; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + float mix_amount = (mix *2.0) - 1.0; + if(mix_amount < 0.0){ + gl_FragColor = abs(mix_amount) * color_a + (1.0 - abs(mix_amount)) * color; + } else { + gl_FragColor = mix_amount * color_b + (1.0 - mix_amount) * color; + } +}`; + +const toColorAndBackFade: IDefinition = { + title: "To Color And Back Fade", + description: + "A fade to black and back effect. Setting mix to 0.5 is a fully solid color frame. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 }, + color: { type: "uniform", value: [0.0, 0.0, 0.0, 0.0] } + }, + inputs: ["u_image_a", "u_image_b"] +}; +export default toColorAndBackFade; diff --git a/src/Definitions/toColorAndBackFade/package.json b/src/Definitions/toColorAndBackFade/package.json deleted file mode 100644 index fcdc2a8e..00000000 --- a/src/Definitions/toColorAndBackFade/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "toColorAndBackFade", - "version": "0.0.0", - "private": true, - "main": "./toColorAndBackFade.js" -} diff --git a/src/Definitions/toColorAndBackFade/toColorAndBackFade.frag b/src/Definitions/toColorAndBackFade/toColorAndBackFade.frag deleted file mode 100644 index 3ddc3d4d..00000000 --- a/src/Definitions/toColorAndBackFade/toColorAndBackFade.frag +++ /dev/null @@ -1,17 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -uniform vec4 color; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - float mix_amount = (mix *2.0) - 1.0; - if(mix_amount < 0.0){ - gl_FragColor = abs(mix_amount) * color_a + (1.0 - abs(mix_amount)) * color; - } else { - gl_FragColor = mix_amount * color_b + (1.0 - mix_amount) * color; - } -} diff --git a/src/Definitions/toColorAndBackFade/toColorAndBackFade.js b/src/Definitions/toColorAndBackFade/toColorAndBackFade.js deleted file mode 100644 index 4c6dbbba..00000000 --- a/src/Definitions/toColorAndBackFade/toColorAndBackFade.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./toColorAndBackFade.vert"; -import fragmentShader from "./toColorAndBackFade.frag"; - -let toColorAndBackFade = { - title: "To Color And Back Fade", - description: - "A fade to black and back effect. Setting mix to 0.5 is a fully solid color frame. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 }, - color: { type: "uniform", value: [0.0, 0.0, 0.0, 0.0] } - }, - inputs: ["u_image_a", "u_image_b"] -}; -export default toColorAndBackFade; diff --git a/src/Definitions/toColorAndBackFade/toColorAndBackFade.vert b/src/Definitions/toColorAndBackFade/toColorAndBackFade.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/toColorAndBackFade/toColorAndBackFade.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/Definitions/verticalBlur/index.ts b/src/Definitions/verticalBlur/index.ts new file mode 100644 index 00000000..921d7532 --- /dev/null +++ b/src/Definitions/verticalBlur/index.ts @@ -0,0 +1,62 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +uniform float blurAmount; +varying vec2 v_blurTexCoords[14]; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; + v_blurTexCoords[ 0] = v_texCoord + vec2(0.0,-0.028 * blurAmount); + v_blurTexCoords[ 1] = v_texCoord + vec2(0.0,-0.024 * blurAmount); + v_blurTexCoords[ 2] = v_texCoord + vec2(0.0,-0.020 * blurAmount); + v_blurTexCoords[ 3] = v_texCoord + vec2(0.0,-0.016 * blurAmount); + v_blurTexCoords[ 4] = v_texCoord + vec2(0.0,-0.012 * blurAmount); + v_blurTexCoords[ 5] = v_texCoord + vec2(0.0,-0.008 * blurAmount); + v_blurTexCoords[ 6] = v_texCoord + vec2(0.0,-0.004 * blurAmount); + v_blurTexCoords[ 7] = v_texCoord + vec2(0.0, 0.004 * blurAmount); + v_blurTexCoords[ 8] = v_texCoord + vec2(0.0, 0.008 * blurAmount); + v_blurTexCoords[ 9] = v_texCoord + vec2(0.0, 0.012 * blurAmount); + v_blurTexCoords[10] = v_texCoord + vec2(0.0, 0.016 * blurAmount); + v_blurTexCoords[11] = v_texCoord + vec2(0.0, 0.020 * blurAmount); + v_blurTexCoords[12] = v_texCoord + vec2(0.0, 0.024 * blurAmount); + v_blurTexCoords[13] = v_texCoord + vec2(0.0, 0.028 * blurAmount); +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +varying vec2 v_texCoord; +varying vec2 v_blurTexCoords[14]; +void main(){ + gl_FragColor = vec4(0.0); + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 0])*0.0044299121055113265; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 1])*0.00895781211794; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 2])*0.0215963866053; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 3])*0.0443683338718; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 4])*0.0776744219933; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 5])*0.115876621105; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 6])*0.147308056121; + gl_FragColor += texture2D(u_image, v_texCoord )*0.159576912161; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 7])*0.147308056121; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 8])*0.115876621105; + gl_FragColor += texture2D(u_image, v_blurTexCoords[ 9])*0.0776744219933; + gl_FragColor += texture2D(u_image, v_blurTexCoords[10])*0.0443683338718; + gl_FragColor += texture2D(u_image, v_blurTexCoords[11])*0.0215963866053; + gl_FragColor += texture2D(u_image, v_blurTexCoords[12])*0.00895781211794; + gl_FragColor += texture2D(u_image, v_blurTexCoords[13])*0.0044299121055113265; +}`; + +const verticalBlur: IDefinition = { + title: "Vertical Blur", + description: + "A vertical blur effect. Adpated from http://xissburg.com/faster-gaussian-blur-in-glsl/", + vertexShader, + fragmentShader, + properties: { + blurAmount: { type: "uniform", value: 1.0 } + }, + inputs: ["u_image"] +}; + +export default verticalBlur; diff --git a/src/Definitions/verticalBlur/package.json b/src/Definitions/verticalBlur/package.json deleted file mode 100644 index bc8ebe92..00000000 --- a/src/Definitions/verticalBlur/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "verticalBlur", - "version": "0.0.0", - "private": true, - "main": "./verticalBlur.js" -} diff --git a/src/Definitions/verticalBlur/verticalBlur.frag b/src/Definitions/verticalBlur/verticalBlur.frag deleted file mode 100644 index 4f973741..00000000 --- a/src/Definitions/verticalBlur/verticalBlur.frag +++ /dev/null @@ -1,22 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -varying vec2 v_texCoord; -varying vec2 v_blurTexCoords[14]; -void main(){ - gl_FragColor = vec4(0.0); - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 0])*0.0044299121055113265; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 1])*0.00895781211794; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 2])*0.0215963866053; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 3])*0.0443683338718; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 4])*0.0776744219933; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 5])*0.115876621105; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 6])*0.147308056121; - gl_FragColor += texture2D(u_image, v_texCoord )*0.159576912161; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 7])*0.147308056121; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 8])*0.115876621105; - gl_FragColor += texture2D(u_image, v_blurTexCoords[ 9])*0.0776744219933; - gl_FragColor += texture2D(u_image, v_blurTexCoords[10])*0.0443683338718; - gl_FragColor += texture2D(u_image, v_blurTexCoords[11])*0.0215963866053; - gl_FragColor += texture2D(u_image, v_blurTexCoords[12])*0.00895781211794; - gl_FragColor += texture2D(u_image, v_blurTexCoords[13])*0.0044299121055113265; -} diff --git a/src/Definitions/verticalBlur/verticalBlur.js b/src/Definitions/verticalBlur/verticalBlur.js deleted file mode 100644 index 2dce8bb8..00000000 --- a/src/Definitions/verticalBlur/verticalBlur.js +++ /dev/null @@ -1,16 +0,0 @@ -import vertexShader from "./verticalBlur.vert"; -import fragmentShader from "./verticalBlur.frag"; - -let verticalBlur = { - title: "Vertical Blur", - description: - "A vertical blur effect. Adpated from http://xissburg.com/faster-gaussian-blur-in-glsl/", - vertexShader, - fragmentShader, - properties: { - blurAmount: { type: "uniform", value: 1.0 } - }, - inputs: ["u_image"] -}; - -export default verticalBlur; diff --git a/src/Definitions/verticalBlur/verticalBlur.vert b/src/Definitions/verticalBlur/verticalBlur.vert deleted file mode 100644 index 2c42a191..00000000 --- a/src/Definitions/verticalBlur/verticalBlur.vert +++ /dev/null @@ -1,23 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -uniform float blurAmount; -varying vec2 v_blurTexCoords[14]; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; - v_blurTexCoords[ 0] = v_texCoord + vec2(0.0,-0.028 * blurAmount); - v_blurTexCoords[ 1] = v_texCoord + vec2(0.0,-0.024 * blurAmount); - v_blurTexCoords[ 2] = v_texCoord + vec2(0.0,-0.020 * blurAmount); - v_blurTexCoords[ 3] = v_texCoord + vec2(0.0,-0.016 * blurAmount); - v_blurTexCoords[ 4] = v_texCoord + vec2(0.0,-0.012 * blurAmount); - v_blurTexCoords[ 5] = v_texCoord + vec2(0.0,-0.008 * blurAmount); - v_blurTexCoords[ 6] = v_texCoord + vec2(0.0,-0.004 * blurAmount); - v_blurTexCoords[ 7] = v_texCoord + vec2(0.0, 0.004 * blurAmount); - v_blurTexCoords[ 8] = v_texCoord + vec2(0.0, 0.008 * blurAmount); - v_blurTexCoords[ 9] = v_texCoord + vec2(0.0, 0.012 * blurAmount); - v_blurTexCoords[10] = v_texCoord + vec2(0.0, 0.016 * blurAmount); - v_blurTexCoords[11] = v_texCoord + vec2(0.0, 0.020 * blurAmount); - v_blurTexCoords[12] = v_texCoord + vec2(0.0, 0.024 * blurAmount); - v_blurTexCoords[13] = v_texCoord + vec2(0.0, 0.028 * blurAmount); -} diff --git a/src/Definitions/verticalWipe/index.ts b/src/Definitions/verticalWipe/index.ts new file mode 100644 index 00000000..c0d11a16 --- /dev/null +++ b/src/Definitions/verticalWipe/index.ts @@ -0,0 +1,38 @@ +import type { IDefinition } from "../../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image_a; +uniform sampler2D u_image_b; +uniform float mix; +varying vec2 v_texCoord; +varying float v_mix; +void main(){ + vec4 color_a = texture2D(u_image_a, v_texCoord); + vec4 color_b = texture2D(u_image_b, v_texCoord); + if (v_texCoord[1] > mix){ + gl_FragColor = color_a; + } else { + gl_FragColor = color_b; + } +}`; + +const verticalWipe: IDefinition = { + title: "vertical Wipe", + description: "A vertical wipe effect. Typically used as a transition.", + vertexShader, + fragmentShader, + properties: { + mix: { type: "uniform", value: 0.0 } + }, + inputs: ["u_image_a", "u_image_b"] +}; + +export default verticalWipe; diff --git a/src/Definitions/verticalWipe/package.json b/src/Definitions/verticalWipe/package.json deleted file mode 100644 index ed69cf94..00000000 --- a/src/Definitions/verticalWipe/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "verticalWipe", - "version": "0.0.0", - "private": true, - "main": "./verticalWipe.js" -} diff --git a/src/Definitions/verticalWipe/verticalWipe.frag b/src/Definitions/verticalWipe/verticalWipe.frag deleted file mode 100644 index 11a06328..00000000 --- a/src/Definitions/verticalWipe/verticalWipe.frag +++ /dev/null @@ -1,15 +0,0 @@ -precision mediump float; -uniform sampler2D u_image_a; -uniform sampler2D u_image_b; -uniform float mix; -varying vec2 v_texCoord; -varying float v_mix; -void main(){ - vec4 color_a = texture2D(u_image_a, v_texCoord); - vec4 color_b = texture2D(u_image_b, v_texCoord); - if (v_texCoord[1] > mix){ - gl_FragColor = color_a; - } else { - gl_FragColor = color_b; - } -} diff --git a/src/Definitions/verticalWipe/verticalWipe.js b/src/Definitions/verticalWipe/verticalWipe.js deleted file mode 100644 index 1d249e91..00000000 --- a/src/Definitions/verticalWipe/verticalWipe.js +++ /dev/null @@ -1,15 +0,0 @@ -import vertexShader from "./verticalWipe.vert"; -import fragmentShader from "./verticalWipe.frag"; - -let verticalWipe = { - title: "vertical Wipe", - description: "A vertical wipe effect. Typically used as a transistion.", - vertexShader, - fragmentShader, - properties: { - mix: { type: "uniform", value: 0.0 } - }, - inputs: ["u_image_a", "u_image_b"] -}; - -export default verticalWipe; diff --git a/src/Definitions/verticalWipe/verticalWipe.vert b/src/Definitions/verticalWipe/verticalWipe.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/Definitions/verticalWipe/verticalWipe.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/DestinationNode/destinationnode.frag b/src/DestinationNode/destinationnode.frag deleted file mode 100644 index 24c34cb0..00000000 --- a/src/DestinationNode/destinationnode.frag +++ /dev/null @@ -1,7 +0,0 @@ -precision mediump float; -uniform sampler2D u_image; -varying vec2 v_texCoord; -varying float v_progress; -void main(){ - gl_FragColor = texture2D(u_image, v_texCoord); -} diff --git a/src/DestinationNode/destinationnode.js b/src/DestinationNode/destinationnode.ts similarity index 53% rename from src/DestinationNode/destinationnode.js rename to src/DestinationNode/destinationnode.ts index 01ac4fc9..845df42b 100644 --- a/src/DestinationNode/destinationnode.js +++ b/src/DestinationNode/destinationnode.ts @@ -1,7 +1,23 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import ProcessingNode from "../ProcessingNodes/processingnode"; -import fragmentShader from "./destinationnode.frag"; -import vertexShader from "./destinationnode.vert"; +import ProcessingNode from "../ProcessingNodes/processingnode.js"; +import type RenderGraph from "../rendergraph.js"; +import type { IDefinition } from "../types.js"; + +const vertexShader = `attribute vec2 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +void main() { + gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); + v_texCoord = a_texCoord; +}`; + +const fragmentShader = `precision mediump float; +uniform sampler2D u_image; +varying vec2 v_texCoord; +varying float v_progress; +void main(){ + gl_FragColor = texture2D(u_image, v_texCoord); +}`; const TYPE = "DestinationNode"; @@ -9,12 +25,12 @@ class DestinationNode extends ProcessingNode { /** * Initialise an instance of a DestinationNode. * - * There should only be a single instance of a DestinationNode per VideoContext instance. An VideoContext's destination can be accessed like so: videoContext.desitnation. + * There should only be a single instance of a DestinationNode per VideoContext instance. A VideoContext's destination can be accessed like so: videoContext.destination. * * You should not instantiate this directly. */ - constructor(gl, renderGraph) { - let definition = { + constructor(gl: WebGLRenderingContext, renderGraph: RenderGraph) { + const definition: IDefinition = { fragmentShader, vertexShader, properties: {}, @@ -25,21 +41,21 @@ class DestinationNode extends ProcessingNode { this._displayName = TYPE; } - _render() { - let gl = this._gl; + _render(): void { + const gl = this._gl; gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); gl.enable(gl.BLEND); - gl.clearColor(0, 0, 0, 0.0); // green; + gl.clearColor(0, 0, 0, 0.0); gl.clear(gl.COLOR_BUFFER_BIT); this.inputs.forEach(node => { super._render(); //map the input textures input the node - var texture = node._texture; + const texture = (node as unknown as { _texture: WebGLTexture })._texture; - for (let mapping of this._shaderInputsTextureUnitMapping) { + for (const mapping of this._shaderInputsTextureUnitMapping) { gl.activeTexture(mapping.textureUnit); gl.uniform1i(mapping.location, mapping.textureUnitIndex); gl.bindTexture(gl.TEXTURE_2D, texture); diff --git a/src/DestinationNode/destinationnode.vert b/src/DestinationNode/destinationnode.vert deleted file mode 100644 index cd4e9932..00000000 --- a/src/DestinationNode/destinationnode.vert +++ /dev/null @@ -1,7 +0,0 @@ -attribute vec2 a_position; -attribute vec2 a_texCoord; -varying vec2 v_texCoord; -void main() { - gl_Position = vec4(vec2(2.0,2.0)*a_position-vec2(1.0, 1.0), 0.0, 1.0); - v_texCoord = a_texCoord; -} diff --git a/src/ProcessingNodes/compositingnode.js b/src/ProcessingNodes/compositingnode.ts similarity index 66% rename from src/ProcessingNodes/compositingnode.js rename to src/ProcessingNodes/compositingnode.ts index 11692b00..fad3e106 100644 --- a/src/ProcessingNodes/compositingnode.js +++ b/src/ProcessingNodes/compositingnode.ts @@ -1,15 +1,19 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import ProcessingNode from "./processingnode"; +import ProcessingNode from "./processingnode.js"; import { createElementTexture } from "../utils.js"; +import type RenderGraph from "../rendergraph.js"; +import type { IDefinition } from "../types.js"; const TYPE = "CompositingNode"; class CompositingNode extends ProcessingNode { + _placeholderTexture: WebGLTexture; + /** - * Initialise an instance of a Compositing Node. You should not instantiate this directly, but use VideoContest.createCompositingNode(). + * Initialise an instance of a CompositingNode. You should not instantiate this directly, but use VideoContext.compositor(). */ - constructor(gl, renderGraph, definition) { - let placeholderTexture = createElementTexture(gl); + constructor(gl: WebGLRenderingContext, renderGraph: RenderGraph, definition: IDefinition) { + const placeholderTexture = createElementTexture(gl); gl.texImage2D( gl.TEXTURE_2D, 0, @@ -26,17 +30,17 @@ class CompositingNode extends ProcessingNode { this._displayName = TYPE; } - _render() { - let gl = this._gl; + _render(): void { + const gl = this._gl; gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffer); gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, - this._texture, + this._texture as WebGLTexture, 0 ); - gl.clearColor(0, 0, 0, 0); // green; + gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); @@ -45,9 +49,9 @@ class CompositingNode extends ProcessingNode { super._render(); //map the input textures input the node - var texture = node._texture; + const texture = (node as unknown as { _texture: WebGLTexture })._texture; - for (let mapping of this._shaderInputsTextureUnitMapping) { + for (const mapping of this._shaderInputsTextureUnitMapping) { gl.activeTexture(mapping.textureUnit); gl.uniform1i(mapping.location, mapping.textureUnitIndex); gl.bindTexture(gl.TEXTURE_2D, texture); diff --git a/src/ProcessingNodes/effectnode.js b/src/ProcessingNodes/effectnode.ts similarity index 61% rename from src/ProcessingNodes/effectnode.js rename to src/ProcessingNodes/effectnode.ts index 429bd18f..f83a4f1b 100644 --- a/src/ProcessingNodes/effectnode.js +++ b/src/ProcessingNodes/effectnode.ts @@ -1,15 +1,19 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import ProcessingNode from "./processingnode"; +import ProcessingNode from "./processingnode.js"; import { createElementTexture } from "../utils.js"; +import type RenderGraph from "../rendergraph.js"; +import type { IDefinition } from "../types.js"; const TYPE = "EffectNode"; class EffectNode extends ProcessingNode { + _placeholderTexture: WebGLTexture; + /** - * Initialise an instance of an EffectNode. You should not instantiate this directly, but use VideoContest.createEffectNode(). + * Initialise an instance of an EffectNode. You should not instantiate this directly, but use VideoContext.effect(). */ - constructor(gl, renderGraph, definition) { - let placeholderTexture = createElementTexture(gl); + constructor(gl: WebGLRenderingContext, renderGraph: RenderGraph, definition: IDefinition) { + const placeholderTexture = createElementTexture(gl); gl.texImage2D( gl.TEXTURE_2D, 0, @@ -28,29 +32,30 @@ class EffectNode extends ProcessingNode { this._displayName = TYPE; } - _render() { - let gl = this._gl; + _render(): void { + const gl = this._gl; gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffer); gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, - this._texture, + this._texture as WebGLTexture, 0 ); - gl.clearColor(0, 0, 0, 0); // green; + gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); gl.blendFunc(gl.ONE, gl.ZERO); super._render(); - let inputs = this._renderGraph.getInputsForNode(this); + const inputs = this._renderGraph.getInputsForNode(this); - for (var i = 0; i < this._shaderInputsTextureUnitMapping.length; i++) { + for (let i = 0; i < this._shaderInputsTextureUnitMapping.length; i++) { let inputTexture = this._placeholderTexture; - let textureUnit = this._shaderInputsTextureUnitMapping[i].textureUnit; - if (i < inputs.length && inputs[i] !== undefined) { - inputTexture = inputs[i]._texture; + const textureUnit = this._shaderInputsTextureUnitMapping[i].textureUnit; + const input = inputs[i]; + if (i < inputs.length && input !== undefined) { + inputTexture = (input as unknown as { _texture: WebGLTexture })._texture; } gl.activeTexture(textureUnit); diff --git a/src/ProcessingNodes/processingnode.js b/src/ProcessingNodes/processingnode.ts similarity index 60% rename from src/ProcessingNodes/processingnode.js rename to src/ProcessingNodes/processingnode.ts index 209177f5..92f407d5 100644 --- a/src/ProcessingNodes/processingnode.js +++ b/src/ProcessingNodes/processingnode.ts @@ -1,5 +1,5 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import GraphNode from "../graphnode"; +import GraphNode from "../graphnode.js"; import { compileShader, createShaderProgram, @@ -7,29 +7,67 @@ import { updateTexture } from "../utils.js"; import { RenderException } from "../exceptions.js"; +import type RenderGraph from "../rendergraph.js"; +import type { IDefinition, PropertyValue } from "../types.js"; const TYPE = "ProcessingNode"; +interface IProcessingNodeProperty { + type: string; + value: PropertyValue; + texture?: WebGLTexture; + textureUnit?: number; + textureUnitIndex?: number; + location?: WebGLUniformLocation | null; +} + +interface IShaderInputTextureUnitMapping { + name: string; + textureUnit: number; + textureUnitIndex: number; + location: WebGLUniformLocation | null; +} + class ProcessingNode extends GraphNode { + _vertexShader: WebGLShader; + _fragmentShader: WebGLShader; + _definition: IDefinition; + _properties: Record; + _shaderInputsTextureUnitMapping: IShaderInputTextureUnitMapping[]; + _maxTextureUnits: number; + _boundTextureUnits: number; + _texture: WebGLTexture | undefined; + _program: WebGLProgram; + _framebuffer: WebGLFramebuffer | null; + _currentTimeLocation: WebGLUniformLocation | null; + _currentTime: number; + _vertexBuffer: WebGLBuffer | undefined; + /** * Initialise an instance of a ProcessingNode. * * This class is not used directly, but is extended to create CompositingNodes, TransitionNodes, and EffectNodes. */ - constructor(gl, renderGraph, definition, inputNames, limitConnections) { + constructor( + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + definition: IDefinition, + inputNames: string[], + limitConnections: boolean + ) { super(gl, renderGraph, inputNames, limitConnections); this._vertexShader = compileShader(gl, definition.vertexShader, gl.VERTEX_SHADER); this._fragmentShader = compileShader(gl, definition.fragmentShader, gl.FRAGMENT_SHADER); this._definition = definition; - this._properties = {}; //definition.properties; + this._properties = {}; //copy definition properties - for (let propertyName in definition.properties) { + for (const propertyName in definition.properties) { let propertyValue = definition.properties[propertyName].value; //if an array then shallow copy it - if (Object.prototype.toString.call(propertyValue) === "[object Array]") { - propertyValue = definition.properties[propertyName].value.slice(); + if (Array.isArray(propertyValue)) { + propertyValue = propertyValue.slice(); } - let propertyType = definition.properties[propertyName].type; + const propertyType = definition.properties[propertyName].type; this._properties[propertyName] = { type: propertyType, value: propertyValue @@ -39,7 +77,8 @@ class ProcessingNode extends GraphNode { this._shaderInputsTextureUnitMapping = []; this._maxTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); this._boundTextureUnits = 0; - this._texture = createElementTexture(gl); + const texture: WebGLTexture = createElementTexture(gl); + this._texture = texture; gl.texImage2D( gl.TEXTURE_2D, 0, @@ -57,30 +96,24 @@ class ProcessingNode extends GraphNode { //create and setup the framebuffer this._framebuffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, this._framebuffer); - gl.framebufferTexture2D( - gl.FRAMEBUFFER, - gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, - this._texture, - 0 - ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); gl.bindFramebuffer(gl.FRAMEBUFFER, null); //create properties on this object for the passed properties - for (let propertyName in this._properties) { + for (const propertyName in this._properties) { Object.defineProperty(this, propertyName, { - get: function() { + get: function (this: ProcessingNode) { return this._properties[propertyName].value; }, - set: function(passedValue) { + set: function (this: ProcessingNode, passedValue: PropertyValue) { this._properties[propertyName].value = passedValue; } }); } - //create texutres for any texture properties - for (let propertyName in this._properties) { - let propertyValue = this._properties[propertyName].value; + //create textures for any texture properties + for (const propertyName in this._properties) { + const propertyValue = this._properties[propertyName].value; if (propertyValue instanceof Image) { this._properties[propertyName].texture = createElementTexture(gl); this._properties[propertyName].textureUnit = gl.TEXTURE0 + this._boundTextureUnits; @@ -95,7 +128,7 @@ class ProcessingNode extends GraphNode { } // calculate texture units for input textures - for (let inputName of definition.inputs) { + for (const inputName of definition.inputs) { this._shaderInputsTextureUnitMapping.push({ name: inputName, textureUnit: gl.TEXTURE0 + this._boundTextureUnits, @@ -111,7 +144,7 @@ class ProcessingNode extends GraphNode { } //find the locations of the properties in the compiled shader - for (let propertyName in this._properties) { + for (const propertyName in this._properties) { if (this._properties[propertyName].type === "uniform") { this._properties[propertyName].location = this._gl.getUniformLocation( this._program, @@ -123,9 +156,9 @@ class ProcessingNode extends GraphNode { this._currentTime = 0; //Other setup - let positionLocation = gl.getAttribLocation(this._program, "a_position"); - let buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + const positionLocation = gl.getAttribLocation(this._program, "a_position"); + this._vertexBuffer = gl.createBuffer() as WebGLBuffer; + gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.enableVertexAttribArray(positionLocation); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); gl.bufferData( @@ -133,7 +166,7 @@ class ProcessingNode extends GraphNode { new Float32Array([1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0]), gl.STATIC_DRAW ); - let texCoordLocation = gl.getAttribLocation(this._program, "a_texCoord"); + const texCoordLocation = gl.getAttribLocation(this._program, "a_texCoord"); gl.enableVertexAttribArray(texCoordLocation); gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); this._displayName = TYPE; @@ -149,40 +182,43 @@ class ProcessingNode extends GraphNode { * var monoNode = ctx.effect(VideoContext.DEFINITIONS.MONOCHROME); * monoNode.setProperty("inputMix", [1.0,0.0,0.0]); //Just use red channel */ - setProperty(name, value) { + setProperty(name: string, value: PropertyValue): void { this._properties[name].value = value; } /** - * Sets the passed processing node property to the passed value. + * Gets the value of the passed processing node property. * @param {string} name - The name of the processing node parameter to get. * * @example * var ctx = new VideoContext(); * var monoNode = ctx.effect(VideoContext.DEFINITIONS.MONOCHROME); * console.log(monoNode.getProperty("inputMix")); //Will output [0.4,0.6,0.2], the default value from the effect definition. - * */ - getProperty(name) { + getProperty(name: string): PropertyValue { return this._properties[name].value; } /** * Destroy and clean-up the node. */ - destroy() { + destroy(): void { super.destroy(); - //destrpy texutres for any texture properties - for (let propertyName in this._properties) { - let propertyValue = this._properties[propertyName].value; + //destroy textures for any texture properties + for (const propertyName in this._properties) { + const propertyValue = this._properties[propertyName].value; if (propertyValue instanceof Image) { - this._gl.deleteTexture(this._properties[propertyName].texture); - this._texture = undefined; + const texture = this._properties[propertyName].texture; + if (texture) this._gl.deleteTexture(texture); + this._properties[propertyName].texture = undefined; } } //Destroy main - this._gl.deleteTexture(this._texture); + if (this._texture) this._gl.deleteTexture(this._texture); this._texture = undefined; + //Delete vertex buffer + if (this._vertexBuffer) this._gl.deleteBuffer(this._vertexBuffer); + this._vertexBuffer = undefined; //Detach shaders this._gl.detachShader(this._program, this._vertexShader); this._gl.detachShader(this._program, this._fragmentShader); @@ -195,41 +231,41 @@ class ProcessingNode extends GraphNode { this._gl.deleteFramebuffer(this._framebuffer); } - _update(currentTime) { + _update(currentTime: number): void { this._currentTime = currentTime; } - _seek(currentTime) { + _seek(currentTime: number): void { this._currentTime = currentTime; } - _render() { + _render(): void { this._rendered = true; - let gl = this._gl; + const gl = this._gl; gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); gl.useProgram(this._program); //upload the default uniforms - gl.uniform1f(this._currentTimeLocation, parseFloat(this._currentTime)); + gl.uniform1f(this._currentTimeLocation, this._currentTime); - for (let propertyName in this._properties) { - let propertyValue = this._properties[propertyName].value; - let propertyType = this._properties[propertyName].type; - let propertyLocation = this._properties[propertyName].location; + for (const propertyName in this._properties) { + const propertyValue = this._properties[propertyName].value; + const propertyType = this._properties[propertyName].type; + const propertyLocation = this._properties[propertyName].location; if (propertyType !== "uniform") continue; if (typeof propertyValue === "number") { - gl.uniform1f(propertyLocation, propertyValue); - } else if (Object.prototype.toString.call(propertyValue) === "[object Array]") { + gl.uniform1f(propertyLocation as WebGLUniformLocation, propertyValue); + } else if (Array.isArray(propertyValue)) { if (propertyValue.length === 1) { - gl.uniform1fv(propertyLocation, propertyValue); + gl.uniform1fv(propertyLocation as WebGLUniformLocation, propertyValue); } else if (propertyValue.length === 2) { - gl.uniform2fv(propertyLocation, propertyValue); + gl.uniform2fv(propertyLocation as WebGLUniformLocation, propertyValue); } else if (propertyValue.length === 3) { - gl.uniform3fv(propertyLocation, propertyValue); + gl.uniform3fv(propertyLocation as WebGLUniformLocation, propertyValue); } else if (propertyValue.length === 4) { - gl.uniform4fv(propertyLocation, propertyValue); + gl.uniform4fv(propertyLocation as WebGLUniformLocation, propertyValue); } else { console.debug( "Shader parameter", @@ -239,19 +275,14 @@ class ProcessingNode extends GraphNode { ); } } else if (propertyValue instanceof Image) { - let texture = this._properties[propertyName].texture; - let textureUnit = this._properties[propertyName].textureUnit; - let textureUnitIndex = this._properties[propertyName].textureUnit; + const texture = this._properties[propertyName].texture as WebGLTexture; + const textureUnit = this._properties[propertyName].textureUnit as number; + const textureUnitIndex = this._properties[propertyName].textureUnitIndex as number; updateTexture(gl, texture, propertyValue); gl.activeTexture(textureUnit); - gl.uniform1i(propertyLocation, textureUnitIndex); + gl.uniform1i(propertyLocation as WebGLUniformLocation, textureUnitIndex); gl.bindTexture(gl.TEXTURE_2D, texture); - } else { - //TODO - add tests for textures - /*gl.activeTexture(gl.TEXTURE0 + textureOffset); - gl.uniform1i(parameterLoctation, textureOffset); - gl.bindTexture(gl.TEXTURE_2D, textures[textureOffset-1]);*/ } } } diff --git a/src/ProcessingNodes/transitionnode.js b/src/ProcessingNodes/transitionnode.ts similarity index 64% rename from src/ProcessingNodes/transitionnode.js rename to src/ProcessingNodes/transitionnode.ts index c62f6984..fc9cb214 100644 --- a/src/ProcessingNodes/transitionnode.js +++ b/src/ProcessingNodes/transitionnode.ts @@ -1,27 +1,40 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import EffectNode from "./effectnode"; +import EffectNode from "./effectnode.js"; +import type RenderGraph from "../rendergraph.js"; +import type { IDefinition, PropertyValue } from "../types.js"; const TYPE = "TransitionNode"; +export interface ITransition { + start: number; + end: number; + current: number; + target: number; + property: string; +} + class TransitionNode extends EffectNode { + _transitions: Record; + _initialPropertyValues: Record; + /** - * Initialise an instance of a TransitionNode. You should not instantiate this directly, but use VideoContest.createTransitonNode(). + * Initialise an instance of a TransitionNode. You should not instantiate this directly, but use VideoContext.transition(). */ - constructor(gl, renderGraph, definition) { + constructor(gl: WebGLRenderingContext, renderGraph: RenderGraph, definition: IDefinition) { super(gl, renderGraph, definition); this._transitions = {}; //save a version of the original property values this._initialPropertyValues = {}; - for (let propertyName in this._properties) { + for (const propertyName in this._properties) { this._initialPropertyValues[propertyName] = this._properties[propertyName].value; } this._displayName = TYPE; } - _doesTransitionFitOnTimeline(testTransition) { + _doesTransitionFitOnTimeline(testTransition: ITransition): boolean { if (this._transitions[testTransition.property] === undefined) return true; - for (let transition of this._transitions[testTransition.property]) { + for (const transition of this._transitions[testTransition.property]) { if (testTransition.start > transition.start && testTransition.start < transition.end) return false; if (testTransition.end > transition.start && testTransition.end < transition.end) @@ -34,12 +47,12 @@ class TransitionNode extends EffectNode { return true; } - _insertTransitionInTimeline(transition) { + _insertTransitionInTimeline(transition: ITransition): void { if (this._transitions[transition.property] === undefined) this._transitions[transition.property] = []; this._transitions[transition.property].push(transition); - this._transitions[transition.property].sort(function(a, b) { + this._transitions[transition.property].sort(function (a, b) { return a.start - b.start; }); } @@ -51,12 +64,18 @@ class TransitionNode extends EffectNode { * @param {number} endTime - The time at which the transition should be completed by (relative to currentTime of video context). * @param {number} currentValue - The value to start the transition at. * @param {number} targetValue - The value to transition to by endTime. - * @param {String} propertyName - The name of the property to clear transitions on, if undefined default to "mix". + * @param {String} propertyName - The name of the property to transition, if undefined default to "mix". * * @return {Boolean} returns True if a transition is successfully added, false otherwise. */ - transition(startTime, endTime, currentValue, targetValue, propertyName = "mix") { - let transition = { + transition( + startTime: number, + endTime: number, + currentValue: number, + targetValue: number, + propertyName = "mix" + ): boolean { + const transition: ITransition = { start: startTime + this._currentTime, end: endTime + this._currentTime, current: currentValue, @@ -75,12 +94,18 @@ class TransitionNode extends EffectNode { * @param {number} endTime - The time at which the transition should be completed by (relative to time 0). * @param {number} currentValue - The value to start the transition at. * @param {number} targetValue - The value to transition to by endTime. - * @param {String} propertyName - The name of the property to clear transitions on, if undefined default to "mix". + * @param {String} propertyName - The name of the property to transition, if undefined default to "mix". * * @return {Boolean} returns True if a transition is successfully added, false otherwise. */ - transitionAt(startTime, endTime, currentValue, targetValue, propertyName = "mix") { - let transition = { + transitionAt( + startTime: number, + endTime: number, + currentValue: number, + targetValue: number, + propertyName = "mix" + ): boolean { + const transition: ITransition = { start: startTime, end: endTime, current: currentValue, @@ -93,11 +118,11 @@ class TransitionNode extends EffectNode { } /** - * Clear all transistions on the passed property. If no property is defined clear all transitions on the node. + * Clear all transitions on the passed property. If no property is defined clear all transitions on the node. * * @param {String} propertyName - The name of the property to clear transitions on, if undefined clear all transitions on the node. */ - clearTransitions(propertyName) { + clearTransitions(propertyName?: string): void { if (propertyName === undefined) { this._transitions = {}; } else { @@ -106,17 +131,18 @@ class TransitionNode extends EffectNode { } /** - * Clear a transistion on the passed property that the specified time lies within. + * Clear a transition on the passed property that the specified time lies within. * * @param {String} propertyName - The name of the property to clear a transition on. - * @param {number} time - A time which lies within the property you're trying to clear. + * @param {number} time - A time which lies within the transition you're trying to clear. * * @return {Boolean} returns True if a transition is removed, false otherwise. */ - clearTransition(propertyName, time) { - let transitionIndex = undefined; - for (var i = 0; i < this._transitions[propertyName].length; i++) { - let transition = this._transitions[propertyName][i]; + clearTransition(propertyName: string, time: number): boolean { + if (this._transitions[propertyName] === undefined) return false; + let transitionIndex: number | undefined = undefined; + for (let i = 0; i < this._transitions[propertyName].length; i++) { + const transition = this._transitions[propertyName][i]; if (time > transition.start && time < transition.end) { transitionIndex = i; } @@ -128,34 +154,36 @@ class TransitionNode extends EffectNode { return false; } - _update(currentTime) { + _update(currentTime: number): void { super._update(currentTime); - for (let propertyName in this._transitions) { - let value = this[propertyName]; + for (const propertyName in this._transitions) { + let value = (this as unknown as Record)[propertyName]; if (this._transitions[propertyName].length > 0) { value = this._transitions[propertyName][0].current; } let transitionActive = false; - for (var i = 0; i < this._transitions[propertyName].length; i++) { - let transition = this._transitions[propertyName][i]; + for (let i = 0; i < this._transitions[propertyName].length; i++) { + const transition = this._transitions[propertyName][i]; if (currentTime > transition.end) { value = transition.target; continue; } if (currentTime > transition.start && currentTime < transition.end) { - let difference = transition.target - transition.current; - let progress = + const difference = transition.target - transition.current; + const progress = (this._currentTime - transition.start) / (transition.end - transition.start); transitionActive = true; - this[propertyName] = transition.current + difference * progress; + (this as unknown as Record)[propertyName] = + transition.current + difference * progress; break; } } - if (!transitionActive) this[propertyName] = value; + if (!transitionActive) + (this as unknown as Record)[propertyName] = value; } } } diff --git a/src/SourceNodes/audionode.js b/src/SourceNodes/audionode.ts similarity index 64% rename from src/SourceNodes/audionode.js rename to src/SourceNodes/audionode.ts index d86a8d6d..d1476b2d 100644 --- a/src/SourceNodes/audionode.js +++ b/src/SourceNodes/audionode.ts @@ -1,20 +1,21 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import MediaNode from "./medianode"; +import MediaNode from "./medianode.js"; const TYPE = "AudioNode"; + class AudioNode extends MediaNode { /** * Initialise an instance of an AudioNode. * This should not be called directly, but created through a call to videoContext.audio(); */ - constructor() { - super(...arguments); + constructor(...args: ConstructorParameters) { + super(...args); this._displayName = TYPE; this._elementType = "audio"; } - _update(currentTime) { - super._update(currentTime, false); + _update(currentTime: number): boolean { + return super._update(currentTime, false); } } diff --git a/src/SourceNodes/canvasnode.js b/src/SourceNodes/canvasnode.ts similarity index 75% rename from src/SourceNodes/canvasnode.js rename to src/SourceNodes/canvasnode.ts index 8b54f26e..3e166b44 100644 --- a/src/SourceNodes/canvasnode.js +++ b/src/SourceNodes/canvasnode.ts @@ -1,30 +1,41 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import SourceNode, { SOURCENODESTATE } from "./sourcenode"; +import SourceNode, { SOURCENODESTATE } from "./sourcenode.js"; +import type RenderGraph from "../rendergraph.js"; const TYPE = "CanvasNode"; + class CanvasNode extends SourceNode { + declare _element: HTMLCanvasElement | undefined; + _preloadTime: number; + /** * Initialise an instance of a CanvasNode. - * This should not be called directly, but created through a call to videoContext.createCanvasNode(); + * This should not be called directly, but created through a call to videoContext.canvas(); */ - constructor(canvas, gl, renderGraph, currentTime, preloadTime = 4) { + constructor( + canvas: HTMLCanvasElement, + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + currentTime: number, + preloadTime = 4 + ) { super(canvas, gl, renderGraph, currentTime); this._preloadTime = preloadTime; this._displayName = TYPE; } - _load() { + _load(): void { super._load(); this._ready = true; this._triggerCallbacks("loaded"); } - _unload() { + _unload(): void { super._unload(); this._ready = false; } - _seek(time) { + _seek(time: number): void { super._seek(time); if (this.state === SOURCENODESTATE.playing || this.state === SOURCENODESTATE.paused) { if (this._element === undefined) this._load(); @@ -38,7 +49,7 @@ class CanvasNode extends SourceNode { } } - _update(currentTime) { + _update(currentTime: number): boolean { //if (!super._update(currentTime)) return false; super._update(currentTime); if ( @@ -56,6 +67,7 @@ class CanvasNode extends SourceNode { this._unload(); return false; } + return false; } } diff --git a/src/SourceNodes/imagenode.js b/src/SourceNodes/imagenode.js deleted file mode 100644 index 9ca92716..00000000 --- a/src/SourceNodes/imagenode.js +++ /dev/null @@ -1,131 +0,0 @@ -//Matthew Shotton, R&D User Experience,© BBC 2015 -import SourceNode, { SOURCENODESTATE } from "./sourcenode"; - -const TYPE = "CanvasNode"; -class ImageNode extends SourceNode { - /** - * Initialise an instance of an ImageNode. - * This should not be called directly, but created through a call to videoContext.createImageNode(); - */ - constructor(src, gl, renderGraph, currentTime, preloadTime = 4, attributes = {}) { - super(src, gl, renderGraph, currentTime); - this._preloadTime = preloadTime; - this._attributes = attributes; - this._textureUploaded = false; - this._displayName = TYPE; - } - - get elementURL() { - return this._elementURL; - } - - _load() { - if (this._image !== undefined) { - for (var key in this._attributes) { - this._image[key] = this._attributes[key]; - } - return; - } - if (this._isResponsibleForElementLifeCycle) { - super._load(); - this._image = new Image(); - this._image.setAttribute("crossorigin", "anonymous"); - // It's important to set the `onload` event before the `src` property - // https://stackoverflow.com/questions/12354865/image-onload-event-and-browser-cache?answertab=active#tab-top - this._image.onload = () => { - this._ready = true; - if (window.createImageBitmap) { - window - .createImageBitmap( - this._image, - 0, - 0, - this._image.width, - this._image.height, - { imageOrientation: "flipY" } - ) - .then(imageBitmap => { - this._element = imageBitmap; - this._triggerCallbacks("loaded"); - }); - } else { - this._element = this._image; - this._triggerCallbacks("loaded"); - } - }; - this._image.src = this._elementURL; - this._image.onerror = () => { - console.error("ImageNode failed to load. url:", this._elementURL); - }; - - for (let key in this._attributes) { - this._image[key] = this._attributes[key]; - } - } - this._image.onerror = () => { - console.debug("Error with element", this._image); - this._state = SOURCENODESTATE.error; - //Event though there's an error ready should be set to true so the node can output transparenn - this._ready = true; - this._triggerCallbacks("error"); - }; - } - - _unload() { - super._unload(); - if (this._isResponsibleForElementLifeCycle) { - if (this._image !== undefined) { - this._image.src = ""; - this._image.onerror = undefined; - this._image = undefined; - delete this._image; - } - if (this._element instanceof window.ImageBitmap) { - this._element.close(); - } - } - this._ready = false; - } - - _seek(time) { - super._seek(time); - if (this.state === SOURCENODESTATE.playing || this.state === SOURCENODESTATE.paused) { - if (this._image === undefined) this._load(); - } - if ( - (this._state === SOURCENODESTATE.sequenced || this._state === SOURCENODESTATE.ended) && - this._element !== undefined - ) { - this._unload(); - } - } - - _update(currentTime) { - //if (!super._update(currentTime)) return false; - if (this._textureUploaded) { - super._update(currentTime, false); - } else { - super._update(currentTime); - } - - if ( - this._startTime - this._currentTime <= this._preloadTime && - this._state !== SOURCENODESTATE.waiting && - this._state !== SOURCENODESTATE.ended - ) - this._load(); - - if (this._state === SOURCENODESTATE.playing) { - return true; - } else if (this._state === SOURCENODESTATE.paused) { - return true; - } else if (this._state === SOURCENODESTATE.ended && this._image !== undefined) { - this._unload(); - return false; - } - } -} - -export { TYPE as IMAGETYPE }; - -export default ImageNode; diff --git a/src/SourceNodes/imagenode.ts b/src/SourceNodes/imagenode.ts new file mode 100644 index 00000000..fbf51ec3 --- /dev/null +++ b/src/SourceNodes/imagenode.ts @@ -0,0 +1,161 @@ +//Matthew Shotton, R&D User Experience,© BBC 2015 +import SourceNode, { SOURCENODESTATE } from "./sourcenode.js"; +import type RenderGraph from "../rendergraph.js"; + +const TYPE = "ImageNode"; + +class ImageNode extends SourceNode { + declare _element: HTMLImageElement | ImageBitmap | undefined; + _preloadTime: number; + _attributes: Record; + _textureUploaded: boolean; + _image: HTMLImageElement | undefined; + + /** + * Initialise an instance of an ImageNode. + * This should not be called directly, but created through a call to videoContext.image(); + */ + constructor( + src: string | HTMLImageElement | ImageBitmap, + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + currentTime: number, + preloadTime = 4, + attributes: Record = {} + ) { + super(src, gl, renderGraph, currentTime); + this._preloadTime = preloadTime; + this._attributes = attributes; + this._textureUploaded = false; + this._displayName = TYPE; + } + + get elementURL(): string | MediaStream | undefined { + return this._elementURL; + } + + _load(): void { + if (this._image !== undefined) { + for (const key in this._attributes) { + (this._image as unknown as Record)[key] = this._attributes[key]; + } + return; + } + if (this._isResponsibleForElementLifeCycle) { + super._load(); + const image = new Image(); + this._image = image; + image.setAttribute("crossorigin", "anonymous"); + // It's important to set the `onload` and `onerror` events before the `src` property + // https://stackoverflow.com/questions/12354865/image-onload-event-and-browser-cache?answertab=active#tab-top + image.onload = () => { + this._ready = true; + if (window.createImageBitmap) { + window + .createImageBitmap(image, 0, 0, image.width, image.height, { + imageOrientation: "flipY" + }) + .then(imageBitmap => { + this._element = imageBitmap; + this._triggerCallbacks("loaded"); + }); + } else { + this._element = image; + this._triggerCallbacks("loaded"); + } + }; + image.onerror = () => { + console.error("ImageNode failed to load. url:", this._elementURL); + this._state = SOURCENODESTATE.error; + //Even though there's an error, ready should be set to true so the node can output transparent + this._ready = true; + this._triggerCallbacks("error"); + }; + image.src = this._elementURL as string; + + for (const key in this._attributes) { + (image as unknown as Record)[key] = this._attributes[key]; + } + } else if (!this._ready && this._element !== undefined) { + //the element was supplied by the user; it is ready once it has finished loading + const complete = (this._element as HTMLImageElement).complete; + if (complete === undefined || complete) { + super._load(); + this._ready = true; + this._triggerCallbacks("loaded"); + } + } + } + + _unload(): void { + super._unload(); + if (this._isResponsibleForElementLifeCycle) { + if (this._image !== undefined) { + this._image.src = ""; + this._image.onload = null; + this._image.onerror = null; + this._image = undefined; + } + if (window.ImageBitmap !== undefined && this._element instanceof window.ImageBitmap) { + this._element.close(); + this._element = undefined; + } + } + this._ready = false; + this._textureUploaded = false; + } + + _seek(time: number): void { + super._seek(time); + //the texture may have been cleared by the seek, so force a re-upload on the next update + this._textureUploaded = false; + if (this.state === SOURCENODESTATE.playing || this.state === SOURCENODESTATE.paused) { + if (!this._ready) this._load(); + } + if ( + (this._state === SOURCENODESTATE.sequenced || this._state === SOURCENODESTATE.ended) && + this._element !== undefined + ) { + this._unload(); + } + } + + _update(currentTime: number): boolean { + //if (!super._update(currentTime)) return false; + if (this._textureUploaded) { + super._update(currentTime, false); + } else { + super._update(currentTime); + //the image is static, so once its texture has been uploaded there is no + //need to re-upload it on every frame + if ( + this._ready && + this._element !== undefined && + (this._state === SOURCENODESTATE.playing || this._state === SOURCENODESTATE.paused) + ) { + this._textureUploaded = true; + } + } + + if ( + this._startTime - this._currentTime <= this._preloadTime && + this._state !== SOURCENODESTATE.waiting && + this._state !== SOURCENODESTATE.ended + ) + this._load(); + + if (this._state === SOURCENODESTATE.playing) { + return true; + } else if (this._state === SOURCENODESTATE.paused) { + return true; + } else if (this._state === SOURCENODESTATE.ended && this._image !== undefined) { + this._unload(); + return false; + } + return false; + } +} + +export { TYPE as IMAGETYPE }; + +export default ImageNode; diff --git a/src/SourceNodes/medianode.js b/src/SourceNodes/medianode.ts similarity index 69% rename from src/SourceNodes/medianode.js rename to src/SourceNodes/medianode.ts index 6bfbf9d5..e2f815a9 100644 --- a/src/SourceNodes/medianode.js +++ b/src/SourceNodes/medianode.ts @@ -1,21 +1,39 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import SourceNode, { SOURCENODESTATE } from "./sourcenode"; +import SourceNode, { SOURCENODESTATE } from "./sourcenode.js"; +import type { SourceNodeSource } from "./sourcenode.js"; +import type RenderGraph from "../rendergraph.js"; +import type VideoElementCache from "../videoelementcache.js"; + +type MediaElement = HTMLVideoElement | HTMLAudioElement; class MediaNode extends SourceNode { + declare _element: MediaElement | undefined; + _elementType!: "video" | "audio"; + _preloadTime: number; + _sourceOffset: number; + _globalPlaybackRate: number; + _mediaElementCache: VideoElementCache | undefined; + _playbackRate: number; + _playbackRateUpdated: boolean; + _attributes: Record & { volume: number }; + _loopElement: boolean; + _isElementPlaying: boolean; + _loadTriggered: boolean | undefined; + /** * Initialise an instance of a MediaNode. * This should not be called directly, but extended by other Node Types which use a `HTMLMediaElement`. */ constructor( - src, - gl, - renderGraph, - currentTime, + src: SourceNodeSource, + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + currentTime: number, globalPlaybackRate = 1.0, sourceOffset = 0, preloadTime = 4, - mediaElementCache = undefined, - attributes = {} + mediaElementCache: VideoElementCache | undefined = undefined, + attributes: Record = {} ) { super(src, gl, renderGraph, currentTime); this._preloadTime = preloadTime; @@ -28,16 +46,16 @@ class MediaNode extends SourceNode { this._loopElement = false; this._isElementPlaying = false; if (this._attributes.loop) { - this._loopElement = this._attributes.loop; + this._loopElement = this._attributes.loop as boolean; } } - set playbackRate(playbackRate) { + set playbackRate(playbackRate: number) { this._playbackRate = playbackRate; this._playbackRateUpdated = true; } - set stretchPaused(stretchPaused) { + set stretchPaused(stretchPaused: boolean) { super.stretchPaused = stretchPaused; if (this._element) { if (this._stretchPaused) { @@ -50,15 +68,15 @@ class MediaNode extends SourceNode { } } - get stretchPaused() { + get stretchPaused(): boolean { return this._stretchPaused; } - get playbackRate() { + get playbackRate(): number { return this._playbackRate; } - get elementURL() { + get elementURL(): string | MediaStream | undefined { return this._elementURL; } @@ -66,8 +84,7 @@ class MediaNode extends SourceNode { * @property {Boolean} * @summary - Check if the element is waiting on the network to continue playback */ - - get _buffering() { + get _buffering(): boolean { if (this._element) { return this._element.readyState < HTMLMediaElement.HAVE_FUTURE_DATA; } @@ -75,12 +92,12 @@ class MediaNode extends SourceNode { return false; } - set volume(volume) { + set volume(volume: number) { this._attributes.volume = volume; if (this._element !== undefined) this._element.volume = this._attributes.volume; } - _triggerLoad() { + _triggerLoad(): void { // If the user hasn't supplied an element, videocontext is responsible for the element if (this._isResponsibleForElementLifeCycle) { if (this._mediaElementCache) { @@ -90,7 +107,7 @@ class MediaNode extends SourceNode { */ this._element = this._mediaElementCache.getElementAndLinkToNode(this); } else { - this._element = document.createElement(this._elementType); + this._element = document.createElement(this._elementType) as MediaElement; this._element.setAttribute("crossorigin", "anonymous"); this._element.setAttribute("webkit-playsinline", ""); this._element.setAttribute("playsinline", ""); @@ -104,13 +121,13 @@ class MediaNode extends SourceNode { if (window.MediaStream !== undefined && this._elementURL instanceof MediaStream) { this._element.srcObject = this._elementURL; } else { - this._element.src = this._elementURL; + this._element.src = this._elementURL as string; } } // at this stage either the user or the element cache should have provided an element if (this._element) { - for (let key in this._attributes) { - this._element[key] = this._attributes[key]; + for (const key in this._attributes) { + (this._element as unknown as Record)[key] = this._attributes[key]; } let currentTimeOffset = 0; @@ -121,7 +138,7 @@ class MediaNode extends SourceNode { if (this._element === undefined) return; console.debug("Error with element", this._element); this._state = SOURCENODESTATE.error; - //Event though there's an error ready should be set to true so the node can output transparenn + //Even though there's an error, ready should be set to true so the node can output transparent this._ready = true; this._triggerCallbacks("error"); }; @@ -141,14 +158,12 @@ class MediaNode extends SourceNode { * 1. `_triggerLoad` which ensures the element has the correct src and is at the correct currentTime, * so that the browser can start fetching media. * - * 2. `shouldPollForElementReadyState` waits until the element has a "readState" that signals there + * 2. `shouldPollForElementReadyState` waits until the element has a "readyState" that signals there * is enough media to start playback. This is a little confusing as currently structured. * We're using the _update loop to poll the _load function which checks the element status. * When ready we fire off the "loaded callback" - * */ - - _load() { + _load(): void { super._load(); /** @@ -163,9 +178,9 @@ class MediaNode extends SourceNode { const shouldPollForElementReadyState = this._element !== undefined; /** * this expression is effectively polling the element, waiting for it to buffer - * it gets called a lot of time + * it gets called a lot of times */ - if (shouldPollForElementReadyState) { + if (shouldPollForElementReadyState && this._element) { if (this._element.readyState > 3 && !this._element.seeking) { // at this point the element has enough data for current playback position // and at least a couple of frames into the future @@ -175,8 +190,14 @@ class MediaNode extends SourceNode { // too many things at once if (this._loopElement === false) { if (this._stopTime === Infinity || this._stopTime == undefined) { - this._stopTime = this._startTime + this._element.duration; - this._triggerCallbacks("durationchange", this.duration); + //only fire durationchange when the derived stop time actually + //changes, otherwise an endless source (duration === Infinity) + //would re-fire it on every update + const newStopTime = this._startTime + this._element.duration; + if (this._stopTime !== newStopTime) { + this._stopTime = newStopTime; + this._triggerCallbacks("durationchange", this.duration); + } } } @@ -195,20 +216,23 @@ class MediaNode extends SourceNode { } } - _unload() { + _unload(): void { super._unload(); + if (this._element !== undefined) { + //stop the element error handler retaining (and firing on) an unloaded node + this._element.onerror = null; + } if (this._isResponsibleForElementLifeCycle && this._element !== undefined) { this._element.removeAttribute("src"); - this._element.srcObject = undefined; + this._element.srcObject = null; this._element.load(); - for (let key in this._attributes) { + for (const key in this._attributes) { this._element.removeAttribute(key); } - // Unlink this form the cache, freeing up the element for another media node + // Unlink this from the cache, freeing up the element for another media node if (this._mediaElementCache) this._mediaElementCache.unlinkNodeFromElement(this._element); this._element = undefined; - if (!this._mediaElementCache) delete this._element; } // reset class to initial state this._ready = false; @@ -217,12 +241,12 @@ class MediaNode extends SourceNode { this._loadTriggered = false; } - _seek(time) { + _seek(time: number): void { super._seek(time); if (this.state === SOURCENODESTATE.playing || this.state === SOURCENODESTATE.paused) { if (this._element === undefined) this._load(); - let relativeTime = this._currentTime - this._startTime + this._sourceOffset; - this._element.currentTime = relativeTime; + const relativeTime = this._currentTime - this._startTime + this._sourceOffset; + if (this._element) this._element.currentTime = relativeTime; this._ready = false; } if ( @@ -233,7 +257,7 @@ class MediaNode extends SourceNode { } } - _update(currentTime, triggerTextureUpdate = true) { + _update(currentTime: number, triggerTextureUpdate = true): boolean { //if (!super._update(currentTime)) return false; super._update(currentTime, triggerTextureUpdate); //check if the media has ended @@ -252,32 +276,37 @@ class MediaNode extends SourceNode { this._load(); if (this._state === SOURCENODESTATE.playing) { - if (this._playbackRateUpdated) { - this._element.playbackRate = this._globalPlaybackRate * this._playbackRate; - this._playbackRateUpdated = false; - } - if (!this._isElementPlaying) { - this._element.play(); - if (this._stretchPaused) { - this._element.pause(); + if (this._element) { + if (this._playbackRateUpdated) { + this._element.playbackRate = this._globalPlaybackRate * this._playbackRate; + this._playbackRateUpdated = false; + } + if (!this._isElementPlaying) { + this._element.play(); + if (this._stretchPaused) { + this._element.pause(); + } + this._isElementPlaying = true; } - this._isElementPlaying = true; } return true; } else if (this._state === SOURCENODESTATE.paused) { - this._element.pause(); + if (this._element) this._element.pause(); this._isElementPlaying = false; return true; } else if (this._state === SOURCENODESTATE.ended && this._element !== undefined) { this._element.pause(); - if (this._isElementPlaying) { + //unload whenever a load happened (even if the node ended while paused); + //_unload resets _loadCalled so this only runs once + if (this._loadCalled) { this._unload(); } return false; } + return false; } - clearTimelineState() { + clearTimelineState(): void { super.clearTimelineState(); if (this._element !== undefined) { this._element.pause(); @@ -286,7 +315,7 @@ class MediaNode extends SourceNode { this._unload(); } - destroy() { + destroy(): void { if (this._element) this._element.pause(); super.destroy(); } diff --git a/src/SourceNodes/nodes.js b/src/SourceNodes/nodes.js deleted file mode 100644 index 76ec918c..00000000 --- a/src/SourceNodes/nodes.js +++ /dev/null @@ -1,17 +0,0 @@ -import AudioNode from "./audionode"; -import CanvasNode from "./canvasnode"; -import ImageNode from "./imagenode"; -import MediaNode from "./medianode"; -import SourceNode from "./sourcenode"; -import VideoNode from "./videonode"; - -const NODES = { - AudioNode, - CanvasNode, - ImageNode, - MediaNode, - SourceNode, - VideoNode -}; - -export default NODES; diff --git a/src/SourceNodes/nodes.ts b/src/SourceNodes/nodes.ts new file mode 100644 index 00000000..9994efe6 --- /dev/null +++ b/src/SourceNodes/nodes.ts @@ -0,0 +1,17 @@ +import AudioNode from "./audionode.js"; +import CanvasNode from "./canvasnode.js"; +import ImageNode from "./imagenode.js"; +import MediaNode from "./medianode.js"; +import SourceNode from "./sourcenode.js"; +import VideoNode from "./videonode.js"; + +const NODES = { + AudioNode, + CanvasNode, + ImageNode, + MediaNode, + SourceNode, + VideoNode +}; + +export default NODES; diff --git a/src/SourceNodes/sourcenode.js b/src/SourceNodes/sourcenode.ts similarity index 70% rename from src/SourceNodes/sourcenode.js rename to src/SourceNodes/sourcenode.ts index 626d9c3e..54e65153 100644 --- a/src/SourceNodes/sourcenode.js +++ b/src/SourceNodes/sourcenode.ts @@ -1,24 +1,56 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 import { updateTexture, clearTexture, createElementTexture } from "../utils.js"; -import GraphNode from "../graphnode"; +import GraphNode from "../graphnode.js"; +import type RenderGraph from "../rendergraph.js"; -let STATE = { +const STATE = { waiting: 0, sequenced: 1, playing: 2, paused: 3, ended: 4, error: 5 -}; +} as const; + +export type SourceNodeState = (typeof STATE)[keyof typeof STATE]; + +export type SourceElement = + HTMLVideoElement | HTMLAudioElement | HTMLImageElement | HTMLCanvasElement | ImageBitmap; + +export type SourceNodeSource = string | MediaStream | SourceElement; + +interface ISourceNodeCallback { + type: string; + func: (node: SourceNode, data?: unknown) => void; +} const TYPE = "SourceNode"; class SourceNode extends GraphNode { + _element: SourceElement | undefined; + _elementURL: string | MediaStream | undefined; + _isResponsibleForElementLifeCycle: boolean; + _state: SourceNodeState; + _currentTime: number; + _startTime: number; + _stopTime: number; + _ready: boolean; + _loadCalled: boolean; + _stretchPaused: boolean; + _texture: WebGLTexture; + _callbacks: ISourceNodeCallback[]; + _renderPaused: boolean; + /** * Initialise an instance of a SourceNode. * This is the base class for other Nodes which generate media to be passed into the processing pipeline. */ - constructor(src, gl, renderGraph, currentTime) { + constructor( + src: SourceNodeSource, + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + currentTime: number + ) { super(gl, renderGraph, [], true); this._element = undefined; this._elementURL = undefined; @@ -32,7 +64,7 @@ class SourceNode extends GraphNode { this._elementURL = src; } else { //use the passed element to create the SourceNode - this._element = src; + this._element = src as SourceElement; this._isResponsibleForElementLifeCycle = false; } @@ -80,7 +112,7 @@ class SourceNode extends GraphNode { * ctx.paused(); * console.log(videoNode.state); //will output 3 (for paused) */ - get state() { + get state(): SourceNodeState { return this._state; } @@ -88,7 +120,7 @@ class SourceNode extends GraphNode { * Returns the underlying DOM element which represents this source node. * Note: If a source node is created with a url rather than passing in an existing element then this will return undefined until the source node preloads the element. * - * @return {Element} The underlying DOM element representing the media for the node. If the lifecycle of the video is owned UNSIGNED_BYTE the node itself, this can return undefined if the element hasn't been loaded yet. + * @return {Element} The underlying DOM element representing the media for the node. If the lifecycle of the media is owned by the node itself, this can return undefined if the element hasn't been loaded yet. * * @example * //Accessing the Element on a VideoNode created via a URL @@ -96,8 +128,8 @@ class SourceNode extends GraphNode { * var videoNode = ctx.createVideoSourceNode('video.mp4'); * videoNode.start(0); * videoNode.stop(5); - * //When the node starts playing the element should exist so set it's volume to 0 - * videoNode.regsiterCallback("play", function(){videoNode.element.volume = 0;}); + * //When the node starts playing the element should exist so set its volume to 0 + * videoNode.registerCallback("play", function(){videoNode.element.volume = 0;}); * * * @example @@ -107,16 +139,15 @@ class SourceNode extends GraphNode { * var videoNode = ctx.createVideoSourceNode(videoElement); * videoNode.start(0); * videoNode.stop(5); - * //The elemnt can be accessed any time because it's lifecycle is managed outside of the VideoContext + * //The element can be accessed any time because its lifecycle is managed outside of the VideoContext * videoNode.element.volume = 0; - * */ - get element() { + get element(): SourceElement | undefined { return this._element; } /** - * Returns the duration of the node on a timeline. If no start time is set will return undefiend, if no stop time is set will return Infinity. + * Returns the duration of the node on a timeline. If no start time is set will return undefined, if no stop time is set will return Infinity. * * @return {number} The duration of the node in seconds. * @@ -125,30 +156,30 @@ class SourceNode extends GraphNode { * var videoNode = ctx.createVideoSourceNode('video.mp4'); * videoNode.start(5); * videoNode.stop(10); - * console.log(videoNode.duration); //will output 10 + * console.log(videoNode.duration); //will output 5 */ - get duration() { + get duration(): number | undefined { if (isNaN(this._startTime)) return undefined; if (this._stopTime === Infinity) return Infinity; return this._stopTime - this._startTime; } - set stretchPaused(stretchPaused) { + set stretchPaused(stretchPaused: boolean) { this._stretchPaused = stretchPaused; } - get stretchPaused() { + get stretchPaused(): boolean { return this._stretchPaused; } - _load() { + _load(): void { if (!this._loadCalled) { this._triggerCallbacks("load"); this._loadCalled = true; } } - _unload() { + _unload(): void { this._triggerCallbacks("destroy"); this._loadCalled = false; } @@ -165,10 +196,9 @@ class SourceNode extends GraphNode { * * videoNode.registerCallback("load", function(){"video is loading"}); * videoNode.registerCallback("play", function(){"video is playing"}); - * videoNode.registerCallback("ended", function(){"video has eneded"}); - * + * videoNode.registerCallback("ended", function(){"video has ended"}); */ - registerCallback(type, func) { + registerCallback(type: string, func: (node: SourceNode, data?: unknown) => void): void { this._callbacks.push({ type: type, func: func }); } @@ -183,27 +213,26 @@ class SourceNode extends GraphNode { * * videoNode.registerCallback("load", function(){"video is loading"}); * videoNode.registerCallback("play", function(){"video is playing"}); - * videoNode.registerCallback("ended", function(){"video has eneded"}); - * videoNode.unregisterCallback(); //remove all of the three callbacks. - * + * videoNode.registerCallback("ended", function(){"video has ended"}); + * videoNode.unregisterCallback(); //remove all three callbacks. */ - unregisterCallback(func) { - let toRemove = []; - for (let callback of this._callbacks) { + unregisterCallback(func?: (node: SourceNode, data?: unknown) => void): void { + const toRemove: ISourceNodeCallback[] = []; + for (const callback of this._callbacks) { if (func === undefined) { toRemove.push(callback); } else if (callback.func === func) { toRemove.push(callback); } } - for (let callback of toRemove) { - let index = this._callbacks.indexOf(callback); + for (const callback of toRemove) { + const index = this._callbacks.indexOf(callback); this._callbacks.splice(index, 1); } } - _triggerCallbacks(type, data) { - for (let callback of this._callbacks) { + _triggerCallbacks(type: string, data?: unknown): void { + for (const callback of this._callbacks) { if (callback.type === type) { if (data !== undefined) { callback.func(this, data); @@ -218,11 +247,15 @@ class SourceNode extends GraphNode { * Start playback at VideoContext.currentTime plus passed time. If passed time is negative, will play as soon as possible. * * @param {number} time - the time from the currentTime of the VideoContext which to start playing, if negative will play as soon as possible. - * @return {boolean} Will return true is seqeuncing has succeded, or false if it is already sequenced. + * @return {boolean} Will return true if sequencing has succeeded, or false if it is already sequenced. */ - start(time) { + start(time: number): boolean { + if (this._destroyed) { + console.debug("SourceNode has been destroyed. Can't sequence."); + return false; + } if (this._state !== STATE.waiting) { - console.debug("SourceNode is has already been sequenced. Can't sequence twice."); + console.debug("SourceNode has already been sequenced. Can't sequence twice."); return false; } @@ -232,14 +265,18 @@ class SourceNode extends GraphNode { } /** - * Start playback at an absolute time ont the VideoContext's timeline. + * Start playback at an absolute time on the VideoContext's timeline. * - * @param {number} time - the time on the VideoContexts timeline to start playing. - * @return {boolean} Will return true is seqeuncing has succeded, or false if it is already sequenced. + * @param {number} time - the time on the VideoContext's timeline to start playing. + * @return {boolean} Will return true if sequencing has succeeded, or false if it is already sequenced. */ - startAt(time) { + startAt(time: number): boolean { + if (this._destroyed) { + console.debug("SourceNode has been destroyed. Can't sequence."); + return false; + } if (this._state !== STATE.waiting) { - console.debug("SourceNode is has already been sequenced. Can't sequence twice."); + console.debug("SourceNode has already been sequenced. Can't sequence twice."); return false; } this._startTime = time; @@ -247,17 +284,17 @@ class SourceNode extends GraphNode { return true; } - get startTime() { + get startTime(): number { return this._startTime; } /** - * Stop playback at VideoContext.currentTime plus passed time. If passed time is negative, will play as soon as possible. + * Stop playback at VideoContext.currentTime plus passed time. If passed time is negative, will stop as soon as possible. * * @param {number} time - the time from the currentTime of the video context which to stop playback. - * @return {boolean} Will return true is seqeuncing has succeded, or false if the playback has already ended or if start hasn't been called yet, or if time is less than the start time. + * @return {boolean} Will return true if sequencing has succeeded, or false if the playback has already ended or if start hasn't been called yet, or if time is less than the start time. */ - stop(time) { + stop(time: number): boolean { if (this._state === STATE.ended) { console.debug("SourceNode has already ended. Cannot call stop."); return false; @@ -266,7 +303,7 @@ class SourceNode extends GraphNode { return false; } if (this._currentTime + time <= this._startTime) { - console.debug("SourceNode must have a stop time after it's start time, not before."); + console.debug("SourceNode must have a stop time after its start time, not before."); return false; } this._stopTime = this._currentTime + time; @@ -276,12 +313,12 @@ class SourceNode extends GraphNode { } /** - * Stop playback at an absolute time ont the VideoContext's timeline. + * Stop playback at an absolute time on the VideoContext's timeline. * - * @param {number} time - the time on the VideoContexts timeline to stop playing. - * @return {boolean} Will return true is seqeuncing has succeded, or false if the playback has already ended or if start hasn't been called yet, or if time is less than the start time. + * @param {number} time - the time on the VideoContext's timeline to stop playing. + * @return {boolean} Will return true if sequencing has succeeded, or false if the playback has already ended or if start hasn't been called yet, or if time is less than the start time. */ - stopAt(time) { + stopAt(time: number): boolean { if (this._state === STATE.ended) { console.debug("SourceNode has already ended. Cannot call stop."); return false; @@ -290,7 +327,7 @@ class SourceNode extends GraphNode { return false; } if (time <= this._startTime) { - console.debug("SourceNode must have a stop time after it's start time, not before."); + console.debug("SourceNode must have a stop time after its start time, not before."); return false; } this._stopTime = time; @@ -299,15 +336,19 @@ class SourceNode extends GraphNode { return true; } - get stopTime() { + get stopTime(): number { return this._stopTime; } - _seek(time) { + _seek(time: number): void { this._renderPaused = false; this._triggerCallbacks("seek", time); + //update the current time before the waiting-state early return, so that + //start()/stop() offsets are computed from the seeked time. + this._currentTime = time; + if (this._state === STATE.waiting) return; if (time < this._startTime) { clearTexture(this._gl, this._texture); @@ -321,25 +362,28 @@ class SourceNode extends GraphNode { this._triggerCallbacks("ended"); this._state = STATE.ended; } - //update the current time - this._currentTime = time; } - _pause() { + _pause(): void { if (this._state === STATE.playing || (this._currentTime === 0 && this._startTime === 0)) { this._triggerCallbacks("pause"); this._state = STATE.paused; this._renderPaused = false; } } - _play() { + + _play(): void { if (this._state === STATE.paused) { this._triggerCallbacks("play"); this._state = STATE.playing; } } - _isReady() { + get _buffering(): boolean { + return false; + } + + _isReady(): boolean { if (this._buffering) { return false; } @@ -353,9 +397,9 @@ class SourceNode extends GraphNode { return true; } - _update(currentTime, triggerTextureUpdate = true) { + _update(currentTime: number, triggerTextureUpdate = true): boolean { this._rendered = true; - let timeDelta = currentTime - this._currentTime; + const timeDelta = currentTime - this._currentTime; //update the current time this._currentTime = currentTime; @@ -375,10 +419,12 @@ class SourceNode extends GraphNode { this._state = STATE.sequenced; } + //NOTE: the casts below stop TypeScript over-narrowing _state — the + //_triggerCallbacks calls above can change it as a side effect. if ( currentTime >= this._startTime && - this._state !== STATE.paused && - this._state !== STATE.error + (this._state as SourceNodeState) !== STATE.paused && + (this._state as SourceNodeState) !== STATE.error ) { if (this._state !== STATE.playing) this._triggerCallbacks("play"); this._state = STATE.playing; @@ -390,7 +436,7 @@ class SourceNode extends GraphNode { this._state = STATE.ended; } - //update this source nodes texture + //update this source node's texture if (this._element === undefined || this._ready === false) return true; if (!this._renderPaused && this._state === STATE.paused) { @@ -410,7 +456,7 @@ class SourceNode extends GraphNode { /** * Clear any timeline state the node currently has, this puts the node in the "waiting" state, as if neither start nor stop had been called. */ - clearTimelineState() { + clearTimelineState(): void { this._startTime = NaN; this._stopTime = Infinity; this._state = STATE.waiting; @@ -419,7 +465,7 @@ class SourceNode extends GraphNode { /** * Destroy and clean-up the node. */ - destroy() { + destroy(): void { this._unload(); super.destroy(); this.unregisterCallback(); @@ -432,7 +478,7 @@ class SourceNode extends GraphNode { this._ready = false; this._loadCalled = false; this._gl.deleteTexture(this._texture); - this._texture = undefined; + this._texture = undefined as unknown as WebGLTexture; } } diff --git a/src/SourceNodes/videonode.js b/src/SourceNodes/videonode.ts similarity index 69% rename from src/SourceNodes/videonode.js rename to src/SourceNodes/videonode.ts index 352d8128..c090f166 100644 --- a/src/SourceNodes/videonode.js +++ b/src/SourceNodes/videonode.ts @@ -1,15 +1,15 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 -import MediaNode from "./medianode"; +import MediaNode from "./medianode.js"; const TYPE = "VideoNode"; class VideoNode extends MediaNode { /** * Initialise an instance of a VideoNode. - * This should not be called directly, but created through a call to videoContext.createVideoNode(); + * This should not be called directly, but created through a call to videoContext.video(); */ - constructor() { - super(...arguments); + constructor(...args: ConstructorParameters) { + super(...args); this._displayName = TYPE; this._elementType = "video"; } diff --git a/src/exceptions.js b/src/exceptions.js deleted file mode 100644 index f5ca88c6..00000000 --- a/src/exceptions.js +++ /dev/null @@ -1,10 +0,0 @@ -//Matthew Shotton, R&D User Experience,© BBC 2015 -export function ConnectException(message) { - this.message = message; - this.name = "ConnectionException"; -} - -export function RenderException(message) { - this.message = message; - this.name = "RenderException"; -} diff --git a/src/exceptions.ts b/src/exceptions.ts new file mode 100644 index 00000000..0d6f443d --- /dev/null +++ b/src/exceptions.ts @@ -0,0 +1,19 @@ +//Matthew Shotton, R&D User Experience,© BBC 2015 + +/* + * Error subclasses thrown by VideoContext. These are real `Error`s (with stack + * traces) — safe as native classes now that browser targets all support ES2015. + */ +export class ConnectException extends Error { + constructor(message: string) { + super(message); + this.name = "ConnectionException"; + } +} + +export class RenderException extends Error { + constructor(message: string) { + super(message); + this.name = "RenderException"; + } +} diff --git a/src/graphnode.js b/src/graphnode.ts similarity index 63% rename from src/graphnode.js rename to src/graphnode.ts index 0d4bc3f2..4999049c 100644 --- a/src/graphnode.js +++ b/src/graphnode.ts @@ -1,12 +1,26 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 +import type RenderGraph from "./rendergraph.js"; const TYPE = "GraphNode"; class GraphNode { + _renderGraph: RenderGraph; + _limitConnections: boolean; + _inputNames: string[]; + _destroyed: boolean; + _gl: WebGLRenderingContext; + _rendered: boolean; + _displayName: string; + /** - * Base class from which all processing and source nodes are derrived. + * Base class from which all processing and source nodes are derived. */ - constructor(gl, renderGraph, inputNames, limitConnections = false) { + constructor( + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + inputNames: string[], + limitConnections = false + ) { this._renderGraph = renderGraph; this._limitConnections = limitConnections; this._inputNames = inputNames; @@ -24,27 +38,25 @@ class GraphNode { * * @return String A string of the class name. */ - - get displayName() { + get displayName(): string { return this._displayName; } /** * Get the names of the inputs to this node. * - * @return {String[]} An array of the names of the inputs ot the node. + * @return {String[]} An array of the names of the inputs to the node. */ - - get inputNames() { + get inputNames(): string[] { return this._inputNames.slice(); } /** - * The maximum number of connections that can be made to this node. If there is not limit this will return Infinity. + * The maximum number of connections that can be made to this node. If there is no limit this will return Infinity. * * @return {number} The number of connections which can be made to this node. */ - get maximumConnections() { + get maximumConnections(): number { if (this._limitConnections === false) return Infinity; return this._inputNames.length; } @@ -54,12 +66,12 @@ class GraphNode { * * @return {GraphNode[]} An array of nodes which connect to this node. */ - get inputs() { + get inputs(): GraphNode[] { let result = this._renderGraph.getInputsForNode(this); - result = result.filter(function(n) { + result = result.filter(function (n) { return n !== undefined; }); - return result; + return result as GraphNode[]; } /** @@ -67,16 +79,16 @@ class GraphNode { * * @return {GraphNode[]} An array of nodes which this node connects to. */ - get outputs() { + get outputs(): GraphNode[] { return this._renderGraph.getOutputsForNode(this); } /** * Get whether the node has been destroyed or not. * - * @return {boolean} A true/false value of whather the node has been destoryed or not. + * @return {boolean} A true/false value of whether the node has been destroyed or not. */ - get destroyed() { + get destroyed(): boolean { return this._destroyed; } @@ -84,22 +96,20 @@ class GraphNode { * Connect this node to the targetNode * * @param {GraphNode} targetNode - the node to connect. - * @param {(number| String)} [targetPort] - the port on the targetNode to connect to, this can be an index, a string identifier, or undefined (in which case the next available port will be connected to). - * + * @param {(number | String)} [targetPort] - the port on the targetNode to connect to, this can be an index, a string identifier, or undefined (in which case the next available port will be connected to). */ - connect(targetNode, targetPort) { + connect(targetNode: GraphNode, targetPort?: number | string): boolean { return this._renderGraph.registerConnection(this, targetNode, targetPort); } /** - * Disconnect this node from the targetNode. If targetNode is undefind remove all out-bound connections. + * Disconnect this node from the targetNode. If targetNode is undefined remove all out-bound connections. * * @param {GraphNode} [targetNode] - the node to disconnect from. If undefined, disconnect from all nodes. - * */ - disconnect(targetNode) { + disconnect(targetNode?: GraphNode): boolean { if (targetNode === undefined) { - let toRemove = this._renderGraph.getOutputsForNode(this); + const toRemove = this._renderGraph.getOutputsForNode(this); toRemove.forEach(target => this._renderGraph.unregisterConnection(this, target)); if (toRemove.length > 0) return true; return false; @@ -108,11 +118,11 @@ class GraphNode { } /** - * Destory this node, removing it from the graph. + * Destroy this node, removing it from the graph. */ - destroy() { + destroy(): void { this.disconnect(); - for (let input of this.inputs) { + for (const input of this.inputs) { input.disconnect(this); } this._destroyed = true; diff --git a/src/rendergraph.js b/src/rendergraph.ts similarity index 59% rename from src/rendergraph.js rename to src/rendergraph.ts index 20666bcf..944b6ff2 100644 --- a/src/rendergraph.js +++ b/src/rendergraph.ts @@ -1,7 +1,26 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 import { ConnectException } from "./exceptions.js"; +import type GraphNode from "./graphnode.js"; + +export interface INamedConnection { + source: GraphNode; + type: "name"; + name: string; + destination: GraphNode; +} + +export interface IZIndexConnection { + source: GraphNode; + type: "zIndex"; + zIndex: number; + destination: GraphNode; +} + +export type IConnection = INamedConnection | IZIndexConnection; class RenderGraph { + connections: IConnection[]; + /** * Manages the rendering graph. */ @@ -15,9 +34,9 @@ class RenderGraph { * @param {GraphNode} node - the node to get the outputs for. * @return {GraphNode[]} An array of the nodes which are connected to the output. */ - getOutputsForNode(node) { - let results = []; - this.connections.forEach(function(connection) { + getOutputsForNode(node: GraphNode): GraphNode[] { + const results: GraphNode[] = []; + this.connections.forEach(function (connection) { if (connection.source === node) { results.push(connection.destination); } @@ -31,9 +50,9 @@ class RenderGraph { * @param {GraphNode} node - the node to get the named inputs for. * @return {Object[]} An array of objects representing the nodes and connection type, which are connected to the named inputs for the node. */ - getNamedInputsForNode(node) { - let results = []; - this.connections.forEach(function(connection) { + getNamedInputsForNode(node: GraphNode): INamedConnection[] { + const results: INamedConnection[] = []; + this.connections.forEach(function (connection) { if (connection.destination === node && connection.type === "name") { results.push(connection); } @@ -44,17 +63,17 @@ class RenderGraph { /** * Get a list of nodes which are connected, by z-index name, to the given node. Array contains objects of the form: {"source":sourceNode, "type":"zIndex", "zIndex":0, "destination":destinationNode}. * - * @param {GraphNode} node - the node to get the z-index refernced inputs for. + * @param {GraphNode} node - the node to get the z-index referenced inputs for. * @return {Object[]} An array of objects representing the nodes and connection type, which are connected by z-Index for the node. */ - getZIndexInputsForNode(node) { - let results = []; - this.connections.forEach(function(connection) { + getZIndexInputsForNode(node: GraphNode): IZIndexConnection[] { + const results: IZIndexConnection[] = []; + this.connections.forEach(function (connection) { if (connection.destination === node && connection.type === "zIndex") { results.push(connection); } }); - results.sort(function(a, b) { + results.sort(function (a, b) { return a.zIndex - b.zIndex; }); return results; @@ -66,33 +85,48 @@ class RenderGraph { * @param {GraphNode} node - the node to get the inputs for. * @return {GraphNode[]} An array of GraphNodes which are connected to the node. */ - getInputsForNode(node) { - let inputNames = node.inputNames; - let results = []; - let namedInputs = this.getNamedInputsForNode(node); - let indexedInputs = this.getZIndexInputsForNode(node); + getInputsForNode(node: GraphNode): Array { + const inputNames = node.inputNames; + const results: Array = []; + const namedInputs = this.getNamedInputsForNode(node); + const indexedInputs = this.getZIndexInputsForNode(node); if (node._limitConnections === true) { for (let i = 0; i < inputNames.length; i++) { results[i] = undefined; } - for (let connection of namedInputs) { - let index = inputNames.indexOf(connection.name); + for (const connection of namedInputs) { + const index = inputNames.indexOf(connection.name); results[index] = connection.source; } - let indexedInputsIndex = 0; - for (let i = 0; i < results.length; i++) { - if (results[i] === undefined && indexedInputs[indexedInputsIndex] !== undefined) { - results[i] = indexedInputs[indexedInputsIndex].source; - indexedInputsIndex += 1; + + //place index-connected inputs on the port matching their zIndex + const unplacedIndexedInputs: IZIndexConnection[] = []; + for (const connection of indexedInputs) { + if ( + connection.zIndex < results.length && + results[connection.zIndex] === undefined + ) { + results[connection.zIndex] = connection.source; + } else { + unplacedIndexedInputs.push(connection); + } + } + //fall back to the first free port for out-of-range or clashing indexes + for (const connection of unplacedIndexedInputs) { + for (let i = 0; i < results.length; i++) { + if (results[i] === undefined) { + results[i] = connection.source; + break; + } } } } else { - for (let connection of namedInputs) { + for (const connection of namedInputs) { results.push(connection.source); } - for (let connection of indexedInputs) { + for (const connection of indexedInputs) { results.push(connection.source); } } @@ -100,13 +134,13 @@ class RenderGraph { } /** - * Check if a named input on a node is available to connect too. + * Check if a named input on a node is available to connect to. * @param {GraphNode} node - the node to check. * @param {String} inputName - the named input to check. */ - isInputAvailable(node, inputName) { + isInputAvailable(node: GraphNode, inputName: string): boolean { if (node._inputNames.indexOf(inputName) === -1) return false; - for (let connection of this.connections) { + for (const connection of this.connections) { if (connection.type === "name") { if (connection.destination === node && connection.name === inputName) { return false; @@ -121,10 +155,14 @@ class RenderGraph { * * @param {GraphNode} sourceNode - the node to connect from. * @param {GraphNode} destinationNode - the node to connect to. - * @param {(String | number)} [target] - the target port of the conenction, this could be a string to specfiy a specific named port, a number to specify a port by index, or undefined, in which case the next available port will be connected to. + * @param {(String | number)} [target] - the target port of the connection, this could be a string to specify a specific named port, a number to specify a port by index, or undefined, in which case the next available port will be connected to. * @return {boolean} Will return true if connection succeeds otherwise will throw a ConnectException. */ - registerConnection(sourceNode, destinationNode, target) { + registerConnection( + sourceNode: GraphNode, + destinationNode: GraphNode, + target?: number | string + ): boolean { if ( destinationNode.inputs.length >= destinationNode.inputNames.length && destinationNode._limitConnections === true @@ -137,14 +175,14 @@ class RenderGraph { const inputs = this.getInputsForNode(destinationNode); if (inputs.includes(sourceNode)) { console.debug( - "WARNING - node connected mutliple times, removing previous connection" + "WARNING - node connected multiple times, removing previous connection" ); this.unregisterConnection(sourceNode, destinationNode); } } if (typeof target === "number") { - //target is a specific + //target is a specific port index this.connections.push({ source: sourceNode, type: "zIndex", @@ -166,8 +204,16 @@ class RenderGraph { throw new ConnectException("Port " + target + " is already connected to"); } } else { + if (typeof target === "string") { + //target is a named port on a node which doesn't limit connections; port + //names aren't exclusive here, so treat it as an ordinary connection, but + //surface typos rather than silently ignoring an unknown name. + if (destinationNode.inputNames.indexOf(target) === -1) { + throw new ConnectException("Node does not have an input port named " + target); + } + } //target is undefined so just make it a high zIndex - let indexedConns = this.getZIndexInputsForNode(destinationNode); + const indexedConns = this.getZIndexInputsForNode(destinationNode); let index = 0; if (indexedConns.length > 0) index = indexedConns[indexedConns.length - 1].zIndex + 1; this.connections.push({ @@ -182,14 +228,14 @@ class RenderGraph { /** * Remove a connection between two nodes. - * @param {GraphNode} sourceNode - the node to unregsiter connection from. - * @param {GraphNode} destinationNode - the node to register connection to. - * @return {boolean} Will return true if removing connection succeeds, or false if there was no connectionsction to remove. + * @param {GraphNode} sourceNode - the node to unregister connection from. + * @param {GraphNode} destinationNode - the node to unregister connection to. + * @return {boolean} Will return true if removing connection succeeds, or false if there was no connection to remove. */ - unregisterConnection(sourceNode, destinationNode) { - let toRemove = []; + unregisterConnection(sourceNode: GraphNode, destinationNode: GraphNode): boolean { + const toRemove: IConnection[] = []; - this.connections.forEach(function(connection) { + this.connections.forEach(function (connection) { if (connection.source === sourceNode && connection.destination === destinationNode) { toRemove.push(connection); } @@ -198,16 +244,16 @@ class RenderGraph { if (toRemove.length === 0) return false; toRemove.forEach(removeNode => { - let index = this.connections.indexOf(removeNode); + const index = this.connections.indexOf(removeNode); this.connections.splice(index, 1); }); return true; } - static outputEdgesFor(node, connections) { - let results = []; - for (let conn of connections) { + static outputEdgesFor(node: GraphNode, connections: IConnection[]): IConnection[] { + const results: IConnection[] = []; + for (const conn of connections) { if (conn.source === node) { results.push(conn); } @@ -215,9 +261,9 @@ class RenderGraph { return results; } - static inputEdgesFor(node, connections) { - let results = []; - for (let conn of connections) { + static inputEdgesFor(node: GraphNode, connections: IConnection[]): IConnection[] { + const results: IConnection[] = []; + for (const conn of connections) { if (conn.destination === node) { results.push(conn); } @@ -225,13 +271,13 @@ class RenderGraph { return results; } - static getInputlessNodes(connections) { - let inputLess = []; - for (let conn of connections) { + static getInputlessNodes(connections: IConnection[]): GraphNode[] { + const inputLess: GraphNode[] = []; + for (const conn of connections) { inputLess.push(conn.source); } - for (let conn of connections) { - let index = inputLess.indexOf(conn.destination); + for (const conn of connections) { + const index = inputLess.indexOf(conn.destination); if (index !== -1) { inputLess.splice(index, 1); } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 00000000..eb9a9065 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,26 @@ +/** + * Shared types for VideoContext node definitions. + */ + +declare global { + interface Window { + __VIDEOCONTEXT_REFS__?: Record; + webkitURL?: typeof URL; + } +} + +export type PropertyValue = number | number[] | HTMLImageElement; + +export interface IDefinitionProperty { + type: string; + value: PropertyValue; +} + +export interface IDefinition { + title?: string; + description?: string; + vertexShader: string; + fragmentShader: string; + properties: Record; + inputs: string[]; +} diff --git a/src/utils.js b/src/utils.ts similarity index 52% rename from src/utils.js rename to src/utils.ts index d3f769f1..d16846de 100644 --- a/src/utils.js +++ b/src/utils.ts @@ -1,5 +1,6 @@ //Matthew Shotton, R&D User Experience,© BBC 2015 import DEFINITIONS from "./Definitions/definitions.js"; +import { RenderException } from "./exceptions.js"; import { SOURCENODESTATE } from "./SourceNodes/sourcenode.js"; import { VIDEOTYPE } from "./SourceNodes/videonode.js"; import { CANVASTYPE } from "./SourceNodes/canvasnode.js"; @@ -7,58 +8,73 @@ import { IMAGETYPE } from "./SourceNodes/imagenode.js"; import { DESTINATIONTYPE } from "./DestinationNode/destinationnode.js"; import { TRANSITIONTYPE } from "./ProcessingNodes/transitionnode.js"; import { COMPOSITINGTYPE } from "./ProcessingNodes/compositingnode.js"; +import type VideoContext from "./videocontext.js"; +import type GraphNode from "./graphnode.js"; +import type SourceNode from "./SourceNodes/sourcenode.js"; +import type ProcessingNode from "./ProcessingNodes/processingnode.js"; +import type TransitionNode from "./ProcessingNodes/transitionnode.js"; +import type MediaNode from "./SourceNodes/medianode.js"; + +/** + * A WebGLTexture with the small piece of bookkeeping VideoContext keeps on it: + * whether the texture is currently cleared (to skip redundant texImage2D calls). + */ +export interface ManagedTexture extends WebGLTexture { + _isTextureCleared?: boolean; +} /* * Utility function to compile a WebGL Vertex or Fragment shader. * - * @param {WebGLRenderingContext} gl - the webgl context fo which to build the shader. + * @param {WebGLRenderingContext} gl - the webgl context for which to build the shader. * @param {String} shaderSource - A string of shader code to compile. * @param {number} shaderType - Shader type, either WebGLRenderingContext.VERTEX_SHADER or WebGLRenderingContext.FRAGMENT_SHADER. * * @return {WebGLShader} A compiled shader. - * */ -export function compileShader(gl, shaderSource, shaderType) { - let shader = gl.createShader(shaderType); +export function compileShader( + gl: WebGLRenderingContext, + shaderSource: string, + shaderType: number +): WebGLShader { + const shader = gl.createShader(shaderType) as WebGLShader; gl.shaderSource(shader, shaderSource); gl.compileShader(shader); - let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if (!success) { - throw "could not compile shader:" + gl.getShaderInfoLog(shader); + throw new RenderException("could not compile shader:" + gl.getShaderInfoLog(shader)); } return shader; } /* - * Create a shader program from a passed vertex and fragment shader source string. + * Create a shader program from a passed vertex and fragment shader. * - * @param {WebGLRenderingContext} gl - the webgl context fo which to build the shader. + * @param {WebGLRenderingContext} gl - the webgl context for which to build the shader program. * @param {WebGLShader} vertexShader - A compiled vertex shader. * @param {WebGLShader} fragmentShader - A compiled fragment shader. * - * @return {WebGLProgram} A compiled & linkde shader program. + * @return {WebGLProgram} A compiled & linked shader program. */ -export function createShaderProgram(gl, vertexShader, fragmentShader) { - let program = gl.createProgram(); +export function createShaderProgram( + gl: WebGLRenderingContext, + vertexShader: WebGLShader, + fragmentShader: WebGLShader +): WebGLProgram { + const program = gl.createProgram() as WebGLProgram; gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw { - error: 4, - msg: "Can't link shader program for track", - toString: function() { - return this.msg; - } - }; + throw new RenderException("Can't link shader program for track"); } return program; } -export function createElementTexture(gl) { - let texture = gl.createTexture(); +export function createElementTexture(gl: WebGLRenderingContext): WebGLTexture { + const texture = gl.createTexture() as WebGLTexture; gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); // Set the parameters so we can render any size image. @@ -66,22 +82,24 @@ export function createElementTexture(gl) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - //Initialise the texture untit to clear. - //gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, type); return texture; } -export function updateTexture(gl, texture, element) { +export function updateTexture( + gl: WebGLRenderingContext, + texture: ManagedTexture, + element: (TexImageSource | HTMLMediaElement) & { readyState?: number } +): void { if (element.readyState !== undefined && element.readyState === 0) return; gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, element); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, element as TexImageSource); texture._isTextureCleared = false; } -export function clearTexture(gl, texture) { +export function clearTexture(gl: WebGLRenderingContext, texture: ManagedTexture): void { // A quick check to ensure we don't call 'texImage2D' when the texture has already been 'cleared' #performance if (!texture._isTextureCleared) { gl.bindTexture(gl.TEXTURE_2D, texture); @@ -102,7 +120,7 @@ export function clearTexture(gl, texture) { } } -export function generateRandomId() { +export function generateRandomId(): string { const appearanceAdjective = [ "adorable", "alert", @@ -219,11 +237,11 @@ export function generateRandomId() { "sea anemone" ]; - function randomChoice(array) { + function randomChoice(array: T[]): T { return array[Math.floor(Math.random() * array.length)]; } - function capitalize(word) { + function capitalize(word: string): string { word = word.replace(/\b\w/g, l => l.toUpperCase()); return word; } @@ -239,21 +257,21 @@ export function generateRandomId() { return name; } -export function exportToJSON(vc) { +export function exportToJSON(vc: VideoContext): string { console.warn( "VideoContext.exportToJSON has been deprecated. Please use VideoContext.snapshot instead." ); return JSON.stringify(snapshotNodes(vc)); } -export function snapshot(vc) { +export function snapshot(vc: VideoContext) { return { nodes: snapshotNodes(vc), videoContext: snapshotVideoContext(vc) }; } -function snapshotVideoContext(vc) { +function snapshotVideoContext(vc: VideoContext) { return { currentTime: vc.currentTime, duration: vc.duration, @@ -262,25 +280,42 @@ function snapshotVideoContext(vc) { }; } +export interface ISnapshotNode { + type: string; + url?: string; + start?: number; + stop?: number; + state?: string; + currentTime?: number | null; + sourceOffset?: number; + definition?: unknown; + inputs?: Array<{ id: string | undefined; index: number }>; + properties?: Record; + transitions?: unknown; +} + let warningExportSourceLogged = false; -function snapshotNodes(vc) { - function qualifyURL(url) { - var a = document.createElement("a"); +function snapshotNodes(vc: VideoContext): Record { + function qualifyURL(url: string): string { + const a = document.createElement("a"); a.href = url; return a.href; } - function getInputIDs(node, vc) { - let inputs = []; - for (let input of node.inputs) { + function getInputIDs(node: GraphNode, vc: VideoContext) { + const inputs: Array<{ id: string | undefined; index: number }> = []; + //use the raw (unfiltered) input list so the index reflects the actual port, + //not the position amongst only the connected inputs + const rawInputs = node._renderGraph.getInputsForNode(node); + for (let inputIndex = 0; inputIndex < rawInputs.length; inputIndex++) { + const input = rawInputs[inputIndex]; if (input === undefined) continue; let inputID; - let inputIndex = node.inputs.indexOf(input); - let index = vc._processingNodes.indexOf(input); + let index = vc._processingNodes.indexOf(input as ProcessingNode); if (index > -1) { inputID = "processor" + index; } else { - let index = vc._sourceNodes.indexOf(input); + index = vc._sourceNodes.indexOf(input as SourceNode); if (index > -1) { inputID = "source" + index; } else { @@ -292,32 +327,32 @@ function snapshotNodes(vc) { return inputs; } - let result = {}; + const result: Record = {}; - let sourceNodeStateMapping = []; - for (let state in SOURCENODESTATE) { - sourceNodeStateMapping[SOURCENODESTATE[state]] = state; + const sourceNodeStateMapping: string[] = []; + for (const state in SOURCENODESTATE) { + sourceNodeStateMapping[SOURCENODESTATE[state as keyof typeof SOURCENODESTATE]] = state; } - for (let index in vc._sourceNodes) { - let source = vc._sourceNodes[index]; - let id = "source" + index; + for (let index = 0; index < vc._sourceNodes.length; index++) { + const source = vc._sourceNodes[index]; + const id = "source" + index; let node_url = ""; if (!source._isResponsibleForElementLifeCycle) { if (!warningExportSourceLogged) { console.debug( - "Warning - Trying to export source created from an element not a URL. URL of export will be set to the elements src attribute and may be incorrect", + "Warning - Trying to export source created from an element not a URL. URL of export will be set to the element's src attribute and may be incorrect", source ); warningExportSourceLogged = true; } - node_url = source.element.src; + node_url = (source.element as HTMLVideoElement).src; } else { - node_url = qualifyURL(source._elementURL); + node_url = qualifyURL(source._elementURL as string); } - let node = { + const node: ISnapshotNode = { type: source.displayName, url: node_url, start: source.startTime, @@ -326,33 +361,37 @@ function snapshotNodes(vc) { }; if (node.type === VIDEOTYPE) { node.currentTime = null; - if (source.element && source.element.currentTime) { - node.currentTime = source.element.currentTime; + const element = source.element as HTMLVideoElement | undefined; + if (element && element.currentTime) { + node.currentTime = element.currentTime; } } - if (source._sourceOffset) { - node.sourceOffset = source._sourceOffset; + const sourceOffset = (source as MediaNode)._sourceOffset; + if (sourceOffset) { + node.sourceOffset = sourceOffset; } result[id] = node; } - for (let index in vc._processingNodes) { - let processor = vc._processingNodes[index]; - let id = "processor" + index; - let node = { + for (let index = 0; index < vc._processingNodes.length; index++) { + const processor = vc._processingNodes[index]; + const id = "processor" + index; + const node: ISnapshotNode = { type: processor.displayName, definition: processor._definition, inputs: getInputIDs(processor, vc), properties: {} }; - for (let property in node.definition.properties) { - node.properties[property] = processor[property]; + for (const property in processor._definition.properties) { + (node.properties as Record)[property] = ( + processor as unknown as Record + )[property]; } if (node.type === TRANSITIONTYPE) { - node.transitions = processor._transitions; + node.transitions = (processor as TransitionNode)._transitions; } result[id] = node; @@ -366,97 +405,106 @@ function snapshotNodes(vc) { return result; } -export function createControlFormForNode(node, nodeName) { - let rootDiv = document.createElement("div"); +export function createControlFormForNode(node: ProcessingNode, nodeName?: string): HTMLElement { + const rootDiv = document.createElement("div"); if (nodeName !== undefined) { - var title = document.createElement("h2"); - title.innerHTML = nodeName; + const title = document.createElement("h2"); + title.textContent = nodeName; rootDiv.appendChild(title); } - for (let propertyName in node._properties) { - let propertyParagraph = document.createElement("p"); - let propertyTitleHeader = document.createElement("h3"); - propertyTitleHeader.innerHTML = propertyName; + for (const propertyName in node._properties) { + const propertyParagraph = document.createElement("p"); + const propertyTitleHeader = document.createElement("h3"); + propertyTitleHeader.textContent = propertyName; propertyParagraph.appendChild(propertyTitleHeader); - let propertyValue = node._properties[propertyName].value; + const propertyValue = node._properties[propertyName].value; if (typeof propertyValue === "number") { - let range = document.createElement("input"); + const range = document.createElement("input"); range.setAttribute("type", "range"); range.setAttribute("min", "0"); range.setAttribute("max", "1"); range.setAttribute("step", "0.01"); - range.setAttribute("value", propertyValue, toString()); + range.setAttribute("value", propertyValue.toString()); - let number = document.createElement("input"); + const number = document.createElement("input"); number.setAttribute("type", "number"); number.setAttribute("min", "0"); number.setAttribute("max", "1"); number.setAttribute("step", "0.01"); - number.setAttribute("value", propertyValue, toString()); + number.setAttribute("value", propertyValue.toString()); let mouseDown = false; - range.onmousedown = function() { + range.onmousedown = function () { mouseDown = true; }; - range.onmouseup = function() { + range.onmouseup = function () { mouseDown = false; }; - range.onmousemove = function() { + range.onmousemove = function () { if (mouseDown) { - node[propertyName] = parseFloat(range.value); + (node as unknown as Record)[propertyName] = parseFloat( + range.value + ); number.value = range.value; } }; - range.onchange = function() { - node[propertyName] = parseFloat(range.value); + range.onchange = function () { + (node as unknown as Record)[propertyName] = parseFloat(range.value); number.value = range.value; }; - number.onchange = function() { - node[propertyName] = parseFloat(number.value); + number.onchange = function () { + (node as unknown as Record)[propertyName] = parseFloat( + number.value + ); range.value = number.value; }; propertyParagraph.appendChild(range); propertyParagraph.appendChild(number); - } else if (Object.prototype.toString.call(propertyValue) === "[object Array]") { - for (var i = 0; i < propertyValue.length; i++) { - let range = document.createElement("input"); + } else if (Array.isArray(propertyValue)) { + for (let i = 0; i < propertyValue.length; i++) { + const range = document.createElement("input"); range.setAttribute("type", "range"); range.setAttribute("min", "0"); range.setAttribute("max", "1"); range.setAttribute("step", "0.01"); - range.setAttribute("value", propertyValue[i], toString()); + range.setAttribute("value", propertyValue[i].toString()); - let number = document.createElement("input"); + const number = document.createElement("input"); number.setAttribute("type", "number"); number.setAttribute("min", "0"); number.setAttribute("max", "1"); number.setAttribute("step", "0.01"); - number.setAttribute("value", propertyValue, toString()); + number.setAttribute("value", propertyValue[i].toString()); - let index = i; + const index = i; let mouseDown = false; - range.onmousedown = function() { + range.onmousedown = function () { mouseDown = true; }; - range.onmouseup = function() { + range.onmouseup = function () { mouseDown = false; }; - range.onmousemove = function() { + range.onmousemove = function () { if (mouseDown) { - node[propertyName][index] = parseFloat(range.value); + (node as unknown as Record)[propertyName][index] = + parseFloat(range.value); number.value = range.value; } }; - range.onchange = function() { - node[propertyName][index] = parseFloat(range.value); + range.onchange = function () { + (node as unknown as Record)[propertyName][index] = parseFloat( + range.value + ); number.value = range.value; }; - number.onchange = function() { - node[propertyName][index] = parseFloat(number.value); + number.onchange = function () { + (node as unknown as Record)[propertyName][index] = parseFloat( + number.value + ); range.value = number.value; }; propertyParagraph.appendChild(range); @@ -469,102 +517,100 @@ export function createControlFormForNode(node, nodeName) { return rootDiv; } -function calculateNodeDepthFromDestination(videoContext) { - let destination = videoContext.destination; - let depthMap = new Map(); +function calculateNodeDepthFromDestination(videoContext: VideoContext): Map { + const destination = videoContext.destination; + const depthMap = new Map(); depthMap.set(destination, 0); - function itterateBackwards(node, depth = 0) { - for (let n of node.inputs) { - let d = depth + 1; - if (depthMap.has(n)) { - if (d > depthMap.get(n)) { + function iterateBackwards(node: GraphNode, depth = 0): void { + for (const n of node.inputs) { + const d = depth + 1; + const existing = depthMap.get(n); + if (existing !== undefined) { + if (d > existing) { depthMap.set(n, d); } } else { depthMap.set(n, d); } - itterateBackwards(n, depthMap.get(n)); + iterateBackwards(n, depthMap.get(n)); } } - itterateBackwards(destination); + iterateBackwards(destination); return depthMap; } -export function visualiseVideoContextGraph(videoContext, canvas) { - let ctx = canvas.getContext("2d"); - let w = canvas.width; - let h = canvas.height; +export function visualiseVideoContextGraph( + videoContext: VideoContext, + canvas: HTMLCanvasElement +): void { + const ctx = canvas.getContext("2d") as CanvasRenderingContext2D; + const w = canvas.width; + const h = canvas.height; ctx.clearRect(0, 0, w, h); - let nodeDepths = calculateNodeDepthFromDestination(videoContext); - let depths = nodeDepths.values(); - depths = Array.from(depths).sort(function(a, b) { + const nodeDepths = calculateNodeDepthFromDestination(videoContext); + const depths = Array.from(nodeDepths.values()).sort(function (a, b) { return b - a; }); - let maxDepth = depths[0]; + const maxDepth = depths[0]; - let xStep = w / (maxDepth + 1); + const xStep = w / (maxDepth + 1); - let nodeHeight = h / videoContext._sourceNodes.length / 3; - let nodeWidth = nodeHeight * 1.618; + const nodeHeight = h / videoContext._sourceNodes.length / 3; + const nodeWidth = nodeHeight * 1.618; - function calculateNodePos(node, nodeDepths, xStep, nodeHeight) { - let depth = nodeDepths.get(node); - nodeDepths.values(); + function calculateNodePos( + node: GraphNode, + nodeDepths: Map, + xStep: number, + nodeHeight: number + ): { x: number; y: number } { + const depth = nodeDepths.get(node); let count = 0; - for (let nodeDepth of nodeDepths) { + for (const nodeDepth of nodeDepths) { if (nodeDepth[0] === node) break; if (nodeDepth[1] === depth) count += 1; } return { - x: xStep * nodeDepths.get(node), + x: xStep * (depth as number), y: nodeHeight * 1.5 * count + 50 }; } - // "video":["#572A72", "#3C1255"], - // "image":["#7D9F35", "#577714"], - // "canvas":["#AA9639", "#806D15"] - for (let i = 0; i < videoContext._renderGraph.connections.length; i++) { - let conn = videoContext._renderGraph.connections[i]; - let source = calculateNodePos(conn.source, nodeDepths, xStep, nodeHeight); - let destination = calculateNodePos(conn.destination, nodeDepths, xStep, nodeHeight); + const conn = videoContext._renderGraph.connections[i]; + const source = calculateNodePos(conn.source, nodeDepths, xStep, nodeHeight); + const destination = calculateNodePos(conn.destination, nodeDepths, xStep, nodeHeight); if (source !== undefined && destination !== undefined) { ctx.beginPath(); - //ctx.moveTo(source.x + nodeWidth/2, source.y + nodeHeight/2); - let x1 = source.x + nodeWidth / 2; - let y1 = source.y + nodeHeight / 2; - let x2 = destination.x + nodeWidth / 2; - let y2 = destination.y + nodeHeight / 2; - let dx = x2 - x1; - let dy = y2 - y1; + const x1 = source.x + nodeWidth / 2; + const y1 = source.y + nodeHeight / 2; + const x2 = destination.x + nodeWidth / 2; + const y2 = destination.y + nodeHeight / 2; + const dx = x2 - x1; + const dy = y2 - y1; - let angle = Math.PI / 2 - Math.atan2(dx, dy); + const angle = Math.PI / 2 - Math.atan2(dx, dy); - let distance = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); + const distance = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); - let midX = Math.min(x1, x2) + (Math.max(x1, x2) - Math.min(x1, x2)) / 2; - let midY = Math.min(y1, y2) + (Math.max(y1, y2) - Math.min(y1, y2)) / 2; + const midX = Math.min(x1, x2) + (Math.max(x1, x2) - Math.min(x1, x2)) / 2; + const midY = Math.min(y1, y2) + (Math.max(y1, y2) - Math.min(y1, y2)) / 2; - let testX = (Math.cos(angle + Math.PI / 2) * distance) / 1.5 + midX; - let testY = (Math.sin(angle + Math.PI / 2) * distance) / 1.5 + midY; - // console.log(testX, testY); + const testX = (Math.cos(angle + Math.PI / 2) * distance) / 1.5 + midX; + const testY = (Math.sin(angle + Math.PI / 2) * distance) / 1.5 + midY; ctx.arc(testX, testY, distance / 1.2, angle - Math.PI + 0.95, angle - 0.95); - //ctx.arcTo(source.x + nodeWidth/2 ,source.y + nodeHeight/2,destination.x + nodeWidth/2,destination.y + nodeHeight/2,100); - //ctx.lineTo(midX, midY); ctx.stroke(); - //ctx.endPath(); } } - for (let node of nodeDepths.keys()) { - let pos = calculateNodePos(node, nodeDepths, xStep, nodeHeight); + for (const node of nodeDepths.keys()) { + const pos = calculateNodePos(node, nodeDepths, xStep, nodeHeight); let color = "#AA9639"; let text = ""; if (node.displayName === COMPOSITINGTYPE) { @@ -601,18 +647,38 @@ export function visualiseVideoContextGraph(videoContext, canvas) { return; } -export function createSigmaGraphDataFromRenderGraph(videoContext) { - function idForNode(node) { - if (videoContext._sourceNodes.indexOf(node) !== -1) { - let id = "source " + node.displayName + " " + videoContext._sourceNodes.indexOf(node); +export interface ISigmaGraphNode { + id: string; + label?: string; + x: number; + y: number; + size: number; + color?: string; + node: GraphNode; +} + +export function createSigmaGraphDataFromRenderGraph(videoContext: VideoContext): { + nodes: ISigmaGraphNode[]; + edges: Array<{ id: string; source: string; target: string }>; +} { + function idForNode(node: GraphNode): string { + if (videoContext._sourceNodes.indexOf(node as SourceNode) !== -1) { + const id = + "source " + + node.displayName + + " " + + videoContext._sourceNodes.indexOf(node as SourceNode); return id; } - let id = - "processor " + node.displayName + " " + videoContext._processingNodes.indexOf(node); + const id = + "processor " + + node.displayName + + " " + + videoContext._processingNodes.indexOf(node as ProcessingNode); return id; } - let graph = { + const graph = { nodes: [ { id: idForNode(videoContext.destination), @@ -620,15 +686,15 @@ export function createSigmaGraphDataFromRenderGraph(videoContext) { x: 2.5, y: 0.5, size: 2, - node: videoContext.destination + node: videoContext.destination as GraphNode } - ], - edges: [] + ] as ISigmaGraphNode[], + edges: [] as Array<{ id: string; source: string; target: string }> }; for (let i = 0; i < videoContext._sourceNodes.length; i++) { - let sourceNode = videoContext._sourceNodes[i]; - let y = i * (1.0 / videoContext._sourceNodes.length); + const sourceNode = videoContext._sourceNodes[i]; + const y = i * (1.0 / videoContext._sourceNodes.length); graph.nodes.push({ id: idForNode(sourceNode), label: "Source " + i.toString(), @@ -640,7 +706,7 @@ export function createSigmaGraphDataFromRenderGraph(videoContext) { }); } for (let i = 0; i < videoContext._processingNodes.length; i++) { - let processingNode = videoContext._processingNodes[i]; + const processingNode = videoContext._processingNodes[i]; graph.nodes.push({ id: idForNode(processingNode), x: Math.random() * 2.5, @@ -651,7 +717,7 @@ export function createSigmaGraphDataFromRenderGraph(videoContext) { } for (let i = 0; i < videoContext._renderGraph.connections.length; i++) { - let conn = videoContext._renderGraph.connections[i]; + const conn = videoContext._renderGraph.connections[i]; graph.edges.push({ id: "e" + i.toString(), source: idForNode(conn.source), @@ -662,12 +728,20 @@ export function createSigmaGraphDataFromRenderGraph(videoContext) { return graph; } -export function importSimpleEDL(ctx, playlist) { +export interface IEDLClip { + type: string; + src: string; + start: number; + duration: number; + sourceStart?: number; +} + +export function importSimpleEDL(ctx: VideoContext, playlist: IEDLClip[]) { // Create a "track" node to connect all the clips to. - let trackNode = ctx.compositor(DEFINITIONS.COMBINE); + const trackNode = ctx.compositor(DEFINITIONS.COMBINE); // Create a source node for each of the clips. - for (let clip of playlist) { + for (const clip of playlist) { let node; if (clip.type === "video") { node = ctx.video(clip.src, clip.sourceStart); @@ -684,11 +758,15 @@ export function importSimpleEDL(ctx, playlist) { return trackNode; } -export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) { - let ctx = canvas.getContext("2d"); - let w = canvas.width; - let h = canvas.height; - let trackHeight = h / videoContext._sourceNodes.length; +export function visualiseVideoContextTimeline( + videoContext: VideoContext, + canvas: HTMLCanvasElement, + currentTime: number +): void { + const ctx = canvas.getContext("2d") as CanvasRenderingContext2D; + const w = canvas.width; + const h = canvas.height; + const trackHeight = h / videoContext._sourceNodes.length; let playlistDuration = videoContext.duration; if (currentTime > playlistDuration && !videoContext.endOnLastSourceEnd) @@ -697,7 +775,7 @@ export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) if (videoContext.duration === Infinity) { let total = 0; for (let i = 0; i < videoContext._sourceNodes.length; i++) { - let sourceNode = videoContext._sourceNodes[i]; + const sourceNode = videoContext._sourceNodes[i]; if (sourceNode._stopTime !== Infinity) total += sourceNode._stopTime; } @@ -707,8 +785,8 @@ export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) playlistDuration = videoContext.currentTime + 5; } } - let pixelsPerSecond = w / playlistDuration; - let mediaSourceStyle = { + const pixelsPerSecond = w / playlistDuration; + const mediaSourceStyle = { video: ["#572A72", "#3C1255"], image: ["#7D9F35", "#577714"], canvas: ["#AA9639", "#806D15"] @@ -717,14 +795,15 @@ export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) ctx.clearRect(0, 0, w, h); ctx.fillStyle = "#999"; - for (let node of videoContext._processingNodes) { + for (const node of videoContext._processingNodes) { if (node.displayName !== TRANSITIONTYPE) continue; - for (let propertyName in node._transitions) { - for (let transition of node._transitions[propertyName]) { - let tW = (transition.end - transition.start) * pixelsPerSecond; - let tH = h; - let tX = transition.start * pixelsPerSecond; - let tY = 0; + const transitions = (node as TransitionNode)._transitions; + for (const propertyName in transitions) { + for (const transition of transitions[propertyName]) { + const tW = (transition.end - transition.start) * pixelsPerSecond; + const tH = h; + const tX = transition.start * pixelsPerSecond; + const tY = 0; ctx.fillStyle = "rgba(0,0,0, 0.3)"; ctx.fillRect(tX, tY, tW, tH); ctx.fill(); @@ -733,15 +812,15 @@ export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) } for (let i = 0; i < videoContext._sourceNodes.length; i++) { - let sourceNode = videoContext._sourceNodes[i]; + const sourceNode = videoContext._sourceNodes[i]; let duration = sourceNode._stopTime - sourceNode._startTime; if (duration === Infinity) duration = videoContext.currentTime; - let start = sourceNode._startTime; + const start = sourceNode._startTime; - let msW = duration * pixelsPerSecond; - let msH = trackHeight; - let msX = start * pixelsPerSecond; - let msY = trackHeight * i; + const msW = duration * pixelsPerSecond; + const msH = trackHeight; + const msX = start * pixelsPerSecond; + const msY = trackHeight * i; ctx.fillStyle = mediaSourceStyle.video[i % mediaSourceStyle.video.length]; ctx.fillRect(msX, msY, msW, msH); @@ -754,7 +833,19 @@ export function visualiseVideoContextTimeline(videoContext, canvas, currentTime) } } +interface IUpdateable { + _update(dt: number): void; +} + export class UpdateablesManager { + _updateables: IUpdateable[]; + _useWebworker: boolean; + _active: boolean; + _previousRAFTime: number | undefined; + _previousWorkerTime: number | undefined; + _webWorkerString: string; + _webWorker: Worker | undefined; + constructor() { this._updateables = []; this._useWebworker = false; @@ -782,88 +873,105 @@ export class UpdateablesManager { this._webWorker = undefined; } - _initWebWorker() { + _initWebWorker(): void { window.URL = window.URL || window.webkitURL; - let blob = new Blob([this._webWorkerString], { + const blob = new Blob([this._webWorkerString], { type: "application/javascript" }); this._webWorker = new Worker(URL.createObjectURL(blob)); this._webWorker.onmessage = msg => { - let time = msg.data; + const time = msg.data; this._updateWorkerTime(time); }; } - _lostVisibility() { + _lostVisibility(): void { this._previousWorkerTime = Date.now(); this._useWebworker = true; if (!this._webWorker) { this._initWebWorker(); } - this._webWorker.postMessage("start"); + this._webWorker?.postMessage("start"); } - _gainedVisibility() { + _gainedVisibility(): void { this._useWebworker = false; this._previousRAFTime = undefined; if (this._webWorker) this._webWorker.postMessage("stop"); requestAnimationFrame(this._updateRAFTime.bind(this)); } - _init() { - if (!window.Worker) return; - - //If page visibility API not present fallback to using "focus" and "blur" event listeners. - if (typeof document.hidden === "undefined") { - window.addEventListener("focus", this._gainedVisibility.bind(this)); - window.addEventListener("blur", this._lostVisibility.bind(this)); - return; + _init(): void { + //The webworker keeps updates ticking while the page is hidden, but it's only an + //enhancement; the rAF update loop must start regardless of Worker support. + if (window.Worker) { + if (typeof document.hidden !== "undefined") { + //use the visibility API to do the lose/gain focus properly + document.addEventListener( + "visibilitychange", + () => { + if (document.hidden === true) { + this._lostVisibility(); + } else { + this._gainedVisibility(); + } + }, + false + ); + } else { + //If page visibility API not present fallback to using "focus" and "blur" event listeners. + window.addEventListener("focus", this._gainedVisibility.bind(this)); + window.addEventListener("blur", this._lostVisibility.bind(this)); + } } - //Otherwise we can use the visibility API to do the loose/gain focus properly - document.addEventListener( - "visibilitychange", - () => { - if (document.hidden === true) { - this._lostVisibility(); - } else { - this._gainedVisibility(); - } - }, - false - ); - requestAnimationFrame(this._updateRAFTime.bind(this)); + if (typeof requestAnimationFrame === "function") { + requestAnimationFrame(this._updateRAFTime.bind(this)); + } } - _updateWorkerTime(time) { - let dt = (time - this._previousWorkerTime) / 1000; + _updateWorkerTime(time: number): void { + const dt = (time - (this._previousWorkerTime as number)) / 1000; if (dt !== 0) this._update(dt); this._previousWorkerTime = time; } - _updateRAFTime(time) { + _updateRAFTime(time: number): void { if (this._previousRAFTime === undefined) this._previousRAFTime = time; - let dt = (time - this._previousRAFTime) / 1000; + const dt = (time - this._previousRAFTime) / 1000; if (dt !== 0) this._update(dt); this._previousRAFTime = time; if (!this._useWebworker) requestAnimationFrame(this._updateRAFTime.bind(this)); } - _update(dt) { + _update(dt: number): void { for (let i = 0; i < this._updateables.length; i++) { - this._updateables[i]._update(parseFloat(dt)); + this._updateables[i]._update(dt); } } - register(updateable) { + register(updateable: IUpdateable): void { this._updateables.push(updateable); if (this._active === false) { this._active = true; this._init(); } } + + unregister(updateable: IUpdateable): boolean { + const index = this._updateables.indexOf(updateable); + if (index === -1) return false; + this._updateables.splice(index, 1); + return true; + } } -export function mediaElementHasSource({ src, srcObject }) { +export function mediaElementHasSource({ + src, + srcObject +}: { + src?: string; + srcObject?: unknown; +}): boolean { return !((src === "" || src === undefined) && srcObject == null); } diff --git a/src/videocontext.js b/src/videocontext.ts similarity index 69% rename from src/videocontext.js rename to src/videocontext.ts index f822e5df..ff69cbfd 100644 --- a/src/videocontext.js +++ b/src/videocontext.ts @@ -11,75 +11,151 @@ import { generateRandomId } from "./utils.js"; import NODES from "./SourceNodes/nodes.js"; -import VideoNode, { VIDEOTYPE } from "./SourceNodes/videonode.js"; +import VideoNode from "./SourceNodes/videonode.js"; import AudioNode from "./SourceNodes/audionode.js"; +import MediaNode from "./SourceNodes/medianode.js"; import ImageNode from "./SourceNodes/imagenode.js"; import CanvasNode from "./SourceNodes/canvasnode.js"; -import { SOURCENODESTATE } from "./SourceNodes/sourcenode.js"; +import SourceNode, { SOURCENODESTATE } from "./SourceNodes/sourcenode.js"; import CompositingNode from "./ProcessingNodes/compositingnode.js"; import DestinationNode from "./DestinationNode/destinationnode.js"; import EffectNode from "./ProcessingNodes/effectnode.js"; import TransitionNode from "./ProcessingNodes/transitionnode.js"; +import ProcessingNode from "./ProcessingNodes/processingnode.js"; import RenderGraph from "./rendergraph.js"; import VideoElementCache from "./videoelementcache.js"; import DEFINITIONS from "./Definitions/definitions.js"; +import type { IDefinition } from "./types.js"; -let updateablesManager = new UpdateablesManager(); +const updateablesManager = new UpdateablesManager(); + +/** + * Video Context States + * @readonly + * @typedef {Object} STATE + * @property {number} STATE.PLAYING - All sources are active + * @property {number} STATE.PAUSED - All sources are paused + * @property {number} STATE.STALLED - One or more sources is unable to play + * @property {number} STATE.ENDED - All sources have finished playing + * @property {number} STATE.BROKEN - The render graph is in a broken state + */ +const STATE = Object.freeze({ + PLAYING: 0, + PAUSED: 1, + STALLED: 2, + ENDED: 3, + BROKEN: 4 +}); + +/** + * Video Context Events + * @readonly + * @typedef {Object} EVENTS + * @property {string} EVENTS.UPDATE - Called any time a frame is rendered to the screen. + * @property {string} EVENTS.STALLED - Happens any time the playback is stopped due to buffer starvation for playing assets. + * @property {string} EVENTS.ENDED - Called once playback has finished (i.e ctx.currentTime == ctx.duration). + * @property {string} EVENTS.CONTENT - Called at the start of a time region where there is content playing out of one or more sourceNodes. + * @property {string} EVENTS.NOCONTENT - Called at the start of any time region where the VideoContext is still playing, but there are currently no active playing sources. + */ +const EVENTS = Object.freeze({ + UPDATE: "update", + STALLED: "stalled", + ENDED: "ended", + CONTENT: "content", + NOCONTENT: "nocontent" +}); + +interface ITimelineCallback { + time: number; + func: () => void; + ordering: number; +} + +type EventCallback = (currentTime: number) => void; + +interface IVideoContextOptions { + manualUpdate?: boolean; + endOnLastSourceEnd?: boolean; + useVideoElementCache?: boolean; + videoElementCacheSize?: number; + webglContextAttributes?: WebGLContextAttributes; +} /** * VideoContext. * @module VideoContext */ export default class VideoContext { + _canvas: HTMLCanvasElement; + _endOnLastSourceEnd: boolean; + _gl!: WebGLRenderingContext; + _useVideoElementCache: boolean | undefined; + _videoElementCache: VideoElementCache | undefined; + _id!: string; + _renderGraph!: RenderGraph; + _sourceNodes!: SourceNode[]; + _processingNodes!: ProcessingNode[]; + _timeline!: unknown[]; + _currentTime!: number; + _state!: number; + _playbackRate!: number; + _volume!: number; + _sourcesPlaying: boolean | undefined; + _destinationNode!: DestinationNode; + _callbacks!: Map; + _timelineCallbacks!: ITimelineCallback[]; + /** - * Initialise the VideoContext and render to the specific canvas. A 2nd parameter can be passed to the constructor which is a function that get's called if the VideoContext fails to initialise. + * Initialise the VideoContext and render to the specific canvas. A 2nd parameter can be passed to the constructor which is a function that gets called if the VideoContext fails to initialise. * * @param {Canvas} canvas - the canvas element to render the output to. * @param {function} [initErrorCallback] - a callback for if initialising the canvas failed. * @param {Object} [options] - a number of custom options which can be set on the VideoContext, generally best left as default. * @param {boolean} [options.manualUpdate=false] - Make Video Context not use the updatable manager * @param {boolean} [options.endOnLastSourceEnd=true] - Trigger an `ended` event when the current time goes above the duration of the composition - * @param {boolean} [options.useVideoElementCache=true] - Creates a pool of video element that will be all initialised at the same time. Important for mobile support - * @param {number} [options.videoElementCacheSize=6] - Number of video element in the pool - * @param {object} [options.webglContextAttributes] - A set of attributes used when getting the GL context. Alpha will always be `true`. + * @param {boolean} [options.useVideoElementCache=true] - Creates a pool of video elements that will be all initialised at the same time. Important for mobile support + * @param {number} [options.videoElementCacheSize=6] - Number of video elements in the pool + * @param {object} [options.webglContextAttributes] - A set of attributes used when getting the GL context. Alpha will always be `false`. * * @example * var canvasElement = document.getElementById("canvas"); - * var ctx = new VideoContext(canvasElement, () => console.error("Sorry, your browser dosen\'t support WebGL")); + * var ctx = new VideoContext(canvasElement, () => console.error("Sorry, your browser doesn't support WebGL")); * var videoNode = ctx.video("video.mp4"); * videoNode.connect(ctx.destination); * videoNode.start(0); * videoNode.stop(10); * ctx.play(); - * */ constructor( - canvas, - initErrorCallback, + canvas: HTMLCanvasElement, + initErrorCallback?: () => void, { manualUpdate = false, endOnLastSourceEnd = true, useVideoElementCache = true, videoElementCacheSize = 6, webglContextAttributes = {} - } = {} + }: IVideoContextOptions = {} ) { this._canvas = canvas; this._endOnLastSourceEnd = endOnLastSourceEnd; - this._gl = canvas.getContext( - "experimental-webgl", - Object.assign( - { preserveDrawingBuffer: true }, // can be overriden - webglContextAttributes, - { alpha: false } // Can't be overriden because it is copied last - ) + const contextAttributes = Object.assign( + { preserveDrawingBuffer: true }, // can be overridden + webglContextAttributes, + { alpha: false } // Can't be overridden because it is copied last ); - if (this._gl === null) { - console.error("Failed to intialise WebGL."); + const gl = (canvas.getContext("webgl", contextAttributes) || + canvas.getContext( + "experimental-webgl", + contextAttributes + )) as WebGLRenderingContext | null; + if (!gl) { + console.error("Failed to initialise WebGL."); if (initErrorCallback) initErrorCallback(); return; } + this._gl = gl; // Initialise the video element cache this._useVideoElementCache = useVideoElementCache; @@ -89,7 +165,10 @@ export default class VideoContext { // Create a unique ID for this VideoContext which can be used in the debugger. if (this._canvas.id) { - if (typeof this._canvas.id === "string" || this._canvas.id instanceof String) { + if ( + typeof this._canvas.id === "string" || + (this._canvas.id as unknown) instanceof String + ) { this._id = canvas.id; } } @@ -110,7 +189,7 @@ export default class VideoContext { this._callbacks = new Map(); Object.keys(VideoContext.EVENTS).forEach(name => - this._callbacks.set(VideoContext.EVENTS[name], []) + this._callbacks.set(VideoContext.EVENTS[name as keyof typeof VideoContext.EVENTS], []) ); this._timelineCallbacks = []; @@ -124,18 +203,18 @@ export default class VideoContext { * Returns an ID assigned to the VideoContext instance. This will either be the same id as the underlying canvas element, * or a uniquely generated one. */ - get id() { + get id(): string { return this._id; } /** * Set the ID of the VideoContext instance. This should be unique. */ - set id(newID) { - delete window.__VIDEOCONTEXT_REFS__[this._id]; - if (window.__VIDEOCONTEXT_REFS__[newID] !== undefined) + set id(newID: string) { + delete window.__VIDEOCONTEXT_REFS__?.[this._id]; + if (window.__VIDEOCONTEXT_REFS__?.[newID] !== undefined) console.warn("Warning; setting id to that of an existing VideoContext instance."); - window.__VIDEOCONTEXT_REFS__[newID] = this; + if (window.__VIDEOCONTEXT_REFS__) window.__VIDEOCONTEXT_REFS__[newID] = this; this._id = newID; } @@ -145,7 +224,7 @@ export default class VideoContext { * @param {Function} func - the callback to register. * @param {number} ordering - the order in which to call the callback if more than one is registered for the same time. */ - registerTimelineCallback(time, func, ordering = 0) { + registerTimelineCallback(time: number, func: () => void, ordering = 0): void { this._timelineCallbacks.push({ time: time, func: func, @@ -157,15 +236,15 @@ export default class VideoContext { * Unregister a callback which happens at a specific point in time. * @param {Function} func - the callback to unregister. */ - unregisterTimelineCallback(func) { - let toRemove = []; - for (let callback of this._timelineCallbacks) { + unregisterTimelineCallback(func: () => void): void { + const toRemove = []; + for (const callback of this._timelineCallbacks) { if (callback.func === func) { toRemove.push(callback); } } - for (let callback of toRemove) { - let index = this._timelineCallbacks.indexOf(callback); + for (const callback of toRemove) { + const index = this._timelineCallbacks.indexOf(callback); this._timelineCallbacks.splice(index, 1); } } @@ -183,9 +262,10 @@ export default class VideoContext { * ctx.registerCallback(VideoContext.EVENTS.UPDATE, () => console.log("new frame")); * ctx.registerCallback(VideoContext.EVENTS.ENDED, () => console.log("Playback ended")); */ - registerCallback(type, func) { + registerCallback(type: string, func: EventCallback): false | undefined { if (!this._callbacks.has(type)) return false; - this._callbacks.get(type).push(func); + this._callbacks.get(type)?.push(func); + return undefined; } /** @@ -204,11 +284,10 @@ export default class VideoContext { * ctx.registerCallback(VideoContext.EVENTS.UPDATE, updateCallback); * //then unregister it * ctx.unregisterCallback(updateCallback); - * */ - unregisterCallback(func) { - for (let funcArray of this._callbacks.values()) { - let index = funcArray.indexOf(func); + unregisterCallback(func: EventCallback): boolean { + for (const funcArray of this._callbacks.values()) { + const index = funcArray.indexOf(func); if (index !== -1) { funcArray.splice(index, 1); return true; @@ -217,9 +296,10 @@ export default class VideoContext { return false; } - _callCallbacks(type) { - let funcArray = this._callbacks.get(type); - for (let func of funcArray) { + _callCallbacks(type: string): void { + const funcArray = this._callbacks.get(type); + if (!funcArray) return; + for (const func of funcArray) { func(this._currentTime); } } @@ -228,21 +308,29 @@ export default class VideoContext { * Get the canvas that the VideoContext is using. * * @return {HTMLCanvasElement} The canvas that the VideoContext is using. - * */ - get element() { + get element(): HTMLCanvasElement { return this._canvas; } /** * Get the current state. * @return {STATE} The number representing the state. - * */ - get state() { + get state(): number { return this._state; } + /** + * Get whether the VideoContext will trigger an `ended` event when the current time goes + * above the duration of the composition. + * + * @return {boolean} The value of the endOnLastSourceEnd option. + */ + get endOnLastSourceEnd(): boolean { + return this._endOnLastSourceEnd; + } + /** * Set the progress through the internal timeline. * Setting this can be used as a way to implement a scrubbable timeline. @@ -258,14 +346,13 @@ export default class VideoContext { * videoNode.stop(20); * ctx.currentTime = 10; // seek 10 seconds in * ctx.play(); - * */ - set currentTime(currentTime) { + set currentTime(currentTime: number) { if (currentTime < this.duration && this._state === VideoContext.STATE.ENDED) this._state = VideoContext.STATE.PAUSED; - if (typeof currentTime === "string" || currentTime instanceof String) { - currentTime = parseFloat(currentTime); + if (typeof currentTime === "string" || (currentTime as unknown) instanceof String) { + currentTime = parseFloat(currentTime as unknown as string); } for (let i = 0; i < this._sourceNodes.length; i++) { @@ -292,9 +379,8 @@ export default class VideoContext { * videoNode.stop(10); * ctx.play(); * setTimeout(() => console.log(ctx.currentTime),1000); //should print roughly 1.0 - * */ - get currentTime() { + get currentTime(): number { return this._currentTime; } @@ -317,7 +403,7 @@ export default class VideoContext { * * ctx.play(); */ - get duration() { + get duration(): number { let maxTime = 0; for (let i = 0; i < this._sourceNodes.length; i++) { if ( @@ -333,7 +419,7 @@ export default class VideoContext { /** * Get the final node in the render graph which represents the canvas to display content on to. * - * This proprety is read-only and there can only ever be one destination node. Other nodes can connect to this but you cannot connect this node to anything. + * This property is read-only and there can only ever be one destination node. Other nodes can connect to this but you cannot connect this node to anything. * * @return {DestinationNode} A graph node representing the canvas to display the content on. * @example @@ -343,9 +429,8 @@ export default class VideoContext { * videoNode.start(0); * videoNode.stop(10); * videoNode.connect(ctx.destination); - * */ - get destination() { + get destination(): DestinationNode { return this._destinationNode; } @@ -365,12 +450,12 @@ export default class VideoContext { * ctx.playbackRate = 2; * ctx.play(); // Double playback rate means this will finish playing in 5 seconds. */ - set playbackRate(rate) { + set playbackRate(rate: number) { if (rate <= 0) { throw new RangeError("playbackRate must be greater than 0"); } - for (let node of this._sourceNodes) { - if (node.constructor.name === VIDEOTYPE) { + for (const node of this._sourceNodes) { + if (node instanceof MediaNode) { node._globalPlaybackRate = rate; node._playbackRateUpdated = true; } @@ -379,20 +464,20 @@ export default class VideoContext { } /** - * Return the current playbackRate of the video context. + * Return the current playbackRate of the video context. * @return {number} A value representing the playbackRate. 1.0 by default. */ - get playbackRate() { + get playbackRate(): number { return this._playbackRate; } /** - * Set the volume of all MediaNode created in the VideoContext. - * @param {number} volume - the volume to apply to the video nodes. + * Set the volume of all MediaNodes created in the VideoContext. + * @param {number} volume - the volume to apply to the media nodes. */ - set volume(vol) { - for (let node of this._sourceNodes) { - if (node instanceof VideoNode || node instanceof AudioNode) { + set volume(vol: number) { + for (const node of this._sourceNodes) { + if (node instanceof MediaNode) { node.volume = vol; } } @@ -403,7 +488,7 @@ export default class VideoContext { * Return the current volume of the video context. * @return {number} A value representing the volume. 1.0 by default. */ - get volume() { + get volume(): number { return this._volume; } @@ -418,7 +503,7 @@ export default class VideoContext { * videoNode.stop(10); * ctx.play(); */ - play() { + play(): boolean { console.debug("VideoContext - playing"); //Initialise the video element cache if (this._videoElementCache) this._videoElementCache.init(); @@ -440,7 +525,7 @@ export default class VideoContext { * ctx.play(); * setTimeout(() => ctx.pause(), 1000); //pause playback after roughly one second. */ - pause() { + pause(): boolean { console.debug("VideoContext - pausing"); this._state = VideoContext.STATE.PAUSED; return true; @@ -449,7 +534,7 @@ export default class VideoContext { /** * Create a new node representing a video source * - * @param {string|HTMLVideoElement|MediaStream} - The URL or video element to create the video from. + * @param {string|HTMLVideoElement|MediaStream} src - The URL or video element to create the video from. * @param {number} [sourceOffset=0] - Offset into the start of the source video to start playing from. * @param {number} [preloadTime=4] - How many seconds before the video is to be played to start loading it. * @param {Object} [videoElementAttributes] - A dictionary of attributes to map onto the underlying video element. @@ -460,8 +545,13 @@ export default class VideoContext { * var ctx = new VideoContext(canvasElement); * var videoNode = ctx.video("bigbuckbunny.mp4"); */ - video(src, sourceOffset = 0, preloadTime = 4, videoElementAttributes = {}) { - let videoNode = new VideoNode( + video( + src: string | HTMLVideoElement | MediaStream, + sourceOffset = 0, + preloadTime = 4, + videoElementAttributes: Record = {} + ): VideoNode { + const videoNode = new VideoNode( src, this._gl, this._renderGraph, @@ -480,8 +570,8 @@ export default class VideoContext { * Create a new node representing an audio source * @param {string|HTMLAudioElement|MediaStream} src - The url or audio element to create the audio node from. * @param {number} [sourceOffset=0] - Offset into the start of the source audio to start playing from. - * @param {number} [preloadTime=4] - How long before a node is to be displayed to attmept to load it. - * @param {Object} [imageElementAttributes] - Any attributes to be given to the underlying image element. + * @param {number} [preloadTime=4] - How long before a node is to be displayed to attempt to load it. + * @param {Object} [audioElementAttributes] - Any attributes to be given to the underlying audio element. * @return {AudioNode} A new audio node. * * @example @@ -489,8 +579,13 @@ export default class VideoContext { * var ctx = new VideoContext(canvasElement); * var audioNode = ctx.audio("ziggystardust.mp3"); */ - audio(src, sourceOffset = 0, preloadTime = 4, audioElementAttributes = {}) { - let audioNode = new AudioNode( + audio( + src: string | HTMLAudioElement | MediaStream, + sourceOffset = 0, + preloadTime = 4, + audioElementAttributes: Record = {} + ): AudioNode { + const audioNode = new AudioNode( src, this._gl, this._renderGraph, @@ -498,7 +593,7 @@ export default class VideoContext { this._playbackRate, sourceOffset, preloadTime, - this._audioElementCache, + this._videoElementCache, audioElementAttributes ); this._sourceNodes.push(audioNode); @@ -508,7 +603,12 @@ export default class VideoContext { /** * @deprecated */ - createVideoSourceNode(src, sourceOffset = 0, preloadTime = 4, videoElementAttributes = {}) { + createVideoSourceNode( + src: string | HTMLVideoElement | MediaStream, + sourceOffset = 0, + preloadTime = 4, + videoElementAttributes: Record = {} + ): VideoNode { this._deprecate( "Warning: createVideoSourceNode will be deprecated in v1.0, please switch to using VideoContext.video()" ); @@ -518,7 +618,7 @@ export default class VideoContext { /** * Create a new node representing an image source * @param {string|Image|ImageBitmap} src - The url or image element to create the image node from. - * @param {number} [preloadTime=4] - How long before a node is to be displayed to attmept to load it. + * @param {number} [preloadTime=4] - How long before a node is to be displayed to attempt to load it. * @param {Object} [imageElementAttributes] - Any attributes to be given to the underlying image element. * @return {ImageNode} A new image node. * @@ -533,8 +633,12 @@ export default class VideoContext { * var ctx = new VideoContext(canvasElement); * var imageNode = ctx.image(imageElement); */ - image(src, preloadTime = 4, imageElementAttributes = {}) { - let imageNode = new ImageNode( + image( + src: string | HTMLImageElement | ImageBitmap, + preloadTime = 4, + imageElementAttributes: Record = {} + ): ImageNode { + const imageNode = new ImageNode( src, this._gl, this._renderGraph, @@ -549,20 +653,25 @@ export default class VideoContext { /** * @deprecated */ - createImageSourceNode(src, sourceOffset = 0, preloadTime = 4, imageElementAttributes = {}) { + createImageSourceNode( + src: string | HTMLImageElement | ImageBitmap, + _sourceOffset = 0, + preloadTime = 4, + imageElementAttributes: Record = {} + ): ImageNode { this._deprecate( "Warning: createImageSourceNode will be deprecated in v1.0, please switch to using VideoContext.image()" ); - return this.image(src, sourceOffset, preloadTime, imageElementAttributes); + return this.image(src, preloadTime, imageElementAttributes); } /** * Create a new node representing a canvas source - * @param {Canvas} src - The canvas element to create the canvas node from. + * @param {Canvas} canvas - The canvas element to create the canvas node from. * @return {CanvasNode} A new canvas node. */ - canvas(canvas) { - let canvasNode = new CanvasNode(canvas, this._gl, this._renderGraph, this._currentTime); + canvas(canvas: HTMLCanvasElement): CanvasNode { + const canvasNode = new CanvasNode(canvas, this._gl, this._renderGraph, this._currentTime); this._sourceNodes.push(canvasNode); return canvasNode; } @@ -570,20 +679,20 @@ export default class VideoContext { /** * @deprecated */ - createCanvasSourceNode(canvas, sourceOffset = 0, preloadTime = 4) { + createCanvasSourceNode(canvas: HTMLCanvasElement): CanvasNode { this._deprecate( "Warning: createCanvasSourceNode will be deprecated in v1.0, please switch to using VideoContext.canvas()" ); - return this.canvas(canvas, sourceOffset, preloadTime); + return this.canvas(canvas); } /** * Create a new effect node. - * @param {Object} definition - this is an object defining the shaders, inputs, and properties of the compositing node to create. Builtin definitions can be found by accessing VideoContext.DEFINITIONS. + * @param {Object} definition - this is an object defining the shaders, inputs, and properties of the effect node to create. Built-in definitions can be found by accessing VideoContext.DEFINITIONS. * @return {EffectNode} A new effect node created from the passed definition */ - effect(definition) { - let effectNode = new EffectNode(this._gl, this._renderGraph, definition); + effect(definition: IDefinition): EffectNode { + const effectNode = new EffectNode(this._gl, this._renderGraph, definition); this._processingNodes.push(effectNode); return effectNode; } @@ -591,7 +700,7 @@ export default class VideoContext { /** * @deprecated */ - createEffectNode(definition) { + createEffectNode(definition: IDefinition): EffectNode { this._deprecate( "Warning: createEffectNode will be deprecated in v1.0, please switch to using VideoContext.effect()" ); @@ -599,14 +708,14 @@ export default class VideoContext { } /** - * Create a new compositiing node. + * Create a new compositing node. * * Compositing nodes are used for operations such as combining multiple video sources into a single track/connection for further processing in the graph. * - * A compositing node is slightly different to other processing nodes in that it only has one input in it's definition but can have unlimited connections made to it. - * The shader in the definition is run for each input in turn, drawing them to the output buffer. This means there can be no interaction between the spearte inputs to a compositing node, as they are individually processed in seperate shader passes. + * A compositing node is slightly different to other processing nodes in that it only has one input in its definition but can have unlimited connections made to it. + * The shader in the definition is run for each input in turn, drawing them to the output buffer. This means there can be no interaction between the separate inputs to a compositing node, as they are individually processed in separate shader passes. * - * @param {Object} definition - this is an object defining the shaders, inputs, and properties of the compositing node to create. Builtin definitions can be found by accessing VideoContext.DEFINITIONS + * @param {Object} definition - this is an object defining the shaders, inputs, and properties of the compositing node to create. Built-in definitions can be found by accessing VideoContext.DEFINITIONS * * @return {CompositingNode} A new compositing node created from the passed definition. * @@ -643,7 +752,7 @@ export default class VideoContext { * //Create the node, passing in the definition. * var trackNode = videoCtx.compositor(combineDefinition); * - * //create two videos which will play at back to back + * //create two videos which will play back to back * var videoNode1 = ctx.video("video1.mp4"); * videoNode1.play(0); * videoNode1.stop(10); @@ -658,21 +767,30 @@ export default class VideoContext { * * //Don't do anything exciting, just connect it to the output. * trackNode.connect(ctx.destination); - * */ - compositor(definition) { - let compositingNode = new CompositingNode(this._gl, this._renderGraph, definition); + compositor(definition: IDefinition): CompositingNode { + const compositingNode = new CompositingNode(this._gl, this._renderGraph, definition); this._processingNodes.push(compositingNode); return compositingNode; } /** - * Instanciate a custom built source node + * Instantiate a custom built source node * @param {SourceNode} CustomSourceNode * @param {Object} src * @param {...any} options */ - customSourceNode(CustomSourceNode, src, ...options) { + customSourceNode( + CustomSourceNode: new ( + src: unknown, + gl: WebGLRenderingContext, + renderGraph: RenderGraph, + currentTime: number, + ...args: unknown[] + ) => T, + src: unknown, + ...options: unknown[] + ): T { const customSourceNode = new CustomSourceNode( src, this._gl, @@ -685,9 +803,9 @@ export default class VideoContext { } /** - * @depricated + * @deprecated */ - createCompositingNode(definition) { + createCompositingNode(definition: IDefinition): CompositingNode { this._deprecate( "Warning: createCompositingNode will be deprecated in v1.0, please switch to using VideoContext.compositor()" ); @@ -697,13 +815,13 @@ export default class VideoContext { /** * Create a new transition node. * - * Transistion nodes are a type of effect node which have parameters which can be changed as events on the timeline. + * Transition nodes are a type of effect node which have parameters which can be changed as events on the timeline. * * For example a transition node which cross-fades between two videos could have a "mix" property which sets the - * progress through the transistion. Rather than having to write your own code to adjust this property at specfic + * progress through the transition. Rather than having to write your own code to adjust this property at specific * points in time a transition node has a "transition" function which takes a startTime, stopTime, targetValue, and a - * propertyName (which will be "mix"). This will linearly interpolate the property from the curernt value to - * tragetValue between the startTime and stopTime. + * propertyName (which will be "mix"). This will linearly interpolate the property from the current value to + * targetValue between the startTime and stopTime. * * @param {Object} definition - this is an object defining the shaders, inputs, and properties of the transition node to create. * @return {TransitionNode} A new transition node created from the passed definition. @@ -759,7 +877,7 @@ export default class VideoContext { * videoNode2.play(8); * videoNode2.stop(18); * - * //Connect the nodes to the transistion node. + * //Connect the nodes to the transition node. * videoNode1.connect(transitionNode); * videoNode2.connect(transitionNode); * @@ -772,8 +890,8 @@ export default class VideoContext { * //start playback * ctx.play(); */ - transition(definition) { - let transitionNode = new TransitionNode(this._gl, this._renderGraph, definition); + transition(definition: IDefinition): TransitionNode { + const transitionNode = new TransitionNode(this._gl, this._renderGraph, definition); this._processingNodes.push(transitionNode); return transitionNode; } @@ -781,16 +899,16 @@ export default class VideoContext { /** * @deprecated */ - createTransitionNode(definition) { + createTransitionNode(definition: IDefinition): TransitionNode { this._deprecate( "Warning: createTransitionNode will be deprecated in v1.0, please switch to using VideoContext.transition()" ); return this.transition(definition); } - _isStalled() { + _isStalled(): boolean { for (let i = 0; i < this._sourceNodes.length; i++) { - let sourceNode = this._sourceNodes[i]; + const sourceNode = this._sourceNodes[i]; if (!sourceNode._isReady()) { return true; } @@ -816,21 +934,17 @@ export default class VideoContext { * requestAnimationFrame(update); * } * update(); - * */ - update(dt) { + update(dt: number): void { this._update(dt); } - _update(dt) { + _update(dt: number): void { //Remove any destroyed nodes - this._sourceNodes = this._sourceNodes.filter(sourceNode => { - if (!sourceNode.destroyed) return sourceNode; - }); - - this._processingNodes = this._processingNodes.filter(processingNode => { - if (!processingNode.destroyed) return processingNode; - }); + this._sourceNodes = this._sourceNodes.filter(sourceNode => !sourceNode.destroyed); + this._processingNodes = this._processingNodes.filter( + processingNode => !processingNode.destroyed + ); if ( this._state === VideoContext.STATE.PLAYING || @@ -850,38 +964,41 @@ export default class VideoContext { if (this._state === VideoContext.STATE.PLAYING) { //Handle timeline callbacks. - let activeCallbacks = new Map(); - for (let callback of this._timelineCallbacks) { + const activeCallbacks = new Map(); + for (const callback of this._timelineCallbacks) { if ( callback.time >= this.currentTime && callback.time < this._currentTime + dt * this._playbackRate ) { //group the callbacks by time - if (!activeCallbacks.has(callback.time)) - activeCallbacks.set(callback.time, []); - activeCallbacks.get(callback.time).push(callback); + let callbacks = activeCallbacks.get(callback.time); + if (!callbacks) { + callbacks = []; + activeCallbacks.set(callback.time, callbacks); + } + callbacks.push(callback); } } //Sort the groups of callbacks by the times of the groups - let timeIntervals = Array.from(activeCallbacks.keys()); - timeIntervals.sort(function(a, b) { + const timeIntervals = Array.from(activeCallbacks.keys()); + timeIntervals.sort(function (a, b) { return a - b; }); - for (let t of timeIntervals) { - let callbacks = activeCallbacks.get(t); - callbacks.sort(function(a, b) { + for (const t of timeIntervals) { + const callbacks = activeCallbacks.get(t) as ITimelineCallback[]; + callbacks.sort(function (a, b) { return a.ordering - b.ordering; }); - for (let callback of callbacks) { + for (const callback of callbacks) { callback.func(); } } this._currentTime += dt * this._playbackRate; if (this._currentTime > this.duration && this._endOnLastSourceEnd) { - //Do an update od the sourcenodes in case anything in the "ended" callbacks modifes currentTime and sources haven't had a chance to stop. + //Do an update of the source nodes in case anything in the "ended" callbacks modifies currentTime and sources haven't had a chance to stop. for (let i = 0; i < this._sourceNodes.length; i++) { this._sourceNodes[i]._update(this._currentTime); } @@ -893,7 +1010,7 @@ export default class VideoContext { let sourcesPlaying = false; for (let i = 0; i < this._sourceNodes.length; i++) { - let sourceNode = this._sourceNodes[i]; + const sourceNode = this._sourceNodes[i]; if (this._state === VideoContext.STATE.STALLED) { if (sourceNode._isReady() && sourceNode._state === SOURCENODESTATE.playing) @@ -927,26 +1044,25 @@ export default class VideoContext { } /* - * Itterate the directed acyclic graph using Khan's algorithm (KHAAAAAN!). + * Iterate the directed acyclic graph using Kahn's algorithm. * - * This has highlighted a bunch of ineffencies in the rendergraph class about how its stores connections. + * This has highlighted a bunch of inefficiencies in the rendergraph class about how it stores connections. * Mainly the fact that to get inputs for a node you have to iterate the full list of connections rather than - * a node owning it's connections. - * The trade off with changing this is making/removing connections becomes more costly performance wise, but - * this is definitely worth while because getting the connnections is a much more common operation. + * a node owning its connections. + * The trade-off with changing this is making/removing connections becomes more costly performance wise, but + * this is definitely worthwhile because getting the connections is a much more common operation. * * TL;DR Future matt - refactor this. - * */ - let sortedNodes = []; - let connections = this._renderGraph.connections.slice(); - let nodes = RenderGraph.getInputlessNodes(connections); + const sortedNodes = []; + const connections = this._renderGraph.connections.slice(); + const nodes = RenderGraph.getInputlessNodes(connections); while (nodes.length > 0) { - let node = nodes.pop(); + const node = nodes.pop() as (typeof nodes)[number]; sortedNodes.push(node); - for (let edge of RenderGraph.outputEdgesFor(node, connections)) { - let index = connections.indexOf(edge); + for (const edge of RenderGraph.outputEdgesFor(node, connections)) { + const index = connections.indexOf(edge); if (index > -1) connections.splice(index, 1); if (RenderGraph.inputEdgesFor(edge.destination, connections).length === 0) { nodes.push(edge.destination); @@ -954,10 +1070,10 @@ export default class VideoContext { } } - for (let node of sortedNodes) { - if (this._sourceNodes.indexOf(node) === -1) { - node._update(this._currentTime); - node._render(); + for (const node of sortedNodes) { + if (this._sourceNodes.indexOf(node as SourceNode) === -1) { + (node as ProcessingNode)._update(this._currentTime); + (node as ProcessingNode)._render(); } } } @@ -966,14 +1082,16 @@ export default class VideoContext { /** * Destroy all nodes in the graph and reset the timeline. After calling this any created nodes will be unusable. */ - reset() { - for (let callback of this._callbacks) { - this.unregisterCallback(callback); - } - for (let node of this._sourceNodes) { + reset(): void { + //clear all registered event callbacks first, so they don't fire during the reset + Object.keys(VideoContext.EVENTS).forEach(name => + this._callbacks.set(VideoContext.EVENTS[name as keyof typeof VideoContext.EVENTS], []) + ); + this._timelineCallbacks = []; + for (const node of this._sourceNodes) { node.destroy(); } - for (let node of this._processingNodes) { + for (const node of this._processingNodes) { node.destroy(); } this._update(0); @@ -984,21 +1102,29 @@ export default class VideoContext { this._state = VideoContext.STATE.PAUSED; this._playbackRate = 1.0; this._sourcesPlaying = undefined; - Object.keys(VideoContext.EVENTS).forEach(name => - this._callbacks.set(VideoContext.EVENTS[name], []) - ); - this._timelineCallbacks = []; } - _deprecate(msg) { + /** + * Destroy the VideoContext, unregistering it from the update loop and destroying all + * created nodes. After calling this the VideoContext is unusable. + */ + destroy(): void { + updateablesManager.unregister(this); + this.reset(); + if (window.__VIDEOCONTEXT_REFS__ !== undefined) { + delete window.__VIDEOCONTEXT_REFS__[this._id]; + } + } + + _deprecate(msg: string): void { console.log(msg); } - static get DEFINITIONS() { + static get DEFINITIONS(): typeof DEFINITIONS { return DEFINITIONS; } - static get NODES() { + static get NODES(): typeof NODES { return NODES; } @@ -1008,50 +1134,14 @@ export default class VideoContext { snapshot() { return snapshot(this); } -} - -/** - * Video Context States - * @readonly - * @typedef {Object} STATE - * @property {number} STATE.PLAYING - All sources are active - * @property {number} STATE.PAUSED - All sources are paused - * @property {number} STATE.STALLED - One or more sources is unable to play - * @property {number} STATE.ENDED - All sources have finished playing - * @property {number} STATE.BROKEN - The render graph is in a broken state - */ -const STATE = Object.freeze({ - PLAYING: 0, - PAUSED: 1, - STALLED: 2, - ENDED: 3, - BROKEN: 4 -}); -VideoContext.STATE = STATE; -/** - * Video Context Events - * @readonly - * @typedef {Object} STATE - * @property {string} STATE.UPDATE - Called any time a frame is rendered to the screen. - * @property {string} STATE.STALLED - happens anytime the playback is stopped due to buffer starvation for playing assets. - * @property {string} STATE.ENDED - Called once plackback has finished (i.e ctx.currentTime == ctx.duration). - * @property {string} STATE.CONTENT - Called at the start of a time region where there is content playing out of one or more sourceNodes. - * @property {number} STATE.NOCONTENT - Called at the start of any time region where the VideoContext is still playing, but there are currently no active playing sources. - */ -const EVENTS = Object.freeze({ - UPDATE: "update", - STALLED: "stalled", - ENDED: "ended", - CONTENT: "content", - NOCONTENT: "nocontent" -}); -VideoContext.EVENTS = EVENTS; - -VideoContext.visualiseVideoContextTimeline = visualiseVideoContextTimeline; -VideoContext.visualiseVideoContextGraph = visualiseVideoContextGraph; -VideoContext.createControlFormForNode = createControlFormForNode; -VideoContext.createSigmaGraphDataFromRenderGraph = createSigmaGraphDataFromRenderGraph; -VideoContext.exportToJSON = exportToJSON; -VideoContext.updateablesManager = updateablesManager; -VideoContext.importSimpleEDL = importSimpleEDL; + static STATE = STATE; + static EVENTS = EVENTS; + static visualiseVideoContextTimeline = visualiseVideoContextTimeline; + static visualiseVideoContextGraph = visualiseVideoContextGraph; + static createControlFormForNode = createControlFormForNode; + static createSigmaGraphDataFromRenderGraph = createSigmaGraphDataFromRenderGraph; + static exportToJSON = exportToJSON; + static updateablesManager = updateablesManager; + static importSimpleEDL = importSimpleEDL; +} diff --git a/src/videoelementcache.js b/src/videoelementcache.ts similarity index 71% rename from src/videoelementcache.js rename to src/videoelementcache.ts index dcfa98a0..7068dfc2 100644 --- a/src/videoelementcache.js +++ b/src/videoelementcache.ts @@ -1,7 +1,11 @@ -import VideoElementCacheItem from "./videoelementcacheitem"; -import { mediaElementHasSource } from "./utils"; +import VideoElementCacheItem from "./videoelementcacheitem.js"; +import { mediaElementHasSource } from "./utils.js"; +import type MediaNode from "./SourceNodes/medianode.js"; class VideoElementCache { + _cacheItems: VideoElementCacheItem[]; + _cacheItemsInitialised: boolean; + constructor(cache_size = 3) { this._cacheItems = []; this._cacheItemsInitialised = false; @@ -11,9 +15,9 @@ class VideoElementCache { } } - init() { + init(): void { if (!this._cacheItemsInitialised) { - for (let cacheItem of this._cacheItems) { + for (const cacheItem of this._cacheItems) { try { cacheItem.element.play().then( () => { @@ -26,7 +30,7 @@ class VideoElementCache { if (e.name !== "NotSupportedError") throw e; } ); - } catch (e) { + } catch { //console.log(e.name); } } @@ -40,10 +44,10 @@ class VideoElementCache { * * @param {Object} mediaNode A `MediaNode` instance */ - getElementAndLinkToNode(mediaNode) { - // Try and get an already intialised element. - for (let cacheItem of this._cacheItems) { - // For some reason an uninitialised videoElement has its sr attribute set to the windows href. Hence the below check. + getElementAndLinkToNode(mediaNode: MediaNode): HTMLVideoElement { + // Try and get an already initialised element. + for (const cacheItem of this._cacheItems) { + // For some reason an uninitialised videoElement has its src attribute set to the window's href. Hence the below check. if (!mediaElementHasSource(cacheItem.element)) { // attach node to the element cacheItem.linkNode(mediaNode); @@ -54,7 +58,7 @@ class VideoElementCache { console.debug( "No available video element in the cache, creating a new one. This may break mobile, make your initial cache larger." ); - let cacheItem = new VideoElementCacheItem(mediaNode); + const cacheItem = new VideoElementCacheItem(mediaNode); this._cacheItems.push(cacheItem); this._cacheItemsInitialised = false; return cacheItem.element; @@ -65,8 +69,8 @@ class VideoElementCache { * * @param {VideoElement} element The element to unlink from any media nodes */ - unlinkNodeFromElement(element) { - for (let cacheItem of this._cacheItems) { + unlinkNodeFromElement(element: HTMLVideoElement | HTMLAudioElement): void { + for (const cacheItem of this._cacheItems) { // Unlink the node from the element if (element === cacheItem._element) { cacheItem.unlinkNode(); @@ -74,14 +78,14 @@ class VideoElementCache { } } - get length() { + get length(): number { return this._cacheItems.length; } - get unused() { + get unused(): number { let count = 0; - for (let cacheItem of this._cacheItems) { - // For some reason an uninitialised videoElement has its sr attribute set to the windows href. Hence the below check. + for (const cacheItem of this._cacheItems) { + // For some reason an uninitialised videoElement has its src attribute set to the window's href. Hence the below check. if (!mediaElementHasSource(cacheItem.element)) count += 1; } return count; diff --git a/src/videoelementcacheitem.js b/src/videoelementcacheitem.ts similarity index 64% rename from src/videoelementcacheitem.js rename to src/videoelementcacheitem.ts index 0960e556..cbf6e3b4 100644 --- a/src/videoelementcacheitem.js +++ b/src/videoelementcacheitem.ts @@ -1,4 +1,5 @@ -import { SOURCENODESTATE } from "./SourceNodes/sourcenode"; +import { SOURCENODESTATE } from "./SourceNodes/sourcenode.js"; +import type MediaNode from "./SourceNodes/medianode.js"; /** * A video element item created and managed by the `VideoElementCache`. @@ -9,13 +10,16 @@ import { SOURCENODESTATE } from "./SourceNodes/sourcenode"; * and potentially replaced with another. */ class VideoElementCacheItem { - constructor(node = null) { + _element: HTMLVideoElement; + _node: MediaNode | null; + + constructor(node: MediaNode | null = null) { this._element = this._createElement(); this._node = node; } - _createElement() { - let videoElement = document.createElement("video"); + _createElement(): HTMLVideoElement { + const videoElement = document.createElement("video"); videoElement.setAttribute("crossorigin", "anonymous"); videoElement.setAttribute("webkit-playsinline", ""); videoElement.setAttribute("playsinline", ""); @@ -26,24 +30,24 @@ class VideoElementCacheItem { return videoElement; } - get element() { + get element(): HTMLVideoElement { return this._element; } - set element(element) { + set element(element: HTMLVideoElement) { this._element = element; } - linkNode(node) { + linkNode(node: MediaNode): void { this._node = node; } - unlinkNode() { + unlinkNode(): void { this._node = null; } - isPlaying() { - return this._node && this._node._state === SOURCENODESTATE.playing; + isPlaying(): boolean { + return this._node !== null && this._node._state === SOURCENODESTATE.playing; } } diff --git a/test/__mocks__/glsl.js b/test/__mocks__/glsl.js deleted file mode 100644 index b8319189..00000000 --- a/test/__mocks__/glsl.js +++ /dev/null @@ -1,2 +0,0 @@ -/*eslint-env node */ -module.exports = {}; diff --git a/test/cypress/integration/transitions.spec.js b/test/cypress/integration/transitions.spec.js index e9abbd49..f624cea5 100644 --- a/test/cypress/integration/transitions.spec.js +++ b/test/cypress/integration/transitions.spec.js @@ -12,26 +12,28 @@ beforeEach(() => { * * @param {string} definitionName - the name of the DEFINITION */ -const setupTransitionPipelineForDefinition = definitionName => ({ ctx, VideoContext }) => { - const videoNode1 = ctx.video("../assets/video1.webm"); - const videoNode2 = ctx.video("../assets/video2.webm"); - const crossFade = ctx.transition(VideoContext.DEFINITIONS[definitionName]); +const setupTransitionPipelineForDefinition = + definitionName => + ({ ctx, VideoContext }) => { + const videoNode1 = ctx.video("../assets/video1.webm"); + const videoNode2 = ctx.video("../assets/video2.webm"); + const crossFade = ctx.transition(VideoContext.DEFINITIONS[definitionName]); - // Setup start/stop times for video source nodes - videoNode1.start(0); - videoNode1.stop(4); + // Setup start/stop times for video source nodes + videoNode1.start(0); + videoNode1.stop(4); - videoNode2.start(0); - videoNode2.stop(4); + videoNode2.start(0); + videoNode2.stop(4); - // Configure the crossFade transition node - crossFade.transition(TRANSITION_START, TRANSITION_END, 0.0, 1.0, "mix"); + // Configure the crossFade transition node + crossFade.transition(TRANSITION_START, TRANSITION_END, 0.0, 1.0, "mix"); - // Connect the processing graph together - videoNode1.connect(crossFade); - videoNode2.connect(crossFade); - crossFade.connect(ctx.destination); -}; + // Connect the processing graph together + videoNode1.connect(crossFade); + videoNode2.connect(crossFade); + crossFade.connect(ctx.destination); + }; /** * Definition list to test. diff --git a/test/integration/medianode.test.js b/test/integration/medianode.test.js index 7e745c5a..10fa81d5 100644 --- a/test/integration/medianode.test.js +++ b/test/integration/medianode.test.js @@ -23,7 +23,7 @@ const nodeFactory = ( return _currentTime; }, set currentTime(v) { - return _currentTimeSetter(v); + _currentTimeSetter(v); }, _currentTimeSetter }; @@ -103,6 +103,90 @@ describe("medianode", () => { }); }); + describe("durationchange", () => { + /* + * an element mock which reports itself as ready for playback + * (readyState 4 = HAVE_ENOUGH_DATA) so the node's load polling completes + */ + const readyElementFactory = (duration = 5) => ({ + play: jest.fn(), + pause: jest.fn(), + readyState: 4, + seeking: false, + duration, + currentTime: 0 + }); + + it("should fire durationchange exactly once when the duration is derived from the element", () => { + const element = readyElementFactory(5); + const node = ctx.video(element); + node.start(0); + const durationChangeSpy = jest.fn(); + node.registerCallback("durationchange", durationChangeSpy); + + ctx.update(1 / 60); + ctx.update(1 / 60); + ctx.update(1 / 60); + + expect(durationChangeSpy).toHaveBeenCalledTimes(1); + expect(node.stopTime).toBe(5); + }); + + it("should not fire durationchange every frame for an endless source", () => { + const element = readyElementFactory(Infinity); + const node = ctx.video(element); + node.start(0); + const durationChangeSpy = jest.fn(); + node.registerCallback("durationchange", durationChangeSpy); + + ctx.update(1 / 60); + ctx.update(1 / 60); + ctx.update(1 / 60); + + expect(durationChangeSpy).not.toHaveBeenCalled(); + expect(node.stopTime).toBe(Infinity); + }); + }); + + describe("unload behaviour", () => { + const readyElementFactory = (duration = 30) => ({ + play: jest.fn(), + pause: jest.fn(), + readyState: 4, + seeking: false, + duration, + currentTime: 0 + }); + + it("should clear the element error handler when the node is destroyed", () => { + const { element, node } = nodeFactory(ctx); + ctx.update(1); + expect(typeof element.onerror).toBe("function"); + + node.destroy(); + + expect(element.onerror).toBeFalsy(); + }); + + it("should unload once when a paused node passes its stop time", () => { + const element = readyElementFactory(); + const node = ctx.video(element); + node.start(0); + node.stop(10); + const destroySpy = jest.fn(); + node.registerCallback("destroy", destroySpy); + + ctx.play(); + ctx.update(1); // node is now playing + node._pause(); + node._update(1); // paused: element paused, no longer marked as playing + node._update(11); // past the stop time: node ends and must unload + node._update(12); // ...but only unload once + + expect(destroySpy).toHaveBeenCalledTimes(1); + }); + }); + describe("currentTime on provided element", () => { it("element.currentTime should equal ctx.currentTime be zero after load if no sourceOffset is given", () => { const { element } = nodeFactory(ctx, {}, { sourceOffset: undefined }); diff --git a/test/integration/sourcenode.test.js b/test/integration/sourcenode.test.js index 369b5542..f04b482a 100644 --- a/test/integration/sourcenode.test.js +++ b/test/integration/sourcenode.test.js @@ -3,14 +3,14 @@ import VideoContext from "../../src/videocontext"; let videocontext; require("webgl-mock"); -beforeEach(function() { +beforeEach(function () { const canvas = new HTMLCanvasElement(500, 500); videocontext = new VideoContext(canvas); }); -describe("SourceNode", function() { - describe("#duration", function() { - it("should return the time the node is playing for", function() { +describe("SourceNode", function () { + describe("#duration", function () { + it("should return the time the node is playing for", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -19,7 +19,7 @@ describe("SourceNode", function() { expect(imageNode.duration).toBe(10); }); - it("should return Infinity if no stop time has been specified", function() { + it("should return Infinity if no stop time has been specified", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -27,14 +27,14 @@ describe("SourceNode", function() { expect(imageNode.duration).toBe(Infinity); }); - it("should return undefined if start hasn't been called", function() { + it("should return undefined if start hasn't been called", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); expect(imageNode.duration).toBe(undefined); }); - it("should return undefined if source nodes has had clearTimelineState called on it", function() { + it("should return undefined if source nodes has had clearTimelineState called on it", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -45,15 +45,15 @@ describe("SourceNode", function() { }); }); - describe("#start()", function() { - it("should return true if setting start time was successful", function() { + describe("#start()", function () { + it("should return true if setting start time was successful", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); expect(imageNode.start(10)).toBe(true); }); - it("should return false if start hase already been called without first calling clearTimelineState", function() { + it("should return false if start hase already been called without first calling clearTimelineState", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -61,7 +61,7 @@ describe("SourceNode", function() { expect(imageNode.start(10)).toBe(false); }); - it("should return true if start has already been called followed be calling clearTimelineState", function() { + it("should return true if start has already been called followed be calling clearTimelineState", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -70,7 +70,7 @@ describe("SourceNode", function() { expect(imageNode.start(10)).toBe(true); }); - it("duration should be Infinity if stop hasn't been called", function() { + it("duration should be Infinity if stop hasn't been called", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -78,7 +78,7 @@ describe("SourceNode", function() { expect(imageNode.duration).toBe(Infinity); }); - it("sourceNode state should be set to sequenced", function() { + it("sourceNode state should be set to sequenced", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -87,8 +87,8 @@ describe("SourceNode", function() { }); }); - describe("#stop()", function() { - it("should return true if setting stop time was successful", function() { + describe("#stop()", function () { + it("should return true if setting stop time was successful", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -96,14 +96,14 @@ describe("SourceNode", function() { expect(imageNode.stop(20)).toBe(true); }); - it("should return false if start hasn't been called first", function() { + it("should return false if start hasn't been called first", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); expect(imageNode.stop(10)).toBe(false); }); - it("should return false if time is before startTime ", function() { + it("should return false if time is before startTime ", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -111,7 +111,7 @@ describe("SourceNode", function() { expect(imageNode.stop(2)).toBe(false); }); - it("duration should be less than Infinity", function() { + it("duration should be less than Infinity", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -121,8 +121,8 @@ describe("SourceNode", function() { }); }); - describe("#clearTimelineState()", function() { - it("should set a SourceNodes state to waiting", function() { + describe("#clearTimelineState()", function () { + it("should set a SourceNodes state to waiting", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); @@ -132,7 +132,7 @@ describe("SourceNode", function() { expect(imageNode.state).toBe(0); }); - it("should set a SourceNodes duration to undefined", function() { + it("should set a SourceNodes duration to undefined", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.image(imageElement); diff --git a/test/integration/videocontext.test.js b/test/integration/videocontext.test.js index f08beca2..ffac2ba6 100644 --- a/test/integration/videocontext.test.js +++ b/test/integration/videocontext.test.js @@ -3,14 +3,14 @@ import VideoContext from "../../src/videocontext"; let videocontext; require("webgl-mock"); -beforeEach(function() { +beforeEach(function () { const canvas = new HTMLCanvasElement(500, 500); videocontext = new VideoContext(canvas); }); -describe("VideoContext", function() { - describe("#effect()", function() { - it("should create an EffectNode from the passed definition", function() { +describe("VideoContext", function () { + describe("#effect()", function () { + it("should create an EffectNode from the passed definition", function () { var effectNode = videocontext.effect(VideoContext.DEFINITIONS.MONOCHROME); expect(effectNode.maximumConnections).not.toBe(Infinity); // effect nodes limit connections @@ -18,8 +18,8 @@ describe("VideoContext", function() { }); }); - describe("#transition()", function() { - it("should create a TransitionNode from the passed definition", function() { + describe("#transition()", function () { + it("should create a TransitionNode from the passed definition", function () { var transitionNode = videocontext.transition(VideoContext.DEFINITIONS.CROSSFADE); expect(transitionNode.maximumConnections).not.toEqual(Infinity); // transition nodes limit connections @@ -29,8 +29,8 @@ describe("VideoContext", function() { }); }); - describe("#compositor()", function() { - it("should create a CompositingNode from the passed definition", function() { + describe("#compositor()", function () { + it("should create a CompositingNode from the passed definition", function () { var compositingNode = videocontext.compositor(VideoContext.DEFINITIONS.MONOCHROME); expect(compositingNode.maximumConnections).toEqual(Infinity); @@ -38,8 +38,91 @@ describe("VideoContext", function() { }); }); - describe("#duration", function() { - it("should return the time in seconds between time=0 and the stop time of the last SourceNode", function() { + describe("#playbackRate", function () { + it("should update the playback rate of video and audio nodes alike", function () { + const videoNode = videocontext.video(document.createElement("video")); + const audioNode = videocontext.audio(document.createElement("audio")); + + videocontext.playbackRate = 2; + + expect(videoNode._globalPlaybackRate).toBe(2); + expect(audioNode._globalPlaybackRate).toBe(2); + }); + }); + + describe("#volume", function () { + it("should apply the volume to custom MediaNode subclasses", function () { + class CustomMediaNode extends VideoContext.NODES.MediaNode {} + const node = videocontext.customSourceNode( + CustomMediaNode, + document.createElement("video") + ); + + videocontext.volume = 0.25; + + expect(node._attributes.volume).toBe(0.25); + }); + }); + + describe("#audio()", function () { + it("should give audio nodes access to the media element cache", function () { + const audioNode = videocontext.audio("test.mp3"); + + expect(audioNode._mediaElementCache).toBe(videocontext._videoElementCache); + }); + }); + + describe("#endOnLastSourceEnd", function () { + it("should expose the endOnLastSourceEnd option as a readable property", function () { + expect(videocontext.endOnLastSourceEnd).toBe(true); + + const canvas = new HTMLCanvasElement(500, 500); + const otherContext = new VideoContext(canvas, undefined, { + endOnLastSourceEnd: false + }); + expect(otherContext.endOnLastSourceEnd).toBe(false); + }); + }); + + describe("#destroy()", function () { + it("should unregister the context from the update manager and the debug references", function () { + expect(VideoContext.updateablesManager._updateables).toContain(videocontext); + const id = videocontext.id; + + videocontext.destroy(); + + expect(VideoContext.updateablesManager._updateables).not.toContain(videocontext); + expect(window.__VIDEOCONTEXT_REFS__[id]).toBeUndefined(); + }); + }); + + describe("#reset()", function () { + it("should clear registered event callbacks", function () { + const updateSpy = jest.fn(); + videocontext.registerCallback(VideoContext.EVENTS.UPDATE, updateSpy); + + videocontext.reset(); + videocontext.update(1 / 60); + + expect(updateSpy).not.toHaveBeenCalled(); + }); + }); + + describe("#snapshot()", function () { + it("should record the actual input port index for named connections", function () { + const transitionNode = videocontext.transition(VideoContext.DEFINITIONS.CROSSFADE); + const videoNode = videocontext.video(document.createElement("video")); + videoNode.connect(transitionNode, "u_image_b"); + transitionNode.connect(videocontext.destination); + + const snap = videocontext.snapshot(); + + expect(snap.nodes.processor0.inputs).toEqual([{ id: "source0", index: 1 }]); + }); + }); + + describe("#duration", function () { + it("should return the time in seconds between time=0 and the stop time of the last SourceNode", function () { var videoElement = document.createElement("video"); var videoNode1 = videocontext.video(videoElement); var videoNode2 = videocontext.video(videoElement); @@ -51,7 +134,7 @@ describe("VideoContext", function() { expect(videocontext.duration).toEqual(20.245); }); - it("should return Infinity if no stop time has been specified on one of the Nodes", function() { + it("should return Infinity if no stop time has been specified on one of the Nodes", function () { var imageElement = document.createElement("img"); var imageNode = videocontext.createImageSourceNode(imageElement); @@ -59,7 +142,7 @@ describe("VideoContext", function() { expect(videocontext.duration).toBe(Infinity); }); - it("should return 0 if all source nodes have had clearTimelineState called on them", function() { + it("should return 0 if all source nodes have had clearTimelineState called on them", function () { var videoElement = document.createElement("video"); var videoNode = videocontext.video(videoElement); diff --git a/test/unit/exceptions.spec.js b/test/unit/exceptions.spec.js new file mode 100644 index 00000000..f9d9f47d --- /dev/null +++ b/test/unit/exceptions.spec.js @@ -0,0 +1,23 @@ +import { ConnectException, RenderException } from "../../src/exceptions.js"; + +describe("Exceptions", () => { + test("ConnectException should be an Error with a message, name and stack", () => { + const exception = new ConnectException("can't connect"); + + expect(exception).toBeInstanceOf(Error); + expect(exception).toBeInstanceOf(ConnectException); + expect(exception.message).toBe("can't connect"); + expect(exception.name).toBe("ConnectionException"); + expect(typeof exception.stack).toBe("string"); + }); + + test("RenderException should be an Error with a message, name and stack", () => { + const exception = new RenderException("can't render"); + + expect(exception).toBeInstanceOf(Error); + expect(exception).toBeInstanceOf(RenderException); + expect(exception.message).toBe("can't render"); + expect(exception.name).toBe("RenderException"); + expect(typeof exception.stack).toBe("string"); + }); +}); diff --git a/test/unit/graphnode.spec.js b/test/unit/graphnode.spec.js index ee135deb..fef7f250 100644 --- a/test/unit/graphnode.spec.js +++ b/test/unit/graphnode.spec.js @@ -91,12 +91,7 @@ describe("GraphNode", () => { }); test("should allow connecting via a specified input port name", () => { - expect( - node_a.connect( - node_b, - "input_b" - ) - ).toBe(true); + expect(node_a.connect(node_b, "input_b")).toBe(true); const expected_result = [ { @@ -111,10 +106,7 @@ describe("GraphNode", () => { }); test("should throw ConnectException if target input is taken", () => { - node_c.connect( - node_b, - "input_a" - ); + node_c.connect(node_b, "input_a"); expect(node_a.connect.bind(node_a, node_b, "input_a")).toThrow(ConnectException); }); diff --git a/test/unit/imagenode.spec.js b/test/unit/imagenode.spec.js new file mode 100644 index 00000000..39ca3df4 --- /dev/null +++ b/test/unit/imagenode.spec.js @@ -0,0 +1,86 @@ +import * as utils from "../../src/utils"; +import ImageNode, { IMAGETYPE } from "../../src/SourceNodes/imagenode"; +import { CANVASTYPE } from "../../src/SourceNodes/canvasnode"; +import RenderGraph from "../../src/rendergraph"; +import sinon from "sinon"; +import "webgl-mock"; + +let mockGLContext, renderGraph; + +const PLAYING_STATE = 2; + +beforeEach(() => { + const canvas = new HTMLCanvasElement(500, 500); + mockGLContext = canvas.getContext("webgl"); + renderGraph = new RenderGraph(); +}); + +afterEach(() => { + sinon.restore(); +}); + +describe("IMAGETYPE", () => { + test(`should be "ImageNode" and distinct from CANVASTYPE`, () => { + const node = new ImageNode({ complete: true }, mockGLContext, renderGraph, 0); + + expect(IMAGETYPE).toBe("ImageNode"); + expect(IMAGETYPE).not.toBe(CANVASTYPE); + expect(node.displayName).toBe("ImageNode"); + }); +}); + +describe("_load", () => { + test("should not throw for a node created from a user-supplied element", () => { + const element = { complete: true }; + const node = new ImageNode(element, mockGLContext, renderGraph, 0); + + expect(() => node._load()).not.toThrow(); + }); + + test("should mark a node created from a complete user-supplied element as ready", () => { + const element = { complete: true }; + const node = new ImageNode(element, mockGLContext, renderGraph, 0); + + node._load(); + + expect(node._isReady()).toBe(true); + }); +}); + +describe("_update", () => { + test("uploads a static image texture once, not on every frame", () => { + const updateTextureSpy = sinon.spy(utils, "updateTexture"); + const element = { complete: true }; + const node = new ImageNode(element, mockGLContext, renderGraph, 0); + + node.startAt(0); + node._ready = true; + + node._update(0.1); + expect(node.state).toBe(PLAYING_STATE); + node._update(0.2); + node._update(0.3); + + expect(updateTextureSpy.callCount).toBe(1); + }); + + test("re-uploads the texture after a seek cleared it", () => { + const updateTextureSpy = sinon.spy(utils, "updateTexture"); + const element = { complete: true }; + const node = new ImageNode(element, mockGLContext, renderGraph, 1); + + node.startAt(1); + node._ready = true; + + node._update(1.5); + expect(updateTextureSpy.callCount).toBe(1); + + // seeking before the start time clears the texture + node._seek(0); + // seeking back into the playback range must re-upload it + node._seek(1.5); + node._update(1.6); + + expect(updateTextureSpy.callCount).toBe(2); + }); +}); diff --git a/test/unit/processingnode.spec.js b/test/unit/processingnode.spec.js new file mode 100644 index 00000000..98831717 --- /dev/null +++ b/test/unit/processingnode.spec.js @@ -0,0 +1,77 @@ +// utils must be imported before ProcessingNode to avoid the +// processingnode -> utils -> destinationnode -> processingnode require cycle +import "../../src/utils"; +import ProcessingNode from "../../src/ProcessingNodes/processingnode"; +import RenderGraph from "../../src/rendergraph"; +import sinon from "sinon"; +import "webgl-mock"; + +const vertexShader = + "attribute vec2 a_position; attribute vec2 a_texCoord; varying vec2 v_texCoord;" + + "void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; }"; +const fragmentShader = + "precision mediump float; uniform sampler2D u_image; uniform sampler2D u_over; varying vec2 v_texCoord;" + + "void main(){ gl_FragColor = texture2D(u_image, v_texCoord); }"; + +let gl, renderGraph; + +const imagePropertyDefinition = () => ({ + vertexShader, + fragmentShader, + properties: { + u_over: { type: "uniform", value: new Image() } + }, + inputs: ["u_image"] +}); + +beforeEach(() => { + const canvas = new HTMLCanvasElement(500, 500); + gl = canvas.getContext("webgl"); + renderGraph = new RenderGraph(); +}); + +afterEach(() => { + sinon.restore(); +}); + +describe("_render", () => { + test("binds an Image-valued property's sampler to its 0-based texture unit index, not the TEXTURE0 enum", () => { + const definition = imagePropertyDefinition(); + const node = new ProcessingNode(gl, renderGraph, definition, definition.inputs, true); + const uniform1iSpy = sinon.spy(gl, "uniform1i"); + + node._render(); + + const imageProperty = node._properties["u_over"]; + const sentValues = uniform1iSpy.args.map(args => args[1]); + + expect(sentValues).toContain(imageProperty.textureUnitIndex); + expect(sentValues).not.toContain(gl.TEXTURE0); + }); +}); + +describe("destroy", () => { + test("deletes both the property texture and the node's main output texture", () => { + const definition = imagePropertyDefinition(); + const node = new ProcessingNode(gl, renderGraph, definition, definition.inputs, true); + const mainTexture = node._texture; + const propertyTexture = node._properties["u_over"].texture; + const deleteTextureSpy = sinon.spy(gl, "deleteTexture"); + + node.destroy(); + + const deleted = deleteTextureSpy.args.map(args => args[0]); + expect(deleted).toContain(propertyTexture); + expect(deleted).toContain(mainTexture); + }); + + test("deletes the vertex buffer created in the constructor", () => { + const definition = imagePropertyDefinition(); + const node = new ProcessingNode(gl, renderGraph, definition, definition.inputs, true); + const deleteBufferSpy = sinon.spy(gl, "deleteBuffer"); + + node.destroy(); + + expect(deleteBufferSpy.callCount).toBe(1); + }); +}); diff --git a/test/unit/rendergraph.spec.js b/test/unit/rendergraph.spec.js index dd76d8f0..00ea18d4 100644 --- a/test/unit/rendergraph.spec.js +++ b/test/unit/rendergraph.spec.js @@ -53,6 +53,26 @@ describe("Rendergraph", () => { rendergraph.registerConnection.bind(rendergraph, node_a, node_b, "input_a") ).toThrow(ConnectException); }); + + test("should throw a ConnectionException for an unknown named input on an unlimited-connection node", () => { + const unlimitedNode = new GraphNode(undefined, rendergraph, ["input_a"], false); + + expect( + rendergraph.registerConnection.bind( + rendergraph, + node_a, + unlimitedNode, + "non-existant input" + ) + ).toThrow(ConnectException); + }); + + test("should accept a valid named input on an unlimited-connection node", () => { + const unlimitedNode = new GraphNode(undefined, rendergraph, ["input_a"], false); + + expect(rendergraph.registerConnection(node_a, unlimitedNode, "input_a")).toBe(true); + expect(unlimitedNode.inputs[0]).toBe(node_a); + }); }); describe("#unregisterConnection()", () => { @@ -125,6 +145,31 @@ describe("Rendergraph", () => { rendergraph.registerConnection(node_c, node_a); expect(rendergraph.getInputsForNode(node_a)).toEqual([node_b, node_c]); }); + + test("should place an index-connected input on the port matching its index", () => { + rendergraph.registerConnection(node_b, node_a, 1); + + const inputs = rendergraph.getInputsForNode(node_a); + expect(inputs[0]).toBeUndefined(); + expect(inputs[1]).toBe(node_b); + }); + + test("should keep index-connected inputs on their ports alongside named connections", () => { + rendergraph.registerConnection(node_b, node_a, "input_a"); + rendergraph.registerConnection(node_c, node_a, 1); + + const inputs = rendergraph.getInputsForNode(node_a); + expect(inputs[0]).toBe(node_b); + expect(inputs[1]).toBe(node_c); + }); + + test("should fall back to the first free port for an out-of-range index", () => { + rendergraph.registerConnection(node_b, node_a, 5); + + const inputs = rendergraph.getInputsForNode(node_a); + expect(inputs[0]).toBe(node_b); + expect(inputs[1]).toBeUndefined(); + }); }); describe("#getZIndexInputsForNode()", () => { diff --git a/test/unit/sourcenode.spec.js b/test/unit/sourcenode.spec.js index 44b6ae10..c12938bd 100644 --- a/test/unit/sourcenode.spec.js +++ b/test/unit/sourcenode.spec.js @@ -1,5 +1,6 @@ import * as utils from "../../src/utils"; import SourceNode from "../../src/SourceNodes/sourcenode"; +import RenderGraph from "../../src/rendergraph"; import sinon from "sinon"; import "webgl-mock"; @@ -41,3 +42,30 @@ describe("_update", () => { expect(updateTextureSpy.calledOnce).toBeTruthy(); }); }); + +describe("_seek", () => { + test("updates the node's clock even in the waiting state so start() offsets are computed from the seeked time", () => { + const node = new SourceNode(ELEMENT, mockGLContext, mockRenderGraph, 0); + + // seek while the node is still waiting (start() not yet called) + node._seek(10); + + // start 5 seconds after the current (seeked) time + node.start(5); + + expect(node.startTime).toBe(15); + }); +}); + +describe("destroy", () => { + test("a destroyed node refuses to be re-sequenced by start()/startAt()", () => { + const renderGraph = new RenderGraph(); + const node = new SourceNode(ELEMENT, mockGLContext, renderGraph, 0); + + node.destroy(); + + expect(node.start(0)).toBe(false); + expect(node.startAt(0)).toBe(false); + expect(node.state).toBe(0); // still waiting, not sequenced + }); +}); diff --git a/test/unit/utils.spec.js b/test/unit/utils.spec.js index 433f3cd2..67d72533 100644 --- a/test/unit/utils.spec.js +++ b/test/unit/utils.spec.js @@ -1,6 +1,87 @@ import * as Utils from "../../src/utils.js"; +import { RenderException } from "../../src/exceptions.js"; describe(`Utils`, () => { + describe(`compileShader()`, () => { + it(`Should throw a RenderException when compilation fails`, () => { + const failingGl = { + createShader: () => ({}), + shaderSource: () => {}, + compileShader: () => {}, + getShaderParameter: () => false, + getShaderInfoLog: () => "shader compile log" + }; + + expect(() => Utils.compileShader(failingGl, "void main(){}", 1)).toThrow( + RenderException + ); + }); + }); + + describe(`createShaderProgram()`, () => { + it(`Should throw a RenderException when linking fails`, () => { + const failingGl = { + createProgram: () => ({}), + attachShader: () => {}, + linkProgram: () => {}, + getProgramParameter: () => false, + getProgramInfoLog: () => "program link log" + }; + + expect(() => Utils.createShaderProgram(failingGl, {}, {})).toThrow(RenderException); + }); + }); + describe(`UpdateablesManager`, () => { + it(`Should start the rAF update loop even when Web Workers are unavailable`, () => { + const originalWorker = window.Worker; + const originalRAF = window.requestAnimationFrame; + window.Worker = undefined; + const rafSpy = jest.fn(); + window.requestAnimationFrame = rafSpy; + + const manager = new Utils.UpdateablesManager(); + manager.register({ _update: () => {} }); + + expect(rafSpy).toHaveBeenCalled(); + + window.Worker = originalWorker; + window.requestAnimationFrame = originalRAF; + }); + + it(`Should allow an updateable to be unregistered`, () => { + const manager = new Utils.UpdateablesManager(); + const updateable = { _update: jest.fn() }; + manager._updateables.push(updateable); + + expect(manager.unregister(updateable)).toBe(true); + manager._update(1); + + expect(updateable._update).not.toHaveBeenCalled(); + expect(manager.unregister(updateable)).toBe(false); + }); + }); + + describe(`createControlFormForNode()`, () => { + it(`Should set the initial value of a numeric input from the property value`, () => { + const node = { _properties: { mix: { type: "uniform", value: 0.4 } } }; + + const form = Utils.createControlFormForNode(node); + + const number = form.querySelector("input[type='number']"); + expect(number.getAttribute("value")).toBe("0.4"); + }); + + it(`Should set per-element initial values for array properties`, () => { + const node = { _properties: { inputMix: { type: "uniform", value: [0.1, 0.2, 0.3] } } }; + + const form = Utils.createControlFormForNode(node); + + const numbers = form.querySelectorAll("input[type='number']"); + expect(numbers.length).toBe(3); + expect(numbers[1].getAttribute("value")).toBe("0.2"); + }); + }); + describe(`mediaElementHasSource()`, () => { it(`Should return true if the element has a src`, () => { const mockMediaElement = { src: "http://bbc.co.uk" }; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..09ab4763 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "declarationDir": "dist/types" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..a756c7cb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es2019", + "lib": ["dom", "es2019"], + "module": "esnext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": false + }, + "include": ["src/**/*.ts"] +} diff --git a/webpack.commonjs2.config.js b/webpack.commonjs2.config.js index b0357df5..eaaf0807 100644 --- a/webpack.commonjs2.config.js +++ b/webpack.commonjs2.config.js @@ -4,25 +4,29 @@ const env = process.env.NODE_ENV; module.exports = { mode: env || "development", - entry: __dirname + "/src/videocontext.js", + entry: __dirname + "/src/videocontext.ts", devtool: "source-map", stats: { warnings: false }, output: { path: __dirname + "/dist", filename: "videocontext.commonjs2.js", - libraryTarget: "commonjs2", - library: "VideoContext" + library: { + type: "commonjs2", + export: "default" + } + }, + resolve: { + extensions: [".ts", ".js"], + extensionAlias: { + ".js": [".ts", ".js"] + } }, module: { rules: [ - { test: /\.css$/, use: "style!css" }, { - test: /\.js$/, + test: /\.(js|ts)$/, exclude: /node_modules/, - use: [ - { loader: "babel-loader" }, - { loader: "eslint-loader" } - ] + use: [{ loader: "babel-loader" }] } ] } diff --git a/webpack.config.js b/webpack.config.js index 3b8a9c5c..0653f1d7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,26 +4,31 @@ const env = process.env.TEST_SUITE; module.exports = { mode: env === "build" ? "production" : "development", - entry: __dirname + "/src/videocontext.js", + entry: __dirname + "/src/videocontext.ts", devtool: "source-map", stats: { warnings: false }, output: { path: __dirname + "/dist", filename: "videocontext.js", - libraryTarget: "umd", - library: "VideoContext" + library: { + name: "VideoContext", + type: "umd", + export: "default" + }, + globalObject: "this" + }, + resolve: { + extensions: [".ts", ".js"], + extensionAlias: { + ".js": [".ts", ".js"] + } }, module: { rules: [ - { test: /\.css$/, use: "style!css" }, - { test: /\.(frag|vert)$/, use: "raw-loader" }, { - test: /\.js$/, + test: /\.(js|ts)$/, exclude: /node_modules/, - use: [ - { loader: "babel-loader" }, - { loader: "eslint-loader" } - ] + use: [{ loader: "babel-loader" }] } ] } diff --git a/yarn.lock b/yarn.lock index 8b8620d5..afa1f7c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,22 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@babel/cli@^7.24.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.29.7.tgz#ae6bd1b11ede44b46ea5624892f62724c4a20ccb" + integrity sha512-/75HwRbAYPqXv/Ax1h7Fg3IZfXgdU98jnA8H93/m/QBaPV3Hp5ICoLqzGYye1yHBCgpmXvtqgSUN8oOKX5tojQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.28" + commander "^6.2.0" + convert-source-map "^2.0.0" + fs-readdir-recursive "^1.1.0" + glob "^7.2.0" + make-dir "^2.1.0" + slash "^2.0.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.6.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -17,18 +33,25 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.0.0-beta.35": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" "@babel/compat-data@^7.20.0": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + "@babel/core@^7.11.6", "@babel/core@^7.12.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" @@ -50,6 +73,27 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@^7.23.9", "@babel/core@^7.24.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + 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" + "@babel/generator@^7.20.1", "@babel/generator@^7.20.2", "@babel/generator@^7.7.2": version "7.20.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" @@ -59,6 +103,24 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== + 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" + +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== + dependencies: + "@babel/types" "^7.29.7" + "@babel/helper-compilation-targets@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" @@ -69,6 +131,50 @@ browserslist "^4.21.3" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + 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" + +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + 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" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + 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.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" @@ -82,6 +188,11 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -89,6 +200,14 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" @@ -96,6 +215,14 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@babel/helper-module-transforms@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" @@ -110,11 +237,50 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.2" +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== + dependencies: + "@babel/types" "^7.29.7" + "@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.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" @@ -122,6 +288,14 @@ dependencies: "@babel/types" "^7.20.2" +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" @@ -134,16 +308,40 @@ 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-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + "@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/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== + dependencies: + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@babel/helpers@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" @@ -153,7 +351,15 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@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== @@ -167,10 +373,64 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== -"@babel/parser@^7.9.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" - integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== +"@babel/parser@^7.23.9", "@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== + dependencies: + "@babel/types" "^7.29.8" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + 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.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz#759a857c46c4d2a6199685cf71070d81ae5f743a" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== + 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" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@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" @@ -193,6 +453,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@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" @@ -207,6 +481,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" @@ -263,6 +544,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-typescript@^7.7.2": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" @@ -270,6 +558,519 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@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.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + +"@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== + 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" + +"@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" + +"@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz#65c8b9f76ec915b02a0e1df703125a0fca58abaa" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + +"@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== + dependencies: + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz#e60a6a42ac63a3095f9cc7264f698a100c8fe05d" + integrity sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA== + 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" + +"@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== + 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" + +"@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + +"@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== + 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/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz#3a4a4dd7214af9d524f0503bb97c99af5f4abf26" + integrity sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-spread@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz#c894cff38556a5dafeb412e13fc012b6df4b95a2" + integrity sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== + 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" + +"@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/preset-env@^7.24.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.7.tgz#5e2ab5e764b493fdefc99c43aeaa70a9533a37fd" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== + 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" + +"@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/preset-typescript@^7.24.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== + 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" + "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -279,7 +1080,16 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== @@ -295,6 +1105,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.29.7", "@babel/traverse@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + 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" + "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" @@ -304,6 +1127,14 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.29.7", "@babel/types@^7.29.8", "@babel/types@^7.4.4": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@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" @@ -358,6 +1189,47 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" + integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + 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" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@gerrit0/mini-shiki@^1.24.0": + version "1.27.2" + resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" + integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== + dependencies: + "@shikijs/engine-oniguruma" "^1.27.2" + "@shikijs/types" "^1.27.2" + "@shikijs/vscode-textmate" "^10.0.1" + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -370,6 +1242,25 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + "@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" @@ -386,110 +1277,115 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@istanbuljs/schema@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3" + integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== + +"@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.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== +"@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.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@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.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + 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.3.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@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.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.7.0" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@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.2.0" + jest-get-type "^29.6.3" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@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.3.1" - jest-snapshot "^29.3.1" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@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.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@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.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@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.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@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" @@ -497,81 +1393,81 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.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.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + 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.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@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.24.1" + "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== +"@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.15" + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@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.3.1" - "@jest/types" "^29.3.1" + "@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.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@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.3.1" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@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.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@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.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" + 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.1" + write-file-atomic "^4.0.2" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@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.0.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -595,11 +1491,32 @@ "@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.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.0", "@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" @@ -618,7 +1535,12 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": +"@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.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -626,6 +1548,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@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" + "@koa/cors@^2.2.1": version "2.2.3" resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.3.tgz#c32a9907acbee1e72fedfb0b9ac840d2e6f9be57" @@ -633,6 +1563,32 @@ dependencies: vary "^1.1.2" +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +"@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": + 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.8": + 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" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -640,6 +1596,27 @@ dependencies: any-observable "^0.3.0" +"@shikijs/engine-oniguruma@^1.27.2": + version "1.29.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz#d879717ced61d44e78feab16f701f6edd75434f1" + integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== + dependencies: + "@shikijs/types" "1.29.2" + "@shikijs/vscode-textmate" "^10.0.1" + +"@shikijs/types@1.29.2", "@shikijs/types@^1.27.2": + version "1.29.2" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.2.tgz#a93fdb410d1af8360c67bf5fc1d1a68d58e21c4f" + integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== + dependencies: + "@shikijs/vscode-textmate" "^10.0.1" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.1": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -657,10 +1634,10 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.27.8": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f" + integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g== "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": version "1.7.2" @@ -669,12 +1646,19 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@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: - "@sinonjs/commons" "^1.7.0" + 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" "@sinonjs/formatio@^3.2.1": version "3.2.2" @@ -698,6 +1682,11 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@tootallnate/once@2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz#35adc6222e3662fa2222ce123b961476a746b9ea" + integrity sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ== + "@types/babel__core@^7.1.14": version "7.1.20" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" @@ -764,6 +1753,13 @@ dependencies: "@types/node" "*" +"@types/hast@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.5.tgz#48020de4c0e63492f4ca9db42068c108f68b7f8f" + integrity sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g== + dependencies: + "@types/unist" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -783,39 +1779,30 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== - -"@types/markdown-it@^12.2.3": - version "12.2.3" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" - integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== - dependencies: - "@types/linkify-it" "*" - "@types/mdurl" "*" - -"@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== +"@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/node@*": version "18.11.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - "@types/sinonjs__fake-timers@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" @@ -831,6 +1818,16 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/unist@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -843,6 +1840,107 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^8.0.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz#52f9f0e47d5a7571c4336e69bfeea581509ef2cf" + integrity sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/type-utils" "8.67.0" + "@typescript-eslint/utils" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + +"@typescript-eslint/parser@^8.0.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.67.0.tgz#0158022ec9927e0afcd58a8cc2ad57e01d892f5c" + integrity sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w== + dependencies: + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.67.0.tgz#1552db007ca9206a1c6c7acf49e210bd17a8c56f" + integrity sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.67.0" + "@typescript-eslint/types" "^8.67.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz#4d4c2da09560d10dd7d947cba2d29d14d25af16d" + integrity sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg== + dependencies: + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" + +"@typescript-eslint/tsconfig-utils@8.67.0", "@typescript-eslint/tsconfig-utils@^8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz#f45a3eba6b9132fb47141ec03ce2f275f1ea991d" + integrity sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg== + +"@typescript-eslint/type-utils@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz#96bed105275559df3bcf0449b73a6414d35c59ce" + integrity sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q== + dependencies: + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + "@typescript-eslint/utils" "8.67.0" + debug "^4.4.3" + ts-api-utils "^2.5.0" + +"@typescript-eslint/types@8.67.0", "@typescript-eslint/types@^8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.67.0.tgz#4a8d00cc1faba5c14feabc60f85b7a32652f34b6" + integrity sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww== + +"@typescript-eslint/typescript-estree@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz#116c3a47c06119c5a050e8851861d6497dd64bc2" + integrity sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw== + dependencies: + "@typescript-eslint/project-service" "8.67.0" + "@typescript-eslint/tsconfig-utils" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + +"@typescript-eslint/utils@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.67.0.tgz#3e478a3d69d330a1fc50c12746cc2ee0732ccfcd" + integrity sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + +"@typescript-eslint/visitor-keys@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz#601d40af9acf82a28da2286f3edafc69bba9017f" + integrity sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA== + dependencies: + "@typescript-eslint/types" "8.67.0" + eslint-visitor-keys "^5.0.0" + +"@ungap/structured-clone@^1.2.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.3.tgz#094041e1a4cb1987f038335421281ac8be390bcc" + integrity sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg== + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -997,7 +2095,7 @@ JSONStream@^1.3.1: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.0: +abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -1010,70 +2108,66 @@ accepts@^1.3.5, accepts@~1.3.4: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" + acorn "^8.1.0" + acorn-walk "^8.0.2" acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ== - dependencies: - acorn "^3.0.4" - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^5.5.0, acorn@^5.5.3: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== +acorn-walk@^8.0.2: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" -acorn@^6.0.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.8.1, acorn@^8.9.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== acorn@^8.5.0, acorn@^8.7.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== -ajv-keywords@^2.1.0: +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha512-ZFztHzVRdGLAzJmpUT9LNFLe1YiVOEylcaNpEutM26PVTCtOD919IMfD01CgbRouB42Dd9atjx1HseC15DgOZA== + 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@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw== +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: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + fast-deep-equal "^3.1.3" ajv@^6.12.3, ajv@^6.12.5: version "6.12.6" @@ -1085,6 +2179,26 @@ ajv@^6.12.3, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + 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" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-escape-sequences@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz#1c18394b6af9b76ff9a63509fa497669fd2ce53e" @@ -1138,7 +2252,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +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== @@ -1167,22 +2281,6 @@ any-promise@^1.0.0, any-promise@^1.1.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1191,19 +2289,20 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -app-path@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/app-path/-/app-path-3.2.0.tgz#06d426e0c988885264e0aa0a766dfa2723491633" - integrity sha512-PQPaKXi64FZuofJkrtaO3I5RZESm9Yjv7tkeJaDz4EZMeBBfGtr5MyQ3m5AC7F0HVrISBLatPxAAAgvbe418fQ== +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: - execa "^1.0.0" + normalize-path "^3.0.0" + picomatch "^2.0.4" -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - integrity sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw== +app-path@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/app-path/-/app-path-3.2.0.tgz#06d426e0c988885264e0aa0a766dfa2723491633" + integrity sha512-PQPaKXi64FZuofJkrtaO3I5RZESm9Yjv7tkeJaDz4EZMeBBfGtr5MyQ3m5AC7F0HVrISBLatPxAAAgvbe418fQ== dependencies: - default-require-extensions "^1.0.0" + execa "^1.0.0" arch@^2.1.2: version "2.1.2" @@ -1222,28 +2321,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-back@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" @@ -1263,42 +2340,11 @@ array-back@^3.0.1: resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== - array-from@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -1311,33 +2357,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.1.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -1348,11 +2372,6 @@ asynckit@^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== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1370,247 +2389,26 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q== - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== +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: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-jest@^23.2.0, babel-jest@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" - integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== - dependencies: - babel-plugin-istanbul "^4.1.6" - babel-preset-jest "^23.2.0" - -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== - dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^7.1.4: - version "7.1.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" - integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw== - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-add-module-exports@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz#6caa4ddbe1f578c6a5264d4d3e6c8a2720a7ca2b" - integrity sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg== - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== +babel-loader@^9.1.3: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" @@ -1623,272 +2421,39 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" - integrity sha512-N0MlMjZtahXK0yb0K3V9hWPrq5e7tThbghvDr0k3X75UuOOqwsWW6mk8XHD2QvEC0Ca9dLIfTgNU36TeJD6Hnw== - -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +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-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== - -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w== - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" +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-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.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-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ== +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-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" + "@babel/helper-define-polyfill-provider" "^0.6.8" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -1908,142 +2473,33 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" - integrity sha512-AdfWwc0PYvDtwr009yyVNh72Ev68os7SsPmOFVX7zSA+STXuk5CV2iMVazZU01bEoHCSwTkgv4E4HOOcODPkPg== - dependencies: - babel-plugin-jest-hoist "^23.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== - dependencies: - babel-plugin-jest-hoist "^29.2.0" - babel-preset-current-node-syntax "^1.0.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== +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-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + 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== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" +baseline-browser-mapping@^2.11.12: + version "2.11.14" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz#d51bb92285608b0e6356841a2eea76842a771d52" + integrity sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww== basic-auth@^1.1.0: version "1.1.0" @@ -2069,22 +2525,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -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== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -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" +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== bluebird@3.7.2, bluebird@^3.0.6, bluebird@^3.7.2: version "3.7.2" @@ -2099,30 +2543,19 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== +brace-expansion@^2.0.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.4.tgz#589dab11c0018d0366be64cd8bf12c8dbecc8326" + integrity sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg== dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" + balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" + balanced-match "^4.0.2" braces@^3.0.2: version "3.0.2" @@ -2131,25 +2564,12 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +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: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + fill-range "^7.1.1" browserslist@^4.14.5, browserslist@^4.21.3: version "4.21.4" @@ -2161,6 +2581,17 @@ browserslist@^4.14.5, browserslist@^4.21.3: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.24.0, browserslist@^4.28.7: + version "4.28.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.8.tgz#a3c79ceb70028527e5da7dafc887f3200b5168c0" + integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA== + 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" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2203,21 +2634,6 @@ bytes@^2.3.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" integrity sha512-hkQtlCqf2f67v+GDlR9DImH1Bu/DxA/yNR7EmnbxCgxYgm4u7rLTJw8LYJdttHOl+H+++Fv0SQF7PgXAtqkfVg== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cache-content-type@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" @@ -2231,41 +2647,19 @@ cachedir@^2.3.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== -call-bind@^1.0.0, call-bind@^1.0.2: +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/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g== + 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: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A== - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + es-errors "^1.3.0" + function-bind "^1.1.2" 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@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -2276,35 +2670,21 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30000844: - version "1.0.30001046" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001046.tgz#7a06d3e8fd8aa7f4d21c9a2e313f35f2d06b013e" - integrity sha512-CsGjBRYWG6FvgbyGy+hBbaezpwiqIOLkxQPY4A4Ea49g1eNsnQuESB+n4QM0BKii1j80MyJ26Ir5ywTQkbRE4g== - caniuse-lite@^1.0.30001400: version "1.0.30001431" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha512-IS4lTgp57lUcpXzyCaiUQcRZBxZAkzl+jNXrMUXZjdnr2yujpKUMG9OYeYL29i6fL66ihypvVJ/MeX0B+9pWOg== - dependencies: - rsvp "^3.3.3" +caniuse-lite@^1.0.30001809: + version "1.0.30001809" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz#e6cf71f14ddfe008f114dd2a846923be3c03a07b" + integrity sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" - integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== - dependencies: - lodash "^4.17.15" - chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2316,7 +2696,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.1, 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== @@ -2338,31 +2718,25 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== - check-more-types@2.24.0, check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg== - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" +chokidar@^3.6.0: + 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 "^1.0.0" + fsevents "~2.3.2" chrome-trace-event@^1.0.2: version "1.0.2" @@ -2371,11 +2745,6 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -2386,26 +2755,11 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.1.tgz#7594f1c95cb7fdfddee7af95a13af7dbc67afdcf" integrity sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w== -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - cli-commands@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/cli-commands/-/cli-commands-0.4.0.tgz#75b79bba16733267b71c60def2dd76f3a07cda8a" @@ -2446,20 +2800,6 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2503,14 +2843,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2545,7 +2877,7 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2579,7 +2911,7 @@ command-line-usage@^5.0.5: table-layout "^0.4.3" typical "^2.6.1" -commander@^2.11.0, commander@^2.20.0, commander@^2.9.0: +commander@^2.20.0, commander@^2.9.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== @@ -2589,6 +2921,11 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + commander@^9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" @@ -2599,21 +2936,16 @@ common-log-format@~0.1.3: resolved "https://registry.yarnpkg.com/common-log-format/-/common-log-format-0.1.4.tgz#39ba6ccb5c46c2f89aa92f232866d18f18075ba9" integrity sha512-BXcgq+wzr2htmBmnT7cL7YHzPAWketWbr4kozjoM9kWe4sk3+zMgjcH0HO+EddjDlEw2LZysqLpVRwbF318tDw== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== -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.1: - 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== - compressible@^2.0.0: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -2626,7 +2958,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.6.0, concat-stream@^1.6.2: +concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -2663,18 +2995,11 @@ content-type@^1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.6.0, 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@^1.5.0, convert-source-map@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - 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" @@ -2688,34 +3013,35 @@ cookies@~0.8.0: depd "~2.0.0" keygrip "~1.1.0" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - copy-to@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js-compat@^3.48.0: + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.50.0.tgz#d5922c2a692ab1cba6078c920e7c5567421ae08e" + integrity sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q== + dependencies: + browserslist "^4.28.7" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== +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: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + "@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-spawn@^6.0.0: version "6.0.5" @@ -2728,6 +3054,15 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + 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" + cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2737,17 +3072,22 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: - cssom "0.3.x" + cssom "~0.3.6" cypress-image-snapshot@^4.0.1: version "4.0.1" @@ -2811,14 +3151,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" date-fns@^1.27.2: version "1.30.1" @@ -2837,13 +3177,20 @@ debug@*: dependencies: ms "^2.1.1" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.6.3, 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.3.1, debug@^4.3.2, debug@^4.4.3: + 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@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" @@ -2872,20 +3219,15 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== +decimal.js@^10.4.2: + version "10.6.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" + integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== deep-equal@~1.0.1: version "1.0.1" @@ -2897,7 +3239,7 @@ deep-extend@~0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -2907,48 +3249,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - integrity sha512-Dn2eAftOqXhNXs5f/Xjn7QTZ6kDYkx7u0EXQInN1oyYwsZysu11q7oTtaKcbzLxZRJiDHa8VmwpWmb4lY5FqgA== - dependencies: - strip-bom "^2.0.0" - defer-promise@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/defer-promise/-/defer-promise-1.0.2.tgz#b79521c59cadadaed2d305385d30f8b05cbf9196" integrity sha512-5a0iWJvnon50nLLqHPW83pX45BLb4MmlSa1sIg05NBhZoK5EZGz1s8qoZ3888dVGGOT0Ni01NdETuAgdJUZknA== -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2974,46 +3279,43 @@ destroy@^1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== - dependencies: - repeating "^2.0.0" - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg== - 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.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +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@^3.2.0, diff@^3.5.0: +diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" -domexception@^1.0.1: +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: - webidl-conversions "^4.0.2" + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" duplexer@~0.1.1: version "0.1.1" @@ -3033,16 +3335,16 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.3.47: - version "1.3.415" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.415.tgz#e50241c1e2553e46cfe956c9d95f9ab3fc9a9134" - integrity sha512-GbtYqKffx3sU8G0HxwXuJFfs58Q7+iwLa5rBwaULwET6jWW8IAQSrVnu7vEfiUIcMVfbYyFg7cw3zdm+EbBJmw== - electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.402: + version "1.5.406" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.406.tgz#c1d2ddac21d01e92f0ddd2951d37642501d4a7f1" + integrity sha512-hWH5ORBi3d0IipnMh7BN5GDTaAmrSSSWmznwt2zltdiRNEWoEQyTwF0FFSBxzHO7hLSRT6loQu3IQGV0wg/Tvg== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -3058,11 +3360,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -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== - encodeurl@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3083,17 +3380,22 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -error-ex@^1.2.0, error-ex@^1.3.1: +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== @@ -3105,60 +3407,48 @@ error-inject@^1.0.0: resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" integrity sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg== -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +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@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + 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: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +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, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3174,28 +3464,26 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.9.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +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== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -eslint-loader@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337" - integrity sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg== - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" +eslint-config-prettier@^9.1.0: + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz#90deb4fa0259592df774b600dbd1d2249a78ce91" + integrity sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ== eslint-plugin-cypress@^2.2.0: version "2.10.3" @@ -3212,91 +3500,97 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@^4.18.2: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^8.57.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + 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" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + 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" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + 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.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.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== -esquery@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +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, estraverse@^4.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== @@ -3344,13 +3638,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" - execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -3396,106 +3683,22 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== - dependencies: - fill-range "^2.1.0" - -expect@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" - integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== - dependencies: - ansi-styles "^3.2.0" - jest-diff "^23.6.0" - jest-get-type "^22.1.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - -expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== - dependencies: - "@jest/expect-utils" "^29.3.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== +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: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + "@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" extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-zip@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -3516,12 +3719,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw== - -fast-deep-equal@^3.1.1: +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== @@ -3531,16 +3729,28 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^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-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.5.tgz#610f37419a030270430cecd68d74e3d4d96725d0" + integrity sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw== + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + 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" @@ -3555,6 +3765,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +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== + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -3570,52 +3785,12 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w== - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.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== - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== - -fileset@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw== - dependencies: - glob "^7.0.3" - minimatch "^3.0.3" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -3624,23 +3799,20 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== +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: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" + to-regex-range "^5.0.1" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" find-replace@^3.0.0: version "3.0.0" @@ -3649,21 +3821,6 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3679,45 +3836,57 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== +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: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" + locate-path "^6.0.0" + path-exists "^4.0.0" -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - is-callable "^1.1.3" + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +flatted@^3.2.9: + version "3.4.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.4.tgz#aeeca2a506303f0cee61c59e6c9f2a88d2f29fc6" + integrity sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q== -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== - dependencies: - for-in "^1.0.1" +follow-redirects@^1.14.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data@^4.0.0: + version "4.0.6" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" + integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== + 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" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -3727,13 +3896,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -3762,7 +3924,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== @@ -3772,43 +3934,25 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.0.0, fsevents@^1.2.3: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +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.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +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== generate-changelog@^1.7.1: version "1.8.0" @@ -3824,30 +3968,40 @@ gensync@^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@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - 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-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" +get-intrinsic@^1.2.6: + 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-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" @@ -3865,19 +4019,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -3897,47 +4038,46 @@ github-url-from-git@^1.4.0: resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" integrity sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ== -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^4.0.3" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== +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 "^2.0.0" + is-glob "^4.0.1" 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@^7.0.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.1.3, glob@^7.2.0: + 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.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3948,47 +4088,42 @@ global-dirs@^2.0.1: dependencies: ini "^1.3.5" -globals@^11.0.1, globals@^11.1.0, globals@^11.12.0: +globals@^11.1.0, globals@^11.12.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== -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" glur@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/glur/-/glur-1.1.2.tgz#f20ea36db103bfc292343921f1f91e83c3467689" integrity sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +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.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== - -handlebars@^4.0.3: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== har-schema@^2.0.0: version "2.0.0" @@ -4010,16 +4145,6 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4030,55 +4155,22 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== +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-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== +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: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.3" has@^1.0.3: version "1.0.3" @@ -4087,25 +4179,19 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== +hasown@^2.0.2, hasown@^2.0.3, hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -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== + function-bind "^1.1.2" -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.1" + whatwg-encoding "^2.0.0" html-escaper@^2.0.0: version "2.0.2" @@ -4141,6 +4227,15 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4150,39 +4245,50 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + 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== -husky@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" - integrity sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA== - dependencies: - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" - -iconv-lite@0.4.24, iconv-lite@^0.4.17: +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" -ignore@^3.3.3: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +iconv-lite@0.6.3: + 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-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.6.tgz#6a57aaef4c90df27ac3590875d29e8f11988c88e" + integrity sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" import-local@^3.0.2: version "3.1.0" @@ -4215,7 +4321,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4230,109 +4336,22 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - interpret@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -invariant@^2.2.2, 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" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.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-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - 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.1.3, is-callable@^1.1.4, 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-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== +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: - ci-info "^1.5.0" + binary-extensions "^2.0.0" is-ci@^2.0.0: version "2.0.0" @@ -4341,6 +4360,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.16.1: + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== + dependencies: + hasown "^2.0.3" + is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" @@ -4348,78 +4374,10 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== +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@^1.0.0: version "1.0.0" @@ -4438,11 +4396,6 @@ is-fullwidth-code-point@^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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - integrity sha512-95jJZX6O/gdekidH2usRBr9WdRw4LU56CttPstXFxvG0r3QUE9eaIdz2p2Y7zrm6jxz7SjByAo1AtzwGlRvfOg== - 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" @@ -4453,12 +4406,12 @@ is-generator-function@^1.0.7: resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw== -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, 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 "^1.0.0" + is-extglob "^2.1.1" is-installed-globally@^0.3.2: version "0.3.2" @@ -4468,37 +4421,6 @@ is-installed-globally@^0.3.2: global-dirs "^2.0.1" is-path-inside "^3.0.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4516,48 +4438,28 @@ is-path-inside@^3.0.1: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +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-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4568,42 +4470,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - 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-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -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@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -4614,7 +4485,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@~1.0.0: +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== @@ -4624,14 +4495,7 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== @@ -4641,54 +4505,12 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== -istanbul-api@^1.3.1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" - integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== - dependencies: - async "^2.1.4" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.1" - istanbul-lib-hook "^1.2.2" - istanbul-lib-instrument "^1.10.2" - istanbul-lib-report "^1.1.5" - istanbul-lib-source-maps "^1.2.6" - istanbul-reports "^1.5.1" - js-yaml "^3.7.0" - mkdirp "^0.5.1" - once "^1.4.0" - -istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-hook@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" - integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" - semver "^5.3.0" - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.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== @@ -4699,15 +4521,16 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-report@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" - integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== +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: - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" + "@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.0" @@ -4718,17 +4541,6 @@ istanbul-lib-report@^3.0.0: make-dir "^3.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" - integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - 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" @@ -4738,13 +4550,6 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" - integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== - dependencies: - handlebars "^4.0.3" - istanbul-reports@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" @@ -4761,274 +4566,159 @@ iterm2-version@^4.1.0: app-path "^3.2.0" plist "^3.0.1" -jest-changed-files@^23.4.2: - version "23.4.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" - integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== - dependencies: - throat "^4.0.0" - -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +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.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +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.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@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 "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + 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.3.1" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^23.1.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" - integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^1.0.0" - is-ci "^1.0.10" - istanbul-api "^1.3.1" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^23.4.2" - jest-config "^23.6.0" - jest-environment-jsdom "^23.4.0" - jest-get-type "^22.1.0" - jest-haste-map "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - jest-resolve-dependencies "^23.6.0" - jest-runner "^23.6.0" - jest-runtime "^23.6.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - jest-watcher "^23.4.0" - jest-worker "^23.2.0" - micromatch "^2.3.11" - node-notifier "^5.2.1" - prompts "^0.1.9" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - yargs "^11.0.0" - -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +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.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@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" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" - integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== - dependencies: - babel-core "^6.0.0" - babel-jest "^23.6.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^23.4.0" - jest-environment-node "^23.4.0" - jest-get-type "^22.1.0" - jest-jasmine2 "^23.6.0" - jest-regex-util "^23.3.0" - jest-resolve "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - micromatch "^2.3.11" - pretty-format "^23.6.0" - -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +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.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@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.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + 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.3.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" - integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" - -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +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.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" - integrity sha512-CB8MdScYLkzQ0Q/I4FYlt2UBkG9tFzi+ngSPVhSBB70nifaC+5iWz6GEfa/lB4T2KCqGy+DLzi1v34r9R1XzuA== - dependencies: - detect-newline "^2.1.0" - -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== +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@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" - integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== - dependencies: - chalk "^2.0.1" - pretty-format "^23.6.0" - -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +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.3.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" - -jest-environment-jsdom@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" - integrity sha512-UIXe32cMl/+DtyNHC15X+aFZMh04wx7PjWFBfz+nwoLgsIN2loKoNiKGSzUhMW/fVwbHrk8Qopglb7V4XB4EfQ== - dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" - jsdom "^11.5.1" - -jest-environment-node@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" - integrity sha512-bk8qScgIfkb+EdwJ0JZ9xGvN7N3m6Qok73G8hi6tzvNadpe4kOxxuGmK2cJzAM3tPC/HBulzrOeNHEvaThQFrQ== - dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" - -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + 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.3.1" - jest-util "^29.3.1" - -jest-get-type@^22.1.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.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.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +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@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" - integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== +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: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - invariant "^2.2.4" - jest-docblock "^23.2.0" - jest-serializer "^23.0.1" - jest-worker "^23.2.0" - micromatch "^2.3.11" - sane "^2.0.0" - -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== - dependencies: - "@jest/types" "^29.3.1" + "@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.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + 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: @@ -5064,383 +4754,200 @@ jest-image-snapshot@^6.0.0: rimraf "^2.6.2" ssim.js "^3.1.1" -jest-jasmine2@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" - integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== +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: - babel-traverse "^6.0.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^23.6.0" - is-generator-fn "^1.0.0" - jest-diff "^23.6.0" - jest-each "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - pretty-format "^23.6.0" - -jest-leak-detector@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" - integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== - dependencies: - pretty-format "^23.6.0" - -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== - dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-matcher-utils@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" - integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== - dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" - -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== + 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.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-message-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" - integrity sha512-Tjqy7T8jHhPgV4Gsi+pKMMfaz3uP5DPtMGnm8RWNWUHIk2igqxQ3/9rud3JkINCvZDGqlpJVuFGIDXbltG4xLA== - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" - -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== + 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.3.1" + "@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.3.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" - integrity sha512-lz+Rf6dwRNDVowuGCXm93ib8hMyPntl1GGVt9PuZfBAmTjP5yKYgK14IASiEjs7XoMo4i/R7+dkrJY3eESwTJg== - -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +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.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.3.1" + 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@^23.3.0: - version "23.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" - integrity sha512-pNilf1tXhv5z0qjJy2Hl6Ar6dsi+XX2zpCAuzxRs4qoputI0Bm9rU7pa2ErrFTfiHYe8VboTR7WATPZXqzpQ/g== - -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== - -jest-resolve-dependencies@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" - integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== - dependencies: - jest-regex-util "^23.3.0" - jest-snapshot "^23.6.0" +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.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +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.2.0" - jest-snapshot "^29.3.1" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" - integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== - dependencies: - browser-resolve "^1.11.3" - chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +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.3.1" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" - integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== +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: - exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^23.6.0" - jest-docblock "^23.2.0" - jest-haste-map "^23.6.0" - jest-jasmine2 "^23.6.0" - jest-leak-detector "^23.6.0" - jest-message-util "^23.4.0" - jest-runtime "^23.6.0" - jest-util "^23.4.0" - jest-worker "^23.2.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@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.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + 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@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" - integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== - dependencies: - babel-core "^6.0.0" - babel-plugin-istanbul "^4.1.6" - chalk "^2.0.1" - convert-source-map "^1.4.0" - exit "^0.1.2" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.11" - jest-config "^23.6.0" - jest-haste-map "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - jest-resolve "^23.6.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^11.0.0" - -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +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.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + 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-serializer@^23.0.1: - version "23.0.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" - integrity sha512-l6cPuiGEQI72H4+qMePF62E+URkZscnAqdHBYHkMrhKJOwU08AHvGmftXdosUzfCGhh/Ih4Xk1VgxnJSwrvQvQ== - -jest-snapshot@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" - integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== - dependencies: - babel-types "^6.0.0" - chalk "^2.0.1" - jest-diff "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-resolve "^23.6.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^23.6.0" - semver "^5.5.0" - -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +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/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@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.3.1" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + 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.3.1" - semver "^7.3.5" - -jest-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" - integrity sha512-OS1/0QSbbMF9N93MxF1hUmK93EF3NGQGbbaTBZZk95aytWtWmzxsFWwt/UXIIkfHbPCK1fXTrPklbL+ohuFFOA== - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^23.4.0" - mkdirp "^0.5.1" - slash "^1.0.0" - source-map "^0.6.0" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +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.3.1" + "@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@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" - integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== - dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^23.6.0" - -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +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.3.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.2.0" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.3.1" - -jest-watcher@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" - integrity sha512-BZGZYXnte/vazfnmkD4ERByi2O2mW+C++W8Sb7dvOnwcSccvCKNQgmcz1L+9hxVD7HWtqymPctIY7v5ZbQGNyg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - string-length "^2.0.0" + pretty-format "^29.7.0" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +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.3.1" - "@jest/types" "^29.3.1" + "@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.3.1" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" - integrity sha512-zx0uwPCDxToGfYyQiSHh7T/sKIxQFnQqT6Uug7Y/L7PzEkFITPaufjQe6yaf1OXSnGvKC5Fwol1hIym0zDzyvw== - dependencies: - merge-stream "^1.0.1" - jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -5450,25 +4957,25 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +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.3.1" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== +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.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.7.0" joi@^17.4.0: version "17.7.0" @@ -5481,16 +4988,11 @@ joi@^17.4.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^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== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -5499,109 +5001,80 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.7.0, js-yaml@^3.9.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js2xmlparser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" - integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== +js-yaml@^4.1.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.1.tgz#01216c001d67f48e2cd560d708c7af21090a3848" + integrity sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ== dependencies: - xmlcreate "^2.0.4" + argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdoc@^3.4.3: - version "3.6.11" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.11.tgz#8bbb5747e6f579f141a5238cbad4e95e004458ce" - integrity sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg== - dependencies: - "@babel/parser" "^7.9.4" - "@types/markdown-it" "^12.2.3" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.2" - klaw "^3.0.0" - markdown-it "^12.3.2" - markdown-it-anchor "^8.4.1" - marked "^4.0.10" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.13.2" - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + 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" 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@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@^3.0.2, 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-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 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.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA== - 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-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -5617,23 +5090,16 @@ json-stringify-safe@5, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +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@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5668,42 +5134,18 @@ keygrip@~1.1.0: dependencies: tsscmp "1.0.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - is-buffer "^1.1.5" + json-buffer "3.0.1" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - -kleur@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" - integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5865,47 +5307,30 @@ lazy-ass@1.6.0, lazy-ass@^1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== - 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== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" 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== -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== +linkify-it@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.2.tgz#d3be0a693af3da9df3883f1e346a0e97461a8c19" + integrity sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q== dependencies: - uc.micro "^1.0.1" + uc.micro "^2.0.0" listr-silent-renderer@^1.1.1: version "1.1.1" @@ -5951,17 +5376,6 @@ listr@^0.14.3: p-map "^2.0.0" rxjs "^6.3.3" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-module/-/load-module-1.0.0.tgz#d65fbe51f1c1df37231399dcd81d784af473eb9b" @@ -5969,28 +5383,11 @@ load-module@^1.0.0: dependencies: array-back "^2.0.0" -loader-fs-cache@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" - integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== - dependencies: - find-cache-dir "^0.1.1" - mkdirp "^0.5.1" - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -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" - local-web-server@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/local-web-server/-/local-web-server-2.6.1.tgz#6c96bc3193edb00b5ba1d483607a71af6d5509e7" @@ -6015,14 +5412,6 @@ local-web-server@^2.6.1: lws-static "^0.5.0" node-version-matches "^1.0.0" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -6038,6 +5427,20 @@ locate-path@^5.0.0: 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" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.assignwith@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" @@ -6048,6 +5451,16 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +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.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -6063,17 +5476,12 @@ lodash.pick@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6113,27 +5521,17 @@ lolex@^5.0.1: dependencies: "@sinonjs/commons" "^1.7.0" -loose-envify@^1.0.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@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== +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: - pseudomap "^1.0.2" - yallist "^2.1.2" + 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" +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== lws-basic-auth@^0.1.1: version "0.1.1" @@ -6279,12 +5677,13 @@ lws@^1.3.0: walk-back "^3.0.1" ws "^5.2.1" -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - pify "^3.0.0" + pify "^4.0.1" + semver "^5.6.0" make-dir@^3.0.0: version "3.1.0" @@ -6298,137 +5697,50 @@ makeerror@1.0.12: resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.5" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + tmpl "1.0.5" map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -markdown-it-anchor@^8.4.1: - version "8.6.5" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" - integrity sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ== - -markdown-it@^12.3.2: - version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== +markdown-it@^14.1.0: + version "14.3.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.3.0.tgz#8542fa5506e3530f7e2b08dc3885630135c5620e" + integrity sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw== dependencies: argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^4.0.10: - version "4.2.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.2.tgz#1d2075ad6cdfe42e651ac221c32d949a26c0672a" - integrity sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ== + entities "^4.5.0" + linkify-it "^5.0.2" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +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== -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +mdurl@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.1.0.tgz#d711d3f7bce7f22c487c91be78545f356fa96573" + integrity sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg== 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== -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA== - dependencies: - readable-stream "^2.0.1" - 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== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - methods@~1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^2.1.5, micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -6452,7 +5764,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.19: 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== @@ -6471,31 +5783,44 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +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@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + +minimatch@^3.0.4, minimatch@^3.1.1: 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" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimatch@^3.0.5, minimatch@^3.1.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.5: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minimist@^1.2.5, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -6510,11 +5835,6 @@ mkdirp@^0.5.4: dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - moment@^2.27.0: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" @@ -6541,16 +5861,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +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== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - mz@^2.1.0, mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -6560,28 +5875,6 @@ mz@^2.1.0, mz@^2.6.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6592,7 +5885,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.0, neo-async@^2.6.2: +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== @@ -6618,16 +5911,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-notifier@^5.2.1: - version "5.4.5" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" - integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" +node-releases@^2.0.53: + version "2.0.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.53.tgz#0fe5ad8a7935e075172f574e56f0c20f07fa41af" + integrity sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ== node-releases@^2.0.6: version "2.0.6" @@ -6641,29 +5928,7 @@ node-version-matches@^1.0.0, node-version-matches@^1.0.1: dependencies: semver "^5.6.0" -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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA== - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: +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== @@ -6687,10 +5952,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.0.7: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== +nwsapi@^2.2.2: + version "2.2.24" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.24.tgz#f8927043d4c9b516abdebe804a32c8d1f9484d1f" + integrity sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A== oauth-sign@~0.9.0: version "0.9.0" @@ -6702,72 +5967,6 @@ object-assign@^4.0.1, object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.1.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - on-finished@^2.3.0, on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6818,73 +6017,28 @@ opn@^5.4.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^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== + 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" ospath@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg== - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - 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-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - 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" @@ -6892,19 +6046,19 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.1.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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: - p-limit "^1.1.0" + yocto-queue "^1.0.0" p-locate@^3.0.0: version "3.0.0" @@ -6920,37 +6074,36 @@ p-locate@^4.1.0: 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-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - 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== -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== +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: - error-ex "^1.2.0" + callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" @@ -6962,28 +6115,18 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parse5@^7.0.0, parse5@^7.1.1: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" parseurl@^1.3.2, parseurl@~1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6994,16 +6137,16 @@ path-exists@^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.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@1.0.1, 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-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -7014,7 +6157,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.7: +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== @@ -7038,15 +6181,6 @@ path-to-regexp@^2.2.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz#35ce7f333d5616f1c1e1bfe266c3aba2e5b2e704" integrity sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w== -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -7069,37 +6203,40 @@ picocolors@^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@^2.0.4: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + 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@^2.0.0, pify@^2.2.0: +picomatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" + integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== + +pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -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== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.4: version "4.0.5" @@ -7113,20 +6250,6 @@ pixelmatch@^5.1.0: dependencies: pngjs "^6.0.0" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw== - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -7141,6 +6264,13 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + plist@^3.0.1: version "3.0.6" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" @@ -7149,16 +6279,6 @@ plist@^3.0.1: base64-js "^1.5.1" xmlbuilder "^15.1.1" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - pngjs@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" @@ -7169,71 +6289,35 @@ pngjs@^6.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^1.13.2: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^3.3.0: + version "3.9.6" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.6.tgz#b3ea5146515d40fc53f18aa63f74dfab1e10dbf6" + integrity sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g== pretty-bytes@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== -pretty-format@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== +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: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== - dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - 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== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^0.1.9: - version "0.1.14" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" - integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w== - dependencies: - kleur "^2.0.1" - sisteransi "^0.1.1" - prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -7249,16 +6333,18 @@ ps-tree@1.2.0: dependencies: event-stream "=3.3.4" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - psl@^1.1.28: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -7267,6 +6353,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -7277,6 +6368,16 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.3.1: + 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== + qs@^6.5.2: version "6.9.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" @@ -7292,20 +6393,21 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== +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== + +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== + ramda@~0.26.1: version "0.26.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -7323,34 +6425,12 @@ raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q== - react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@2, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2: +readable-stream@2, readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7363,21 +6443,12 @@ readable-stream@2, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stre string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -realpath-native@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== +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: - util.promisify "^1.0.0" + picomatch "^2.2.1" rechoir@^0.8.0: version "0.8.0" @@ -7396,101 +6467,41 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w== - -regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== +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.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.2" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.2, 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== +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== + +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== -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== +regjsparser@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== dependencies: - is-finite "^1.0.0" + jsesc "~3.1.0" req-then@^0.6.4: version "0.6.4" @@ -7501,88 +6512,29 @@ req-then@^0.6.4: defer-promise "^1.0.1" lodash.pick "^4.4.0" stream-read-all "^0.1.0" - typical "^2.6.1" - -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + typical "^2.6.1" + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" 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-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w== - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== - dependencies: - lodash "^4.17.14" +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== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== - dependencies: - resolve-from "^3.0.0" +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-cwd@^3.0.0: version "3.0.0" @@ -7591,15 +6543,10 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== +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" @@ -7614,22 +6561,12 @@ resolve-path@^1.4.0: http-errors "~1.6.2" path-is-absolute "1.0.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== +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.10.0, resolve@^1.20.0: +resolve@^1.20.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -7638,6 +6575,16 @@ resolve@^1.10.0, resolve@^1.20.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@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -7654,46 +6601,31 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +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" -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== +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: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== + queue-microtask "^1.2.2" rxjs@^6.3.3: version "6.6.0" @@ -7719,47 +6651,17 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.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== -sane@^2.0.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - integrity sha512-OuZwD1QJ2R9Dbnhd7Ur8zzD8l+oADp9npyxK63Q9nZ4AjhB2QwDQcQlD8iuUsGm5AZZqtEuCaJvK1rxGRxyQ1Q== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + xmlchars "^2.2.0" schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" @@ -7770,7 +6672,17 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: +schema-utils@^4.0.0: + 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@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -7780,12 +6692,15 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.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, semver@^7.7.3: + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== serialize-javascript@^6.0.0: version "6.0.0" @@ -7807,21 +6722,6 @@ serve-index-75lb@^2.0.0: mime-types "~2.1.18" parseurl "~1.3.2" -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-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -7868,20 +6768,6 @@ shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -7905,20 +6791,15 @@ sinon@^7.2.7: nise "^1.5.2" supports-color "^5.5.0" -sisteransi@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" - integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== - 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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: version "3.0.0" @@ -7930,54 +6811,6 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - 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" @@ -7986,14 +6819,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.6, source-map-support@~0.5.20: +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== @@ -8001,16 +6827,6 @@ source-map-support@^0.5.6, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.3, source-map@^0.5.6, 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== - source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -8021,39 +6837,6 @@ spawn-command@^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== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - 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.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -8086,13 +6869,6 @@ ssim.js@^3.1.1: resolved "https://registry.yarnpkg.com/ssim.js/-/ssim.js-3.5.0.tgz#d7276b9ee99b57a5ff0db34035f02f35197e62df" integrity sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g== -stack-utils@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" - integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== - dependencies: - escape-string-regexp "^2.0.0" - stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -8113,24 +6889,11 @@ start-server-and-test@^1.7.11: ps-tree "1.2.0" wait-on "6.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.0.0, statuses@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -8174,14 +6937,6 @@ streaming-json-stringify@3: json-stringify-safe "5" readable-stream "2" -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ== - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.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" @@ -8199,7 +6954,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8216,24 +6971,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -8262,18 +6999,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -8289,33 +7014,16 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +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== - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -8347,7 +7055,7 @@ symbol-observable@^1.1.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2: +symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -8363,23 +7071,6 @@ table-layout@^0.4.3, table-layout@~0.4.0: typical "^2.6.1" wordwrapjs "^3.0.0" -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== - tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -8414,17 +7105,6 @@ terser@^5.14.1: commander "^2.20.0" source-map-support "~0.5.20" -test-exclude@^4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" - integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== - dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -8434,7 +7114,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -8453,27 +7133,23 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== - throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1: +through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +tinyglobby@^0.2.15: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== dependencies: - os-tmpdir "~1.0.2" + fdir "^6.5.0" + picomatch "^4.0.4" tmp@~0.1.0: version "0.1.0" @@ -8487,31 +7163,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== - 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-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - 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" @@ -8519,22 +7175,22 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: +tough-cookie@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -8542,22 +7198,22 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: - punycode "^2.1.0" + punycode "^2.1.1" 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== -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== +ts-api-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== tslib@^1.9.0: version "1.14.1" @@ -8586,12 +7242,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" + prelude-ls "^1.2.1" type-detect@4.0.8: version "4.0.8" @@ -8603,6 +7259,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -8621,6 +7282,22 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typedoc@^0.27.0: + version "0.27.9" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.9.tgz#5e0a7bc32bfc7bd0b70a353f4f1d5cba3d667c46" + integrity sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw== + dependencies: + "@gerrit0/mini-shiki" "^1.24.0" + lunr "^2.3.9" + markdown-it "^14.1.0" + minimatch "^9.0.5" + yaml "^2.6.1" + +typescript@~5.7.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + typical@^2.6.0, typical@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" @@ -8636,59 +7313,49 @@ typical@^4.0.0: resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== -uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== +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== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +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: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -underscore@~1.13.2: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +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== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" +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== universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + 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== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -8702,6 +7369,14 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz#a71c28dd22f505481dbc4689087b18d933e90afd" + integrity sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ== + 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" @@ -8709,10 +7384,13 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== +url-parse@^1.5.3: + 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" url@^0.11.0: version "0.11.0" @@ -8722,32 +7400,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ== - 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== -util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -8762,21 +7419,6 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA== - dependencies: - user-home "^1.1.1" - -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" - vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -8791,12 +7433,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -w3c-hr-time@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - browser-process-hrtime "^1.0.0" + xml-name-validator "^4.0.0" wait-on@6.0.0: version "6.0.0" @@ -8814,21 +7456,13 @@ walk-back@^3.0.1: resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-3.0.1.tgz#0c0012694725604960d6c2f75aaf1a1e7d455d35" integrity sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ== -walker@^1.0.8, walker@~1.0.5: +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" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha512-oUcoHFG3UF2pBlHcMORAojsN09BfqSfWYWlR3eSSjUFR7eBEx53WT2HX/vZeVTTIVCGShcazb+t6IcBRCNXqvA== - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -8842,10 +7476,10 @@ webgl-mock@^0.1.7: resolved "https://registry.yarnpkg.com/webgl-mock/-/webgl-mock-0.1.7.tgz#cad9d7c9789cbc7e61c20ca6026d56577921b770" integrity sha512-7Wlrhvo2bnts5Wt53vy+OD/pJsAXC3Bj4R+qR4eInMaqAyVx3NI8ui3+pKClLy7zVoZVglkzV8PGJUXt2POINg== -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-cli@^5.0.0: version "5.0.0" @@ -8909,53 +7543,27 @@ webpack@^5.75.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + iconv-lite "0.6.3" -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + tr46 "^3.0.0" + webidl-conversions "^7.0.0" -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8974,15 +7582,10 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -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== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrapjs@^3.0.0: version "3.0.0" @@ -8992,14 +7595,6 @@ wordwrapjs@^3.0.0: reduce-flatten "^1.0.1" typical "^2.6.1" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" @@ -9022,16 +7617,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^2.1.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^4.0.1: +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== @@ -9039,85 +7625,53 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA== - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0, ws@^5.2.1: +ws@^5.2.1: version "5.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +ws@^8.11.0: + version "8.21.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" + integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlbuilder@^15.1.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== -xmlcreate@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" - integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== 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@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -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@^2.6.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== 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@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw== - dependencies: - camelcase "^4.1.0" - -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - yargs@^17.3.1: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" @@ -9148,3 +7702,8 @@ 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== + +yocto-queue@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== From 811aed38c537b3e27aa7e4a0848fd93558bdaaf0 Mon Sep 17 00:00:00 2001 From: Em Shotton <10514138+emshotton@users.noreply.github.com> Date: Sun, 16 Aug 2026 22:20:11 -0700 Subject: [PATCH 2/4] Add coverage for VideoElementCache, CanvasNode and MediaNode; fix repeated unload in CanvasNode Adds 30 tests (95 -> 125) covering the video element pool's autoplay contract, CanvasNode's load/seek/ended lifecycle, and MediaNode's playbackRate, stretchPaused, buffering, loop, element-cache, URL/ MediaStream source, error, ended and seek branches. Overall statement coverage rises from 57.8% to 65.7% (branches 48.1% -> 60.8%). Writing the CanvasNode ended-state test exposed a bug: after passing its stop time the node called _unload() on every frame, firing the "destroy" callback repeatedly, because its guard (_element !== undefined) never becomes false for a user-supplied canvas. Fixed with the same _loadCalled guard used by MediaNode. Co-Authored-By: Claude Fable 5 --- src/SourceNodes/canvasnode.ts | 6 +- test/integration/medianode.test.js | 259 ++++++++++++++++++++++++++++ test/unit/canvasnode.spec.js | 120 +++++++++++++ test/unit/videoelementcache.spec.js | 123 +++++++++++++ 4 files changed, 507 insertions(+), 1 deletion(-) create mode 100644 test/unit/canvasnode.spec.js create mode 100644 test/unit/videoelementcache.spec.js diff --git a/src/SourceNodes/canvasnode.ts b/src/SourceNodes/canvasnode.ts index 3e166b44..05b5594a 100644 --- a/src/SourceNodes/canvasnode.ts +++ b/src/SourceNodes/canvasnode.ts @@ -64,7 +64,11 @@ class CanvasNode extends SourceNode { } else if (this._state === SOURCENODESTATE.paused) { return true; } else if (this._state === SOURCENODESTATE.ended && this._element !== undefined) { - this._unload(); + //_unload resets _loadCalled so this only runs once; the canvas element + //is user-supplied so _element never becomes undefined + if (this._loadCalled) { + this._unload(); + } return false; } return false; diff --git a/test/integration/medianode.test.js b/test/integration/medianode.test.js index 10fa81d5..09d4c7c0 100644 --- a/test/integration/medianode.test.js +++ b/test/integration/medianode.test.js @@ -1,8 +1,22 @@ import VideoContext from "../../src/videocontext"; +import { SOURCENODESTATE } from "../../src/SourceNodes/sourcenode"; let ctx; require("webgl-mock"); +/* + * an element mock which reports itself as ready for playback + * (readyState 4 = HAVE_ENOUGH_DATA) so the node's load polling completes + */ +const makeReadyElement = (duration = 30) => ({ + play: jest.fn(), + pause: jest.fn(), + readyState: 4, + seeking: false, + duration, + currentTime: 0 +}); + /* * creates a video node with provided attributes. * returns: the node instance and the mocked HTMLVideoElement which is controlled by the node @@ -224,4 +238,249 @@ describe("medianode", () => { expect(element._currentTimeSetter).toHaveBeenCalledTimes(1); }); }); + + describe("playbackRate", () => { + const rateElementFactory = () => { + const element = makeReadyElement(); + element._playbackRateSetter = jest.fn(); + let rate; + Object.defineProperty(element, "playbackRate", { + get: () => rate, + set: v => { + rate = v; + element._playbackRateSetter(v); + } + }); + return element; + }; + + it("applies the node playback rate to the element when playing", () => { + const element = rateElementFactory(); + const node = ctx.video(element); + node.start(0); + node.playbackRate = 2; + + ctx.play(); + ctx.update(1); + + expect(node.playbackRate).toBe(2); + expect(element.playbackRate).toBe(2); + }); + + it("re-applies the rate only when it changes, not on every frame", () => { + const element = rateElementFactory(); + const node = ctx.video(element); + node.start(0); + + ctx.play(); + ctx.update(1); + ctx.update(1); + ctx.update(1); + expect(element._playbackRateSetter).toHaveBeenCalledTimes(1); + + node.playbackRate = 0.5; + ctx.update(1); + + expect(element.playbackRate).toBe(0.5); + expect(element._playbackRateSetter).toHaveBeenCalledTimes(2); + }); + }); + + describe("stretchPaused", () => { + it("pauses the element while stretch-paused and resumes it when released", () => { + const element = makeReadyElement(); + const node = ctx.video(element); + node.start(0); + ctx.play(); + ctx.update(1); + expect(element.play).toHaveBeenCalledTimes(1); + + node.stretchPaused = true; + expect(node.stretchPaused).toBe(true); + expect(element.pause).toHaveBeenCalledTimes(1); + + node.stretchPaused = false; + expect(element.play).toHaveBeenCalledTimes(2); + }); + + it("does not leave the element playing when playback starts stretch-paused", () => { + const element = makeReadyElement(); + const node = ctx.video(element); + node.start(0); + node.stretchPaused = true; + + ctx.play(); + ctx.update(1); + + // the element must end up paused: the last pause comes after the last play + const lastPlay = Math.max(...element.play.mock.invocationCallOrder); + const lastPause = Math.max(...element.pause.mock.invocationCallOrder); + expect(element.play).toHaveBeenCalled(); + expect(lastPause).toBeGreaterThan(lastPlay); + }); + }); + + describe("buffering", () => { + it("is not buffering before an element exists", () => { + const node = ctx.video("http://example.com/video.mp4"); + + expect(node._buffering).toBe(false); + }); + + it("reports not ready while the element lacks buffered future data", () => { + const element = makeReadyElement(); + const node = ctx.video(element); + node.start(0); + ctx.update(1); + expect(node._isReady()).toBe(true); + + // network stall: readyState drops below HAVE_FUTURE_DATA + element.readyState = 1; + + expect(node._buffering).toBe(true); + expect(node._isReady()).toBe(false); + }); + }); + + describe("loop", () => { + it("keeps a looping source endless instead of stopping at the element duration", () => { + const element = makeReadyElement(5); + const node = ctx.video(element, 0, 4, { loop: true }); + node.start(0); + const durationChangeSpy = jest.fn(); + node.registerCallback("durationchange", durationChangeSpy); + + ctx.update(1 / 60); + ctx.update(1 / 60); + + expect(durationChangeSpy).not.toHaveBeenCalled(); + expect(node.stopTime).toBe(Infinity); + }); + }); + + describe("video element cache", () => { + it("borrows a pooled element for a URL source and frees it again on unload", () => { + const canvas = new HTMLCanvasElement(500, 500); + const cachedCtx = new VideoContext(canvas, undefined, { + useVideoElementCache: true, + videoElementCacheSize: 2 + }); + const cache = cachedCtx._videoElementCache; + // jsdom does not implement media playback; stub the element methods the node drives + for (const item of cache._cacheItems) { + item.element.play = jest.fn(() => Promise.resolve()); + item.element.pause = jest.fn(); + item.element.load = jest.fn(); + } + const node = cachedCtx.video("http://example.com/video.mp4"); + node.start(0); + expect(cache.unused).toBe(2); + + cachedCtx.update(1); + + expect(node.element).toBe(cache._cacheItems[0].element); + expect(cache.unused).toBe(1); + + node.clearTimelineState(); + + expect(node.element).toBeUndefined(); + expect(cache.unused).toBe(2); + }); + }); + + describe("URL sources", () => { + it("creates a video element configured for inline cross-origin playback", () => { + const node = ctx.video("http://example.com/video.mp4"); + // sequence the node inside the preload window so it loads without playing + node.startAt(3); + ctx.update(1); + + const element = node.element; + expect(element.tagName).toBe("VIDEO"); + expect(element.getAttribute("crossorigin")).toBe("anonymous"); + expect(element.hasAttribute("playsinline")).toBe(true); + expect(element.preload).toBe("auto"); + expect(element.src).toBe("http://example.com/video.mp4"); + }); + + it("attaches a MediaStream source via srcObject", () => { + window.MediaStream = class MediaStream {}; + try { + const stream = new window.MediaStream(); + const node = ctx.video(stream); + node.startAt(3); + ctx.update(1); + + expect(node.element.srcObject).toBe(stream); + } finally { + delete window.MediaStream; + } + }); + }); + + describe("error handling", () => { + it("enters the error state but stays ready so the graph keeps rendering", () => { + const { element, node } = nodeFactory(ctx); + const errorSpy = jest.fn(); + node.registerCallback("error", errorSpy); + ctx.update(1); // load attaches the element error handler + + const debugSpy = jest.spyOn(console, "debug").mockImplementation(() => {}); + element.onerror(); + debugSpy.mockRestore(); + + expect(errorSpy).toHaveBeenCalledTimes(1); + expect(node.state).toBe(SOURCENODESTATE.error); + expect(node._isReady()).toBe(true); + }); + }); + + describe("ended element", () => { + it("ends the node when the element reports ended", () => { + const element = makeReadyElement(); + const node = ctx.video(element); + node.start(0); + node.stop(10); + const endedSpy = jest.fn(); + node.registerCallback("ended", endedSpy); + + ctx.update(1); + element.ended = true; + ctx.update(1); + + expect(endedSpy).toHaveBeenCalledTimes(1); + expect(node.state).toBe(SOURCENODESTATE.ended); + expect(element.pause).toHaveBeenCalled(); + }); + }); + + describe("seek", () => { + it("moves the element to the seeked time including the source offset", () => { + const { element } = nodeFactory(ctx, {}, { sourceOffset: 2 }); + ctx.update(1); + expect(element.currentTime).toBe(2); + + ctx.currentTime = 3; + + expect(element.currentTime).toBe(5); // 3s into the timeline + 2s source offset + }); + + it("unloads a node seeked back before its start", () => { + const element = makeReadyElement(); + const node = ctx.video(element); + node.startAt(5); + node.stopAt(10); + const destroySpy = jest.fn(); + node.registerCallback("destroy", destroySpy); + + ctx.play(); + ctx.update(6); // node is now playing + expect(node.state).toBe(SOURCENODESTATE.playing); + + ctx.currentTime = 1; // seek back before the node's start time + + expect(destroySpy).toHaveBeenCalledTimes(1); + expect(node.state).toBe(SOURCENODESTATE.sequenced); + }); + }); }); diff --git a/test/unit/canvasnode.spec.js b/test/unit/canvasnode.spec.js new file mode 100644 index 00000000..e6067bdd --- /dev/null +++ b/test/unit/canvasnode.spec.js @@ -0,0 +1,120 @@ +//import utils before the node under test to avoid the circular-import crash +//(canvasnode → sourcenode → utils → videonode → medianode → sourcenode) +import "../../src/utils"; +import CanvasNode, { CANVASTYPE } from "../../src/SourceNodes/canvasnode"; +import RenderGraph from "../../src/rendergraph"; +import "webgl-mock"; + +let mockGLContext, renderGraph, canvasElement; + +const SEQUENCED_STATE = 1; +const PLAYING_STATE = 2; +const ENDED_STATE = 4; + +beforeEach(() => { + const canvas = new HTMLCanvasElement(500, 500); + mockGLContext = canvas.getContext("webgl"); + renderGraph = new RenderGraph(); + canvasElement = new HTMLCanvasElement(100, 100); +}); + +describe("CANVASTYPE", () => { + test(`should be "CanvasNode"`, () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + + expect(CANVASTYPE).toBe("CanvasNode"); + expect(node.displayName).toBe("CanvasNode"); + }); +}); + +describe("_load", () => { + test("marks the node ready and fires the loaded callback", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + const loadedSpy = jest.fn(); + node.registerCallback("loaded", loadedSpy); + + node._load(); + + expect(node._ready).toBe(true); + expect(loadedSpy).toHaveBeenCalledTimes(1); + }); +}); + +describe("_update", () => { + test("loads within the preload window before its start time, not sooner", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0, 4); + const loadedSpy = jest.fn(); + node.registerCallback("loaded", loadedSpy); + node.startAt(5); + + // 4.5s before the start time: outside the 4s preload window + node._update(0.5); + expect(loadedSpy).not.toHaveBeenCalled(); + + // 3.5s before the start time: inside the window + node._update(1.5); + expect(loadedSpy).toHaveBeenCalledTimes(1); + expect(node.state).toBe(SEQUENCED_STATE); + }); + + test("returns true and plays once the timeline enters its range", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + node.startAt(0); + + expect(node._update(0.1)).toBe(true); + expect(node.state).toBe(PLAYING_STATE); + }); + + test("unloads exactly once when playback passes the stop time", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + const destroySpy = jest.fn(); + node.registerCallback("destroy", destroySpy); + node.startAt(0); + node.stopAt(2); + + node._update(1); + expect(node.state).toBe(PLAYING_STATE); + + // passing the stop time ends the node and unloads it + expect(node._update(3)).toBe(false); + expect(node.state).toBe(ENDED_STATE); + expect(destroySpy).toHaveBeenCalledTimes(1); + + // subsequent updates while ended must not unload again + node._update(4); + expect(destroySpy).toHaveBeenCalledTimes(1); + }); +}); + +describe("_seek", () => { + test("unloads when seeked back before its start time", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + const destroySpy = jest.fn(); + node.registerCallback("destroy", destroySpy); + node.startAt(2); + + node._update(3); + expect(node._ready).toBe(true); + + node._seek(0); + + expect(destroySpy).toHaveBeenCalledTimes(1); + expect(node._ready).toBe(false); + expect(node.state).toBe(SEQUENCED_STATE); + }); + + test("re-loads after an in-range seek cleared readiness", () => { + const node = new CanvasNode(canvasElement, mockGLContext, renderGraph, 0); + node.startAt(0); + node._update(0.5); + expect(node._ready).toBe(true); + + // an in-range seek must invalidate the current texture... + node._seek(1); + expect(node._ready).toBe(false); + + // ...and the next update re-loads it + node._update(1.1); + expect(node._ready).toBe(true); + }); +}); diff --git a/test/unit/videoelementcache.spec.js b/test/unit/videoelementcache.spec.js new file mode 100644 index 00000000..e69a63b5 --- /dev/null +++ b/test/unit/videoelementcache.spec.js @@ -0,0 +1,123 @@ +//import utils before the cache to avoid the circular-import crash +//(videoelementcacheitem → sourcenode → utils → videonode → medianode → sourcenode) +import "../../src/utils"; +import VideoElementCache from "../../src/videoelementcache"; + +const PLAYING_STATE = 2; + +const flushPromises = () => new Promise(resolve => setTimeout(resolve, 0)); + +/* jsdom does not implement media playback, so stub the element methods init() drives */ +const stubPlayback = cache => { + for (const item of cache._cacheItems) { + item.element.play = jest.fn(() => Promise.resolve()); + item.element.pause = jest.fn(); + } +}; + +describe("VideoElementCache", () => { + describe("constructor", () => { + test("creates the requested number of pooled video elements", () => { + expect(new VideoElementCache(5).length).toBe(5); + }); + + test("pools elements configured for inline cross-origin playback", () => { + const cache = new VideoElementCache(1); + + const element = cache.getElementAndLinkToNode({}); + + expect(element.tagName).toBe("VIDEO"); + expect(element.getAttribute("crossorigin")).toBe("anonymous"); + expect(element.hasAttribute("playsinline")).toBe(true); + expect(element.preload).toBe("auto"); + }); + }); + + describe("getElementAndLinkToNode", () => { + test("hands out each pooled element only once while it has media attached", () => { + const cache = new VideoElementCache(2); + const first = cache.getElementAndLinkToNode({}); + first.src = "http://example.com/a.mp4"; + + const second = cache.getElementAndLinkToNode({}); + + expect(second).not.toBe(first); + }); + + test("grows beyond its initial size when every element is in use", () => { + const cache = new VideoElementCache(1); + const first = cache.getElementAndLinkToNode({}); + first.src = "http://example.com/a.mp4"; + + const debugSpy = jest.spyOn(console, "debug").mockImplementation(() => {}); + const second = cache.getElementAndLinkToNode({}); + debugSpy.mockRestore(); + + expect(second).not.toBe(first); + expect(cache.length).toBe(2); + }); + + test("links the media node so the cache knows the element is playing, and unlinks it again", () => { + const cache = new VideoElementCache(1); + const playingNode = { _state: PLAYING_STATE }; + + const element = cache.getElementAndLinkToNode(playingNode); + expect(cache._cacheItems[0].isPlaying()).toBe(true); + + cache.unlinkNodeFromElement(element); + expect(cache._cacheItems[0].isPlaying()).toBe(false); + }); + }); + + describe("unused", () => { + test("counts only elements without media attached", () => { + const cache = new VideoElementCache(3); + expect(cache.unused).toBe(3); + + cache.getElementAndLinkToNode({}).src = "http://example.com/a.mp4"; + + expect(cache.unused).toBe(2); + }); + }); + + describe("init", () => { + test("plays every pooled element once and pauses those not linked to a playing node", async () => { + const cache = new VideoElementCache(2); + stubPlayback(cache); + // link a playing node to the first element; leave the second unlinked + cache._cacheItems[0].linkNode({ _state: PLAYING_STATE }); + + cache.init(); + await flushPromises(); + + expect(cache._cacheItems[0].element.play).toHaveBeenCalledTimes(1); + expect(cache._cacheItems[0].element.pause).not.toHaveBeenCalled(); + expect(cache._cacheItems[1].element.play).toHaveBeenCalledTimes(1); + expect(cache._cacheItems[1].element.pause).toHaveBeenCalledTimes(1); + }); + + test("does not touch the elements again once initialised", async () => { + const cache = new VideoElementCache(1); + stubPlayback(cache); + + cache.init(); + cache.init(); + await flushPromises(); + + expect(cache._cacheItems[0].element.play).toHaveBeenCalledTimes(1); + }); + + test("swallows NotSupportedError autoplay rejections", async () => { + const cache = new VideoElementCache(1); + const error = new Error("no supported source"); + error.name = "NotSupportedError"; + cache._cacheItems[0].element.play = jest.fn(() => Promise.reject(error)); + cache._cacheItems[0].element.pause = jest.fn(); + + cache.init(); + await flushPromises(); + + expect(cache._cacheItems[0].element.pause).not.toHaveBeenCalled(); + }); + }); +}); From 7dd207673122c55d3ef5a298e383c62f9f06a46f Mon Sep 17 00:00:00 2001 From: Em Shotton <10514138+emshotton@users.noreply.github.com> Date: Sun, 16 Aug 2026 22:37:07 -0700 Subject: [PATCH 3/4] Remove obsolete libgconf-2-4 install from CI GConf was removed from Ubuntu, so this step now fails on ubuntu-latest (24.04) before any tests run. Nothing needs it: the unit and integration suites are Node/jsdom only, and Cypress 4's Electron 8 / Chromium 80 does not link against GConf. Co-Authored-By: Claude Fable 5 --- .github/workflows/build.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 68917539..b940c974 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -16,8 +16,6 @@ jobs: steps: - uses: actions/checkout@v3 - - run: sudo apt-get install -y libgconf-2-4 - - uses: actions/setup-node@v3 with: node-version: '20.x' From be6b113671fa047ff88aeb66121202f7aab29732 Mon Sep 17 00:00:00 2001 From: Em Shotton <10514138+emshotton@users.noreply.github.com> Date: Sun, 16 Aug 2026 22:41:37 -0700 Subject: [PATCH 4/4] Enable software WebGL for Cypress on GPU-less CI runners Chrome 137+ disables the SwiftShader software-WebGL fallback by default, so on GitHub's GPU-less runners getContext("webgl") returns null and every visual test fails with "Cannot read properties of undefined (reading 'createTexture')". Pass --enable-unsafe-swiftshader via the before:browser:launch hook to restore it. Co-Authored-By: Claude Fable 5 --- test/cypress/plugins/index.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/cypress/plugins/index.js b/test/cypress/plugins/index.js index c8a66ce5..b3156f0e 100644 --- a/test/cypress/plugins/index.js +++ b/test/cypress/plugins/index.js @@ -3,4 +3,14 @@ const { addMatchImageSnapshotPlugin } = require("cypress-image-snapshot/plugin") // eslint-disable-next-line module.exports = (on, config) => { addMatchImageSnapshotPlugin(on, config); + + on("before:browser:launch", (browser = {}, launchOptions) => { + if (browser.family === "chromium") { + // Chrome 137+ disables the SwiftShader software-WebGL fallback by + // default, so on GPU-less CI runners getContext("webgl") returns + // null without this flag. + launchOptions.args.push("--enable-unsafe-swiftshader"); + } + return launchOptions; + }); };