From 6cc7173cc37d3eb74a54741a19eebe900b7d0667 Mon Sep 17 00:00:00 2001 From: Reversean Date: Thu, 2 Jul 2026 15:51:23 +0300 Subject: [PATCH] feat: add @editorjs/header package and fix core/ui bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add packages/tools/header with Header block tool: • three toolbox entries (H1/H2/H3) each carrying their level in data • registers text + level keys in the correct order (addEventListener before registerTextInputKey/registerValueKey, so synchronously-fired KeyAddedEvent is never missed) • swaps heading tag on ValueNodeChangedEvent(level) • 36 unit tests - Fix BlockManager.insert: pass { data, id, name } instead of { ...data, id, name } so tool data is not silently flattened into top-level BlockNodeInit properties - Fix ToolboxUI.addTool: iterate tool.toolbox (normalized array via facade getter) with for…of instead of spreading a raw value that may be an array or single object --- package.json | 3 +- packages/core/src/components/BlockManager.ts | 2 +- packages/tools/header/eslint.config.mjs | 31 ++ packages/tools/header/jest.config.ts | 19 + packages/tools/header/package.json | 46 ++ packages/tools/header/src/index.spec.ts | 217 ++++++++ packages/tools/header/src/index.ts | 142 ++++++ packages/tools/header/tsconfig.build.json | 12 + packages/tools/header/tsconfig.eslint.json | 13 + packages/tools/header/tsconfig.json | 26 + packages/ui/src/Toolbox/Toolbox.ts | 21 +- yarn.lock | 503 ++++++++++++++++++- 12 files changed, 1013 insertions(+), 22 deletions(-) create mode 100644 packages/tools/header/eslint.config.mjs create mode 100644 packages/tools/header/jest.config.ts create mode 100644 packages/tools/header/package.json create mode 100644 packages/tools/header/src/index.spec.ts create mode 100644 packages/tools/header/src/index.ts create mode 100644 packages/tools/header/tsconfig.build.json create mode 100644 packages/tools/header/tsconfig.eslint.json create mode 100644 packages/tools/header/tsconfig.json diff --git a/package.json b/package.json index 552128ee..6a35e372 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "private": true, "packageManager": "yarn@4.0.1", "workspaces": [ - "packages/*" + "packages/*", + "packages/tools/*" ], "scripts": { "build": "yarn workspaces foreach -At run build", diff --git a/packages/core/src/components/BlockManager.ts b/packages/core/src/components/BlockManager.ts index df3e68db..c5c3ffc9 100644 --- a/packages/core/src/components/BlockManager.ts +++ b/packages/core/src/components/BlockManager.ts @@ -145,7 +145,7 @@ export class BlocksManager { } this.#model.addBlock(userId, { - ...data, + data, id, name: type, }, newIndex); diff --git a/packages/tools/header/eslint.config.mjs b/packages/tools/header/eslint.config.mjs new file mode 100644 index 00000000..e98acf16 --- /dev/null +++ b/packages/tools/header/eslint.config.mjs @@ -0,0 +1,31 @@ +import CodeX from 'eslint-config-codex'; + +export default [ + ...CodeX, + { + languageOptions: { + parserOptions: { + project: './tsconfig.eslint.json', + tsconfigRootDir: import.meta.dirname, + sourceType: 'module', + }, + }, + rules: { + 'n/no-unpublished-import': ['error', { + allowModules: ['eslint-config-codex'], + ignoreTypeImport: true, + }], + 'n/no-missing-import': ['error', { + allowModules: ['@editorjs/model', '@editorjs/sdk', '@editorjs/dom-adapters'], + }], + }, + }, + { + files: ['**/*.spec.ts'], + rules: { + 'n/no-unpublished-import': ['error', { + allowModules: ['@jest/globals'], + }], + }, + }, +]; diff --git a/packages/tools/header/jest.config.ts b/packages/tools/header/jest.config.ts new file mode 100644 index 00000000..a0df3907 --- /dev/null +++ b/packages/tools/header/jest.config.ts @@ -0,0 +1,19 @@ +import type { JestConfigWithTsJest } from 'ts-jest'; + +export default { + preset: 'ts-jest', + testEnvironment: 'jsdom', + testMatch: ['/src/**/*.spec.ts'], + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + coverageReporters: ['lcov', 'json-summary', 'text-summary'], + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { useESM: true }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!@editorjs)'], +} as JestConfigWithTsJest; diff --git a/packages/tools/header/package.json b/packages/tools/header/package.json new file mode 100644 index 00000000..3c3b9aab --- /dev/null +++ b/packages/tools/header/package.json @@ -0,0 +1,46 @@ +{ + "name": "@editorjs/header", + "version": "0.1.0", + "packageManager": "yarn@4.0.1", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "yarn clear && tsc --build tsconfig.build.json", + "dev": "yarn build --watch", + "test": "node --experimental-vm-modules $(yarn bin jest)", + "test:coverage": "yarn test --coverage=true", + "lint": "eslint ./src", + "lint:ci": "yarn lint --max-warnings 0", + "lint:fix": "yarn lint --fix", + "clear": "rm -rf dist && rm -f tsconfig.build.tsbuildinfo" + }, + "dependencies": { + "@codexteam/icons": "^0.3.3", + "@editorjs/dom-adapters": "workspace:^", + "@editorjs/editorjs": "^2.30.8", + "@editorjs/model": "workspace:^", + "@editorjs/sdk": "workspace:^" + }, + "devDependencies": { + "@jest/globals": "^29.7.0", + "@types/jest": "^29.5.1", + "@types/node": "^22.10.2", + "eslint": "^9.24.0", + "eslint-config-codex": "^2.0.3", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "ts-jest": "^29.2.5", + "typescript": "^5.5.4" + } +} diff --git a/packages/tools/header/src/index.spec.ts b/packages/tools/header/src/index.spec.ts new file mode 100644 index 00000000..424575c2 --- /dev/null +++ b/packages/tools/header/src/index.spec.ts @@ -0,0 +1,217 @@ +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { KeyAddedEvent, KeyRemovedEvent, ToolType, ValueNodeChangedEvent } from '@editorjs/sdk'; +import type { EditorAPI } from '@editorjs/sdk'; +import type { DOMBlockToolAdapter } from '@editorjs/dom-adapters'; +import { Header } from './index.js'; +import type { HeaderData, HeaderConfig, HeadingLevel } from './index.js'; + +function createMockAdapter() { + const base = new EventTarget(); + const realAddEventListener = base.addEventListener.bind(base); + + return Object.assign(base, { + registerTextInputKey: jest.fn(), + registerValueKey: jest.fn(), + setInput: jest.fn(), + getBlockId: jest.fn<() => string>().mockReturnValue('test-block-id'), + getBlockIndex: jest.fn<() => number>().mockReturnValue(0), + addEventListener: jest.fn(realAddEventListener), + }); +} + +function createHeader( + levelInput: unknown, + configOverrides: Partial = {} +): InstanceType { + return new Header({ + adapter: mockAdapter as unknown as DOMBlockToolAdapter, + data: { level: levelInput } as unknown as HeaderData, + config: configOverrides as HeaderConfig, + api: {} as EditorAPI, + } as never); +} + +let mockAdapter: ReturnType; + +beforeEach(() => { + mockAdapter = createMockAdapter(); +}); + +describe('Header', () => { + describe('static fields', () => { + it('should have type set to Block and name set to header', () => { + expect(Header.type).toBe(ToolType.Block); + expect(Header.name).toBe('header'); + }); + + it('should have toolbox entries for levels 1, 2, and 3', () => { + const { toolbox } = Header.options; + expect(Array.isArray(toolbox)).toBe(true); + const entries = toolbox as unknown as Array<{ title: string; data: { level: number } }>; + expect(entries).toHaveLength(3); + expect(entries[0].data.level).toBe(1); + expect(entries[1].data.level).toBe(2); + expect(entries[2].data.level).toBe(3); + }); + + it('should have conversionConfig with import and export pointing to the text key', () => { + const { conversionConfig } = Header.options; + expect(conversionConfig).toEqual({ import: 'text', export: 'text' }); + }); + + it('should have canBeSplit set to false', () => { + expect(Header.options.canBeSplit).toBe(false); + }); + }); + + describe('constructor', () => { + it('should register text and level data nodes and subscribe to adapter events', () => { + createHeader(2); + + expect(mockAdapter.registerTextInputKey).toHaveBeenCalledWith('text', undefined); + expect(mockAdapter.registerValueKey).toHaveBeenCalledWith('level', 2); + expect(mockAdapter.addEventListener).toHaveBeenCalledWith( + 'adapter:updated', + expect.any(Function) + ); + }); + + describe('level normalisation via registerValueKey', () => { + it.each([1, 2, 3, 4, 5, 6] as const)( + 'should register level %i as-is when data.level is a valid integer', + (level) => { + createHeader(level); + expect(mockAdapter.registerValueKey).toHaveBeenCalledWith('level', level); + } + ); + + it.each([undefined, null, 'text', 0, 7, -1, 1.5])( + 'should register default level 2 when data.level is %p', + (level) => { + createHeader(level); + expect(mockAdapter.registerValueKey).toHaveBeenCalledWith('level', 2); + } + ); + + it('should use config.defaultLevel when raw level is invalid', () => { + createHeader(undefined, { defaultLevel: 4 }); + expect(mockAdapter.registerValueKey).toHaveBeenCalledWith('level', 4); + }); + + it('should fall back to 2 when both data.level and config.defaultLevel are invalid', () => { + createHeader(undefined, { defaultLevel: 99 as HeadingLevel }); + expect(mockAdapter.registerValueKey).toHaveBeenCalledWith('level', 2); + }); + }); + }); + + describe('render()', () => { + it('should return an HTMLElement', () => { + const header = createHeader(2); + expect(header.render()).toBeInstanceOf(HTMLElement); + }); + + it('should return the same element on subsequent calls', () => { + const header = createHeader(2); + expect(header.render()).toBe(header.render()); + }); + }); + + describe('#onUpdate — KeyAddedEvent text', () => { + it.each([1, 2, 3, 4, 5, 6] as const)( + 'should create h%i, call setInput, and append to wrapper when text key is added with level %i', + (level) => { + const header = createHeader(level); + const wrapper = header.render(); + + mockAdapter.dispatchEvent(new KeyAddedEvent('text')); + + const heading = wrapper.querySelector(`h${level}`) as HTMLElement; + expect(heading).not.toBeNull(); + expect(heading.contentEditable).toBe('true'); + expect(mockAdapter.setInput).toHaveBeenCalledWith('text', heading); + } + ); + + it('should not react to KeyAddedEvent for keys other than text', () => { + const header = createHeader(2); + header.render(); + + mockAdapter.dispatchEvent(new KeyAddedEvent('someOtherKey')); + + expect(mockAdapter.setInput).not.toHaveBeenCalled(); + }); + }); + + describe('#onUpdate — KeyRemovedEvent text', () => { + it('should call setInput with undefined and remove element from wrapper', () => { + const header = createHeader(2); + const wrapper = header.render(); + mockAdapter.dispatchEvent(new KeyAddedEvent('text')); + expect(wrapper.firstElementChild).not.toBeNull(); + + mockAdapter.setInput.mockClear(); + mockAdapter.dispatchEvent(new KeyRemovedEvent('text')); + + expect(mockAdapter.setInput).toHaveBeenCalledWith('text', undefined); + expect(wrapper.firstElementChild).toBeNull(); + }); + + it('should not react to KeyRemovedEvent for keys other than text', () => { + const header = createHeader(2); + header.render(); + mockAdapter.dispatchEvent(new KeyAddedEvent('text')); + mockAdapter.setInput.mockClear(); + + mockAdapter.dispatchEvent(new KeyRemovedEvent('someOtherKey')); + + expect(mockAdapter.setInput).not.toHaveBeenCalled(); + }); + }); + + describe('#onUpdate — ValueNodeChangedEvent level', () => { + function setupWithHeading(initialLevel: HeadingLevel): { + header: InstanceType; + wrapper: HTMLElement; + } { + const header = createHeader(initialLevel); + const wrapper = header.render(); + mockAdapter.dispatchEvent(new KeyAddedEvent('text')); + mockAdapter.setInput.mockClear(); + return { header, wrapper }; + } + + it.each<[HeadingLevel, HeadingLevel]>([[2, 1], [1, 6], [3, 4]])( + 'should replace h%i with h%i and call setInput with new element when level changes', + (from, to) => { + const { wrapper } = setupWithHeading(from); + + mockAdapter.dispatchEvent(new ValueNodeChangedEvent('level', to)); + + const heading = wrapper.querySelector(`h${to}`) as HTMLElement; + expect(heading).not.toBeNull(); + expect(mockAdapter.setInput).toHaveBeenCalledWith('text', heading); + } + ); + + it('should not recreate the element when the level value is identical', () => { + const { wrapper } = setupWithHeading(2); + const originalHeading = wrapper.querySelector('h2'); + + mockAdapter.dispatchEvent(new ValueNodeChangedEvent('level', 2)); + + expect(wrapper.querySelector('h2')).toBe(originalHeading); + expect(mockAdapter.setInput).not.toHaveBeenCalled(); + }); + + it('should not react to ValueNodeChangedEvent for keys other than level', () => { + const { wrapper } = setupWithHeading(2); + const originalHeading = wrapper.querySelector('h2'); + + mockAdapter.dispatchEvent(new ValueNodeChangedEvent('someOtherKey', 'value')); + + expect(wrapper.querySelector('h2')).toBe(originalHeading); + expect(mockAdapter.setInput).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/tools/header/src/index.ts b/packages/tools/header/src/index.ts new file mode 100644 index 00000000..a060920f --- /dev/null +++ b/packages/tools/header/src/index.ts @@ -0,0 +1,142 @@ +import type { ToolConfig } from '@editorjs/editorjs'; +import type { TextNodeSerialized } from '@editorjs/model'; +import type { + BlockTool, + BlockToolConstructor, + BlockToolConstructorOptions, + BlockToolData, +} from '@editorjs/sdk'; +import { KeyAddedEvent, KeyRemovedEvent, ToolType, ValueNodeChangedEvent } from '@editorjs/sdk'; +import type { DOMBlockToolAdapter } from '@editorjs/dom-adapters'; +import { IconH1, IconH2, IconH3 } from '@codexteam/icons'; + +export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; + +export type HeaderData = BlockToolData<{ + text: TextNodeSerialized; + level: HeadingLevel; +}>; + +export type HeaderConfig = ToolConfig<{ + placeholder?: string; + defaultLevel?: HeadingLevel; + levels?: HeadingLevel[]; +}>; + +export class Header implements BlockTool { + public static type = ToolType.Block as const; + public static name = 'header'; + public static readonly options = { + toolbox: [ + { title: 'Heading 1', icon: IconH1, data: { level: 1 as HeadingLevel } }, + { title: 'Heading 2', icon: IconH2, data: { level: 2 as HeadingLevel } }, + { title: 'Heading 3', icon: IconH3, data: { level: 3 as HeadingLevel } }, + ], + conversionConfig: { + import: 'text', + export: 'text', + }, + canBeSplit: false as const, + }; + + static readonly #defaultLevel: HeadingLevel = 2; + static readonly #minLevel = 1; + static readonly #maxLevel = 6; + + #adapter: DOMBlockToolAdapter; + #config: HeaderConfig; + #currentLevel: HeadingLevel; + #wrapper: HTMLDivElement | undefined; + #headingEl: HTMLElement | undefined; + + constructor({ adapter, data, config }: BlockToolConstructorOptions) { + this.#adapter = adapter; + this.#config = config ?? {} as HeaderConfig; + + const level = this.#normalizeLevel(data?.level); + this.#currentLevel = level; + + adapter.addEventListener('adapter:updated', this.#onUpdate); + adapter.registerTextInputKey('text', data?.text); + adapter.registerValueKey('level', level); + } + + public render(): HTMLElement { + if (this.#wrapper === undefined) { + this.#wrapper = document.createElement('div'); + } + return this.#wrapper; + } + + #normalizeLevel(raw: unknown): HeadingLevel { + if ( + typeof raw === 'number' && + Number.isInteger(raw) && + raw >= Header.#minLevel && + raw <= Header.#maxLevel + ) { + return raw as HeadingLevel; + } + const fallback = this.#config.defaultLevel; + if ( + fallback !== undefined && + Number.isInteger(fallback) && + fallback >= Header.#minLevel && + fallback <= Header.#maxLevel + ) { + return fallback; + } + return Header.#defaultLevel; + } + + #createHeadingEl(level: HeadingLevel): HTMLElement { + const el = document.createElement(`h${level}`); + el.style.outline = 'none'; + el.style.whiteSpace = 'pre-wrap'; + el.style.margin = '0'; + el.style.minHeight = '1em'; + el.contentEditable = 'true'; + return el; + } + + #swapHeadingTag(level: HeadingLevel): void { + if (this.#headingEl === undefined) { + return; + } + const newEl = this.#createHeadingEl(level); + this.#headingEl.replaceWith(newEl); + this.#headingEl = newEl; + this.#adapter.setInput('text', newEl); + } + + #onUpdate = (event: Event): void => { + if (event instanceof KeyAddedEvent) { + if (event.detail.key !== 'text') { + return; + } + const el = this.#createHeadingEl(this.#currentLevel); + this.#headingEl = el; + this.#wrapper?.append(el); + this.#adapter.setInput('text', el); + } else if (event instanceof KeyRemovedEvent) { + if (event.detail.key !== 'text') { + return; + } + this.#adapter.setInput('text', undefined); + this.#headingEl?.remove(); + this.#headingEl = undefined; + } else if (event instanceof ValueNodeChangedEvent) { + if (event.detail.key !== 'level') { + return; + } + const newLevel = this.#normalizeLevel(event.detail.value); + if (newLevel === this.#currentLevel) { + return; + } + this.#currentLevel = newLevel; + this.#swapHeadingTag(newLevel); + } + }; +} + +Header satisfies BlockToolConstructor; diff --git a/packages/tools/header/tsconfig.build.json b/packages/tools/header/tsconfig.build.json new file mode 100644 index 00000000..0d25e897 --- /dev/null +++ b/packages/tools/header/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "node_modules/**/*", + "dist/**/*", + "**/*.spec.ts" + ], + "references": [ + { "path": "../../sdk/tsconfig.build.json" }, + { "path": "../../dom-adapters/tsconfig.build.json" } + ] +} diff --git a/packages/tools/header/tsconfig.eslint.json b/packages/tools/header/tsconfig.eslint.json new file mode 100644 index 00000000..00ef0c7f --- /dev/null +++ b/packages/tools/header/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "types": ["node", "jest"] + }, + "extends": "./tsconfig.json", + "include": [ + "src/**/*", + "eslint.config.mjs", + "**/*.spec.ts", + "jest.config.ts" + ], + "exclude": ["dist/**/*", "node_modules/**/*"] +} diff --git a/packages/tools/header/tsconfig.json b/packages/tools/header/tsconfig.json new file mode 100644 index 00000000..c7cd87b1 --- /dev/null +++ b/packages/tools/header/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "composite": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "experimentalDecorators": true, + "types": ["jest"], + "rootDir": "src", + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "preserveConstEnums": true, + }, + "include": ["src/**/*"], + "exclude": ["node_modules/**/*", "dist/**/*"], + "references": [ + { "path": "../../sdk/tsconfig.build.json" }, + { "path": "../../dom-adapters/tsconfig.build.json" } + ] +} diff --git a/packages/ui/src/Toolbox/Toolbox.ts b/packages/ui/src/Toolbox/Toolbox.ts index d3df296a..c13c44b0 100644 --- a/packages/ui/src/Toolbox/Toolbox.ts +++ b/packages/ui/src/Toolbox/Toolbox.ts @@ -14,7 +14,6 @@ import { import { PopoverDesktop, PopoverEvent } from '@editorjs/ui-kit'; import type { BlockSelectedUIEvent } from '../Blocks/events/index.js'; import { ToolboxRenderedUIEvent, ToolboxClosedUIEvent, ToolboxOpenedUIEvent } from './events/index.js'; -import type { ToolboxOptionsEntry } from './ToolboxConfigEntry.js'; /** * UI module responsible for rendering the toolbox @@ -132,27 +131,31 @@ export class ToolboxUI implements EditorjsPlugin { } /** - * Adds tool button in the toolbox + * Adds tool button(s) in the toolbox * @param tool - Block tool to add to the toolbox */ public addTool(tool: BlockToolFacade): void { - const toolbox = (tool.options.toolbox ?? {}) as ToolboxOptionsEntry; + const entries = tool.toolbox; - this.#popover.addItem( - { + if (entries === undefined) { + return; + } + + for (const entry of entries) { + this.#popover.addItem({ title: tool.name, - ...toolbox, + ...entry, closeOnActivate: true, onActivate: () => { void this.#api.blocks.insert({ type: tool.name, - data: toolbox.data ?? {}, + data: entry.data ?? {}, index: this.#selectedBlockIndex === -1 ? undefined : this.#selectedBlockIndex + 1, focus: true, }); }, - } - ); + }); + } } /** diff --git a/yarn.lock b/yarn.lock index 9c6c0d57..2fa7aa47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2262,6 +2262,7 @@ __metadata: "@editorjs/collaboration-manager": "workspace:^" "@editorjs/core": "workspace:^" "@editorjs/dom-adapters": "workspace:^" + "@editorjs/header": "workspace:^" "@editorjs/model": "workspace:^" "@editorjs/ui": "workspace:*" "@types/eslint": "npm:^8" @@ -2332,6 +2333,27 @@ __metadata: languageName: node linkType: hard +"@editorjs/header@workspace:^, @editorjs/header@workspace:packages/tools/header": + version: 0.0.0-use.local + resolution: "@editorjs/header@workspace:packages/tools/header" + dependencies: + "@codexteam/icons": "npm:^0.3.3" + "@editorjs/dom-adapters": "workspace:^" + "@editorjs/editorjs": "npm:^2.30.8" + "@editorjs/model": "workspace:^" + "@editorjs/sdk": "workspace:^" + "@jest/globals": "npm:^29.7.0" + "@types/jest": "npm:^29.5.1" + "@types/node": "npm:^22.10.2" + eslint: "npm:^9.24.0" + eslint-config-codex: "npm:^2.0.3" + jest: "npm:^29.7.0" + jest-environment-jsdom: "npm:^29.7.0" + ts-jest: "npm:^29.2.5" + typescript: "npm:^5.5.4" + languageName: unknown + linkType: soft + "@editorjs/helpers@npm:^1.2.0": version: 1.2.0 resolution: "@editorjs/helpers@npm:1.2.0" @@ -3960,6 +3982,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:2": + version: 2.0.1 + resolution: "@tootallnate/once@npm:2.0.1" + checksum: 487b59b5adb8458dc13394a5aae997bf9705c51fa1e2396c50cd967019d06b273faba3c4d9e7895a996b9e9b055f1c55e53d822e54b3e9c298bcb4f6967cd0d5 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.11 resolution: "@tsconfig/node10@npm:1.0.11" @@ -4116,6 +4145,17 @@ __metadata: languageName: node linkType: hard +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "npm:*" + "@types/tough-cookie": "npm:*" + parse5: "npm:^7.0.0" + checksum: 15fbb9a0bfb4a5845cf6e795f2fd12400aacfca53b8c7e5bca4a3e5e8fa8629f676327964d64258aefb127d2d8a2be86dad46359efbfca0e8c9c2b790e7f8a88 + languageName: node + linkType: hard + "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -4165,6 +4205,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 01fd82efc8202670865928629697b62fe9bf0c0dcbc5b1c115831caeb073a2c0abb871ff393d7df1ae94ea41e256cb87d2a5a91fd03cdb1b0b4384e08d4ee482 + languageName: node + linkType: hard + "@types/web-bluetooth@npm:^0.0.20": version: 0.0.20 resolution: "@types/web-bluetooth@npm:0.0.20" @@ -4578,6 +4625,13 @@ __metadata: languageName: node linkType: hard +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: ebe95d7278999e605823fc515a3b05d689bc72e7f825536e73c95ebf621636874c6de1b749b3c4bf866b96ccd4b3a2802efa313d0e45ad51a413c8c73247db20 + languageName: node + linkType: hard + "abbrev@npm:^3.0.0": version: 3.0.0 resolution: "abbrev@npm:3.0.0" @@ -4585,6 +4639,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: "npm:^8.1.0" + acorn-walk: "npm:^8.0.2" + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -4594,6 +4658,15 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.0.2": + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" + dependencies: + acorn: "npm:^8.11.0" + checksum: f52a158a1c1f00c82702c7eb9b8ae8aad79748a7689241dcc2d797dce680f1dcb15c78f312f687eeacdfb3a4cac4b87d04af470f0201bd56c6661fca6f94b195 + languageName: node + linkType: hard + "acorn-walk@npm:^8.1.1": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" @@ -4603,6 +4676,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.1.0, acorn@npm:^8.8.1": + version: 8.17.0 + resolution: "acorn@npm:8.17.0" + bin: + acorn: bin/acorn + checksum: 2eea1588075124df569b15995423204055c5575ad992283025dddfcb557a0340de7d75cc1bc25dca8df148c60c4222e576e0e519965f0ec7f86f6085c8428824 + languageName: node + linkType: hard + "acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": version: 8.14.1 resolution: "acorn@npm:8.14.1" @@ -4612,6 +4694,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 21fb903e0917e5cb16591b4d0ef6a028a54b83ac30cd1fca58dece3d4e0990512a8723f9f83130d88a41e2af8b1f7be1386fda3ea2d181bb1a62155e75e95e23 + languageName: node + linkType: hard + "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": version: 7.1.3 resolution: "agent-base@npm:7.1.3" @@ -4867,6 +4958,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 3ce727cbc78f69d6a4722517a58ee926c8c21083633b1d3fdf66fd688f6c127a53a592141bd4866f9b63240a86e9d8e974b13919450bd17fa33c2d22c4558ad8 + languageName: node + linkType: hard + "autoprefixer@npm:^10.4.19": version: 10.4.21 resolution: "autoprefixer@npm:10.4.21" @@ -5527,6 +5625,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 2e969e637d05d09fa50b02d74c83a1186f6914aae89e6653b62595cc75a221464f884f55f231b8f4df7a49537fba60bdc0427acd2bf324c09a1dbb84837e36e4 + languageName: node + linkType: hard + "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -5807,6 +5914,29 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: b502a315b1ce020a692036cc38cb36afa44157219b80deadfa040ab800aa9321fcfbecf02fd2e6ec87db169715e27978b4ab3701f916461e9cf7808899f23b54 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 49eacc88077555e419646c0ea84ddc73c97e3a346ad7cb95e22f9413a9722d8964b91d781ce21d378bd5ae058af9a745402383fa4e35e9cdfd19654b63f892a9 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: "npm:~0.3.6" + checksum: 46f7f05a153446c4018b0454ee1464b50f606cb1803c90d203524834b7438eb52f3b173ba0891c618f380ced34ee12020675dc0052a7f1be755fe4ebc27ee977 + languageName: node + linkType: hard + "csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -5814,6 +5944,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: "npm:^2.0.6" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.2": version: 1.0.2 resolution: "data-view-buffer@npm:1.0.2" @@ -5903,6 +6044,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.2": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: c0d45842d47c311d11b38ce7ccc911121953d4df3ebb1465d92b31970eb4f6738a065426a06094af59bee4b0d64e42e7c8984abd57b6767c64ea90cf90bb4a69 + languageName: node + linkType: hard + "dedent@npm:^1.0.0": version: 1.5.3 resolution: "dedent@npm:1.5.3" @@ -5960,6 +6108,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -6024,6 +6179,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: "npm:^7.0.0" + checksum: 4ed443227d2871d76c58d852b2e93c68e0443815b2741348f20881bedee8c1ad4f9bfc5d30c7dec433cd026b57da63407c010260b1682fef4c8847e7181ea43f + languageName: node + linkType: hard + "domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": version: 4.3.1 resolution: "domhandler@npm:4.3.1" @@ -6155,6 +6319,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -6484,6 +6655,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 47719a65b2888b4586e3fa93769068b275961c13089e90d5d01a96a6e8e95871b1c3893576814c8fbf08a4a31a496f37e7b2c937cf231270f4d81de012832c7c + languageName: node + linkType: hard + "eslint-compat-utils@npm:^0.5.1": version: 0.5.1 resolution: "eslint-compat-utils@npm:0.5.1" @@ -6848,7 +7037,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -7192,6 +7381,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: de6614c8537c92fa5fa3ee7e827758f98f5a9c033f348b7de81855ef36e5cb867e75d9f405d9483ab8d724a4a20d4e79926a299fa8dbba38f530eb659f0884e4 + languageName: node + linkType: hard + "fraction.js@npm:^4.3.7": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -7571,6 +7773,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 13823863ae48161068b4c51606a3128451c66f14545a5169d667fe9fca168dcd38c27570c7a299e32ef844b8da3d55def7fe88602f8970d4311fb543ee88001a + languageName: node + linkType: hard + "he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -7580,6 +7791,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: "npm:^2.0.0" + checksum: 707a812ec2acaf8bb5614c8618dc81e2fb6b4399d03e95ff18b65679989a072f4e919b9bef472039301a1bbfba64063ba4c79ea6e851c653ac9db80dbefe8fe5 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -7594,6 +7814,17 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: 5ee19423bc3e0fd5f23ce991b0755699ad2a46a440ce9cec99e8126bb98448ad3479d2c0ea54be5519db5b19a4ffaa69616bac01540db18506dd4dac3dc418f0 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -7604,6 +7835,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: f0dce7bdcac5e8eaa0be3c7368bb8836ed010fb5b6349ffb412b172a203efe8f807d9a6681319105ea1b6901e1972c7b5ea899672a7b9aad58309f766dcbe0df + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" @@ -7628,6 +7869,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f + languageName: node + linkType: hard + "iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -7637,15 +7887,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f - languageName: node - linkType: hard - "icss-replace-symbols@npm:^1.1.0": version: 1.1.0 resolution: "icss-replace-symbols@npm:1.1.0" @@ -8006,6 +8247,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -8361,6 +8609,27 @@ __metadata: languageName: node linkType: hard +"jest-environment-jsdom@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/jsdom": "npm:^20.0.0" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jsdom: "npm:^20.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 23bbfc9bca914baef4b654f7983175a4d49b0f515a5094ebcb8f819f28ec186f53c0ba06af1855eac04bab1457f4ea79dae05f70052cf899863e8096daa6e0f5 + languageName: node + linkType: hard + "jest-environment-node@npm:^29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" @@ -8770,6 +9039,45 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: "npm:^2.0.6" + acorn: "npm:^8.8.1" + acorn-globals: "npm:^7.0.0" + cssom: "npm:^0.5.0" + cssstyle: "npm:^2.3.0" + data-urls: "npm:^3.0.2" + decimal.js: "npm:^10.4.2" + domexception: "npm:^4.0.0" + escodegen: "npm:^2.0.0" + form-data: "npm:^4.0.0" + html-encoding-sniffer: "npm:^3.0.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.1" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.2" + parse5: "npm:^7.1.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^4.1.2" + w3c-xmlserializer: "npm:^4.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^2.0.0" + whatwg-mimetype: "npm:^3.0.0" + whatwg-url: "npm:^11.0.0" + ws: "npm:^8.11.0" + xml-name-validator: "npm:^4.0.0" + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: a4cdcff5b07eed87da90b146b82936321533b5efe8124492acf7160ebd5b9cf2b3c2435683592bf1cffb479615245756efb6c173effc1906f845a86ed22af985 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -9136,6 +9444,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.35": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 89aa9651b67644035de2784a6e665fc685d79aba61857e02b9c8758da874a754aed4a9aced9265f5ed1171fd934331e5516b84a7f0218031b6fa0270eca1e51a + languageName: node + linkType: hard + "mimic-fn@npm:^1.0.0": version: 1.2.0 resolution: "mimic-fn@npm:1.2.0" @@ -9484,6 +9808,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.2": + version: 2.2.24 + resolution: "nwsapi@npm:2.2.24" + checksum: 08795ffcbc213cbc41b72e5c3b357d9db59e27ff8d88808af015ba7689041954ca1b5d6bfd7aa4d7df64338b9b76f853ca7154ec3de403c2104c1a39ac0ed225 + languageName: node + linkType: hard + "object-inspect@npm:^1.13.3": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -9746,6 +10077,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: "npm:^6.0.0" + checksum: b0e48be20b820c655b138b86fa6fb3a790de6c891aa2aba536524f8027b4dca4fe538f11a0e5cf2f6f847d120dbb9e4822dcaeb933ff1e10850a2ef0154d1d88 + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" @@ -10757,7 +11097,16 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"psl@npm:^1.1.33": + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 5e7467eb5196eb7900d156783d12907d445c0122f76c73203ce96b148a6ccf8c5450cc805887ffada38ff92d634afcf33720c24053cb01d5b6598d1c913c5caf + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -10780,6 +11129,13 @@ __metadata: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 46ab16f252fd892fc29d6af60966d338cdfeea68a231e9457631ffd22d67cec1e00141e0a5236a2eb16c0d7d74175d9ec1d6f963660c6f2b1c2fc85b194c5680 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -10911,6 +11267,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 878880ee78ccdce372784f62f52a272048e2d0827c29ae31e7f99da18b62a2b9463ea03a75f277352f4697c100183debb0532371ad515a2d49d4bfe596dd4c20 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -11298,6 +11661,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 97b50daf6ca3a153e89842efa18a862e446248296622b7473c169c84c823ee8a16e4a43bac2f73f11fc8cb9168c73fbb0d73340f26552bac17970e9052367aa9 + languageName: node + linkType: hard + "semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -11874,6 +12246,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: c09a00aadf279d47d0c5c46ca3b6b2fbaeb45f0a184976d599637d412d3a70bbdc043ff33effe1206dea0e36e0ad226cb957112e7ce9a4bf2daedf7fa4f85c53 + languageName: node + linkType: hard + "synckit@npm:^0.9.1": version: 0.9.2 resolution: "synckit@npm:0.9.2" @@ -11965,6 +12344,27 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^4.1.2": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" + dependencies: + psl: "npm:^1.1.33" + punycode: "npm:^2.1.1" + universalify: "npm:^0.2.0" + url-parse: "npm:^1.5.3" + checksum: 75663f4e2cd085f16af0b217e4218772adf0617fb3227171102618a54ce0187a164e505d61f773ed7d65988f8ff8a8f935d381f87da981752c1171b076b4afac + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: "npm:^2.1.1" + checksum: b09a15886cbfaee419a3469081223489051ce9dca3374dd9500d2378adedbee84a3c73f83bfdd6bb13d53657753fc0d4e20a46bfcd3f1b9057ef528426ad7ce4 + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2, tree-kill@npm:~1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -12350,6 +12750,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.1.1": version: 1.1.3 resolution: "update-browserslist-db@npm:1.1.3" @@ -12387,6 +12794,16 @@ __metadata: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: c9e96bc8c5b34e9f05ddfeffc12f6aadecbb0d971b3cc26015b58d5b44676a99f50d5aeb1e5c9e61fa4d49961ae3ab1ae997369ed44da51b2f5ac010d188e6ad + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -12629,6 +13046,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: "npm:^4.0.0" + checksum: 9a00c412b5496f4f040842c9520bc0aaec6e0c015d06412a91a723cd7d84ea605ab903965f546b4ecdb3eae267f5145ba08565222b1d6cb443ee488cda9a0aee + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -12654,6 +13080,39 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 4c4f65472c010eddbe648c11b977d048dd96956a625f7f8b9d64e1b30c3c1f23ea1acfd654648426ce5c743c2108a5a757c0592f02902cf7367adb7d14e67721 + languageName: node + linkType: hard + +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 162d712d88fd134a4fe587e53302da812eb4215a1baa4c394dfd86eff31d0a079ff932c05233857997de07481093358d6e7587997358f49b8a580a777be22089 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 96f9f628c663c2ae05412c185ca81b3df54bcb921ab52fe9ebc0081c1720f25d770665401eb2338ab7f48c71568133845638e18a81ed52ab5d4dcef7d22b40ef + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: "npm:^3.0.0" + webidl-conversions: "npm:^7.0.0" + checksum: dfcd51c6f4bfb54685528fb10927f3fd3d7c809b5671beef4a8cdd7b1408a7abf3343a35bc71dab83a1424f1c1e92cc2700d7930d95d231df0fac361de0c7648 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" @@ -12804,6 +13263,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.11.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 088411956432c8f876158409d5a285cb9ad1382f593391f51d3a599bd0a5b277f876609ebd00fc3596321c4a4c9064d6fffe1ebad960e8ea7fd9ae25324f35c2 + languageName: node + linkType: hard + "ws@npm:^8.18.1": version: 8.18.1 resolution: "ws@npm:8.18.1" @@ -12826,6 +13300,13 @@ __metadata: languageName: node linkType: hard +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 4ad5924974efd004a47cce6acf5c0269aee0e62f9a805a426db3337af7bcbd331099df174b024ace4fb18971b8a56de386d2e73a1c4b020e3abd63a4a9b917f1 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8"