From 59b2726351185fee14e49c9c573a397fad4bcc46 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 30 Jul 2024 10:14:46 -0700 Subject: [PATCH 01/23] Add nevent extension separate from matcher extension --- examples/react/src/App.tsx | 3 +- .../react/src/extensions/NEventExtension.ts | 26 -------- src/extensions/NEventExtension.ts | 60 +++++++++++++++++++ src/index.ts | 1 + .../NostrMatcherPlugin/NostrMatcherPlugin.ts | 7 +-- .../NostrMatcherPlugin/nip27.references.ts | 35 +---------- 6 files changed, 66 insertions(+), 66 deletions(-) delete mode 100644 examples/react/src/extensions/NEventExtension.ts create mode 100644 src/extensions/NEventExtension.ts diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index 12cf13c..380e85b 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -4,7 +4,7 @@ import { Markdown as MarkdownExtension } from 'tiptap-markdown' import type { AnyExtension } from '@tiptap/react' import { EditorContent, ReactNodeViewRenderer, useEditor } from '@tiptap/react' import { StarterKit } from '@tiptap/starter-kit' -import { NostrMatcherExtension } from 'nostr-editor' +import { NostrMatcherExtension, NEventExtension } from 'nostr-editor' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import ReactJsonView from 'react-json-view' import { Image } from './components/Image' @@ -15,7 +15,6 @@ import { Tweet } from './components/Tweet' import { Video } from './components/Video' import { LinkExtension } from './extensions/LinkExtension' import { NAddrExtension } from './extensions/NAddressExtension' -import { NEventExtension } from './extensions/NEventExtension' import { NProfileExtension } from './extensions/NProfileExtension' import { TagExtension } from './extensions/TagExtension' import { TweetExtension } from './extensions/TweetExtension' diff --git a/examples/react/src/extensions/NEventExtension.ts b/examples/react/src/extensions/NEventExtension.ts deleted file mode 100644 index fc5941f..0000000 --- a/examples/react/src/extensions/NEventExtension.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Node } from '@tiptap/core' - -export const NEventExtension = Node.create({ - name: 'nevent', - - group: 'block', - - atom: true, - - selectable: true, - - content: 'text*', - - addAttributes() { - return { - id: { default: null }, - kind: { default: null }, - author: { default: null }, - relays: { default: null }, - } - }, - - renderHTML() { - return ['div', {}, 0] - }, -}) diff --git a/src/extensions/NEventExtension.ts b/src/extensions/NEventExtension.ts new file mode 100644 index 0000000..d9a516a --- /dev/null +++ b/src/extensions/NEventExtension.ts @@ -0,0 +1,60 @@ +import { nip19 } from 'nostr-tools' +import type { EventPointer } from 'nostr-tools/nip19' +import { Node, nodePasteRule } from '@tiptap/core' + +export const NEVENT_REGEX = /(nostr:)?(nevent1[0-9a-z]+)/g + +export const NEventExtension = Node.create({ + name: 'nevent', + + group: 'block', + + atom: true, + + selectable: true, + + content: 'text*', + + addAttributes() { + return { + id: { default: null }, + kind: { default: null }, + author: { default: null }, + relays: { default: null }, + } + }, + + renderHTML() { + return ['div', {}, 0] + }, + + addPasteRules() { + return [ + nodePasteRule({ + type: this.type, + getAttributes: match => match.data, + find: text => { + const matches = [] + + for (const match of text.matchAll(NEVENT_REGEX)) { + try { + const data = nip19.decode(match[2]).data as EventPointer + + matches.push({ + index: match.index, + replaceWith: match[2], + text: match[0], + match, + data, + }) + } catch (e) { + continue + } + } + + return matches + }, + }), + ] + }, +}) diff --git a/src/index.ts b/src/index.ts index 5f8c1dd..ec53d24 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export { NostrMatcherExtension } from './extensions/NostrMatcherExtension' +export { NEventExtension } from './extensions/NEventExtension' export * from './types' diff --git a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts index 939a302..1a07e2c 100644 --- a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts +++ b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts @@ -134,7 +134,7 @@ export class NostrMatcherPlugin { return } text += node.textContent - if (node.type.name === 'nprofile' || node.type.name === 'nevent') { + if (node.type.name === 'nprofile') { text += node.attrs.text } }) @@ -180,11 +180,6 @@ export class NostrMatcherPlugin { this.replaceWith(tr, from, to, nodes.nprofile, ref.profile, text) break } - case 'note': - case 'nevent': { - this.replaceWith(tr, from, to, nodes.nevent, ref.event, text) - break - } case 'naddr': { this.replaceWith(tr, from, to, nodes.naddr, ref.address, text) break diff --git a/src/plugins/NostrMatcherPlugin/nip27.references.ts b/src/plugins/NostrMatcherPlugin/nip27.references.ts index 343dd9e..7003520 100644 --- a/src/plugins/NostrMatcherPlugin/nip27.references.ts +++ b/src/plugins/NostrMatcherPlugin/nip27.references.ts @@ -1,7 +1,7 @@ // Adapted from nostr-tools/src/references.ts import type { Event as NostrEvent } from 'nostr-tools' import { nip19 } from 'nostr-tools' -import type { AddressPointer, EventPointer, ProfilePointer } from 'nostr-tools/nip19' +import type { AddressPointer, ProfilePointer } from 'nostr-tools/nip19' type BaseReference = { index: number @@ -9,13 +9,12 @@ type BaseReference = { author?: string } -export type EventReference = BaseReference & { prefix: 'nevent' | 'note'; event: EventPointer } export type ProfileReference = BaseReference & { prefix: 'nprofile' | 'npub'; profile: ProfilePointer } type AddressReference = BaseReference & { prefix: 'naddr'; address: AddressPointer } -export type NostrReference = ProfileReference | EventReference | AddressReference +export type NostrReference = ProfileReference | AddressReference -const mentionRegex = /\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g +const mentionRegex = /\bnostr:((npub|naddr|nprofile)1\w+)\b|#\[(\d+)\]/g const { decode } = nip19 @@ -48,25 +47,6 @@ export function parseReferences(evt: Partial): NostrReference[] { }) break } - case 'note': { - references.push({ - index, - prefix: 'note', - text: ref[0], - event: { id: data as string, relays: [] }, - }) - break - } - case 'nevent': { - references.push({ - index, - prefix: 'nevent', - text: ref[0], - event: data as EventPointer, - author: data.author, - }) - break - } case 'naddr': { references.push({ index, @@ -98,15 +78,6 @@ export function parseReferences(evt: Partial): NostrReference[] { }) break } - case 'e': { - references.push({ - index, - prefix: 'nevent', - text: ref[0], - event: { id: tag[1], relays: tag[2] ? [tag[2]] : [] }, - }) - break - } case 'a': { try { const [kind, pubkey, identifier] = tag[1].split(':') From 91b8a7cfedc8228e5186d3bf96dd205401899007 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 18:28:22 +0200 Subject: [PATCH 02/23] Added proper markdown serialization to the extensions --- .../react/src/extensions/NAddressExtension.ts | 15 ++++++++++ .../react/src/extensions/NEventExtension.ts | 17 ++++++++++- .../react/src/extensions/NProfileExtension.ts | 29 ++++++++++++++----- examples/react/src/extensions/TagExtension.ts | 14 +++++++++ .../react/src/extensions/TweetExtension.ts | 19 ++++++++++++ .../extensions/NAddressExtension.ts | 15 ++++++++++ .../extensions/NEventExtension.ts | 19 +++++++++++- .../extensions/NProfileExtension.ts | 25 +++++++++++++--- .../testExtensions/extensions/TagExtension.ts | 20 ++++++++++++- 9 files changed, 158 insertions(+), 15 deletions(-) diff --git a/examples/react/src/extensions/NAddressExtension.ts b/examples/react/src/extensions/NAddressExtension.ts index 5dd81d9..974eb28 100644 --- a/examples/react/src/extensions/NAddressExtension.ts +++ b/examples/react/src/extensions/NAddressExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { MarkdownSerializerState } from 'prosemirror-markdown' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' export const NAddrExtension = Node.create({ name: 'naddr', @@ -7,6 +9,8 @@ export const NAddrExtension = Node.create({ atom: true, + isolating: true, + content: 'text*', addAttributes() { @@ -18,6 +22,17 @@ export const NAddrExtension = Node.create({ } }, + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + renderHTML() { return ['div', {}, 0] }, diff --git a/examples/react/src/extensions/NEventExtension.ts b/examples/react/src/extensions/NEventExtension.ts index fc5941f..c69f001 100644 --- a/examples/react/src/extensions/NEventExtension.ts +++ b/examples/react/src/extensions/NEventExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import type { MarkdownSerializerState } from 'prosemirror-markdown' export const NEventExtension = Node.create({ name: 'nevent', @@ -7,9 +9,22 @@ export const NEventExtension = Node.create({ atom: true, + isolating: true, + selectable: true, - content: 'text*', + content: 'text?', + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, addAttributes() { return { diff --git a/examples/react/src/extensions/NProfileExtension.ts b/examples/react/src/extensions/NProfileExtension.ts index ef02076..81bd26c 100644 --- a/examples/react/src/extensions/NProfileExtension.ts +++ b/examples/react/src/extensions/NProfileExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { MarkdownSerializerState } from 'prosemirror-markdown' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' export const NProfileExtension = Node.create({ name: 'nprofile', @@ -9,18 +11,29 @@ export const NProfileExtension = Node.create({ group: 'inline', - renderText(p) { - return p.node.textContent - }, - - renderHTML(p) { - return ['span', { ...p.node.attrs }, 'mention'] - }, - addAttributes() { return { pubkey: { default: null }, relays: { default: null }, } }, + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + + renderText(p) { + return p.node.textContent + }, + + renderHTML(p) { + return ['span', { ...p.node.attrs }, '@'] + }, }) diff --git a/examples/react/src/extensions/TagExtension.ts b/examples/react/src/extensions/TagExtension.ts index 002be00..6e41e2a 100644 --- a/examples/react/src/extensions/TagExtension.ts +++ b/examples/react/src/extensions/TagExtension.ts @@ -15,6 +15,20 @@ export const TagExtension = Mark.create({ group: 'inline', + addStorage() { + return { + markdown: { + serialize: { + open: '', + close: '', + mixable: false, + expelEnclosingWhitespace: true, + }, + parse: {}, + }, + } + }, + renderHTML(p) { return ['a', { ...p.mark.attrs }, 0] }, diff --git a/examples/react/src/extensions/TweetExtension.ts b/examples/react/src/extensions/TweetExtension.ts index b159d20..fc55f44 100644 --- a/examples/react/src/extensions/TweetExtension.ts +++ b/examples/react/src/extensions/TweetExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import type { MarkdownSerializerState } from 'prosemirror-markdown' export const TweetExtension = Node.create({ name: 'tweet', @@ -7,12 +9,29 @@ export const TweetExtension = Node.create({ atom: true, + isolating: true, + + selectable: true, + + content: 'text*', + addAttributes() { return { src: { default: null }, } }, + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + renderHTML() { return ['div', {}, 0] }, diff --git a/src/__tests__/testExtensions/extensions/NAddressExtension.ts b/src/__tests__/testExtensions/extensions/NAddressExtension.ts index 5dd81d9..974eb28 100644 --- a/src/__tests__/testExtensions/extensions/NAddressExtension.ts +++ b/src/__tests__/testExtensions/extensions/NAddressExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { MarkdownSerializerState } from 'prosemirror-markdown' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' export const NAddrExtension = Node.create({ name: 'naddr', @@ -7,6 +9,8 @@ export const NAddrExtension = Node.create({ atom: true, + isolating: true, + content: 'text*', addAttributes() { @@ -18,6 +22,17 @@ export const NAddrExtension = Node.create({ } }, + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + renderHTML() { return ['div', {}, 0] }, diff --git a/src/__tests__/testExtensions/extensions/NEventExtension.ts b/src/__tests__/testExtensions/extensions/NEventExtension.ts index bc5806a..c69f001 100644 --- a/src/__tests__/testExtensions/extensions/NEventExtension.ts +++ b/src/__tests__/testExtensions/extensions/NEventExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import type { MarkdownSerializerState } from 'prosemirror-markdown' export const NEventExtension = Node.create({ name: 'nevent', @@ -7,7 +9,22 @@ export const NEventExtension = Node.create({ atom: true, - content: 'text*', + isolating: true, + + selectable: true, + + content: 'text?', + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, addAttributes() { return { diff --git a/src/__tests__/testExtensions/extensions/NProfileExtension.ts b/src/__tests__/testExtensions/extensions/NProfileExtension.ts index 8e850f1..cfa5301 100644 --- a/src/__tests__/testExtensions/extensions/NProfileExtension.ts +++ b/src/__tests__/testExtensions/extensions/NProfileExtension.ts @@ -1,4 +1,6 @@ import { Node } from '@tiptap/core' +import type { MarkdownSerializerState } from 'prosemirror-markdown' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' export const NProfileExtension = Node.create({ name: 'nprofile', @@ -11,14 +13,29 @@ export const NProfileExtension = Node.create({ content: 'text?', - renderHTML(p) { - return ['span', p.node.attrs, '@'] - }, - addAttributes() { return { pubkey: { default: null }, relays: { default: null }, } }, + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + + renderText(p) { + return p.node.textContent + }, + + renderHTML(p) { + return ['span', { ...p.node.attrs }, '@'] + }, }) diff --git a/src/__tests__/testExtensions/extensions/TagExtension.ts b/src/__tests__/testExtensions/extensions/TagExtension.ts index 84a846e..6e41e2a 100644 --- a/src/__tests__/testExtensions/extensions/TagExtension.ts +++ b/src/__tests__/testExtensions/extensions/TagExtension.ts @@ -1,5 +1,9 @@ import { Mark } from '@tiptap/core' +export interface TagAttributes { + tag: string +} + export const TagExtension = Mark.create({ name: 'tag', @@ -11,8 +15,22 @@ export const TagExtension = Mark.create({ group: 'inline', + addStorage() { + return { + markdown: { + serialize: { + open: '', + close: '', + mixable: false, + expelEnclosingWhitespace: true, + }, + parse: {}, + }, + } + }, + renderHTML(p) { - return ['span', p.mark.attrs, 0] + return ['a', { ...p.mark.attrs }, 0] }, addAttributes() { From 972b2ff958510b0fd73cada7690befd95210367e Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 18:28:49 +0200 Subject: [PATCH 03/23] Isolating true flag fixes some bugs when deleting nodes --- examples/react/src/extensions/VideoExtension.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/react/src/extensions/VideoExtension.ts b/examples/react/src/extensions/VideoExtension.ts index a2bf3c3..67a2fd9 100644 --- a/examples/react/src/extensions/VideoExtension.ts +++ b/examples/react/src/extensions/VideoExtension.ts @@ -7,6 +7,8 @@ export const VideoExtension = Node.create({ inclusive: false, + isolating: true, + group: 'block', atom: true, From 7697b534ade901200c9ff9c054ab13c46e9d5970 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 18:29:06 +0200 Subject: [PATCH 04/23] Add naddr1 link to the TestText --- examples/react/src/TestText.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/react/src/TestText.tsx b/examples/react/src/TestText.tsx index d271de6..1814bda 100644 --- a/examples/react/src/TestText.tsx +++ b/examples/react/src/TestText.tsx @@ -11,6 +11,7 @@ export const TestText = () => (
nostr:nevent1qvzqqqqqqypzplnld0r0wvutw6alsrd5q2k7vk2nug9j7glxd6ycyp9k8nzz2wdrqyg8wumn8ghj7mn0wd68ytnhd9hx2qg5waehxw309aex2mrp0yhxgctdw4eju6t0qyxhwumn8ghj7mn0wvhxcmmvqqs9gg4thq8ng87z8377jxksjwhk9dl0f8su9c4kq335ydzp0ykmv5gqt3csa
+ nostr:naddr1qqwysetjv5syxmmdv4ejqsnfw33k76twyp38jgznwp5hyctvqgsph3c2q9yt8uckmgelu0yf7glruudvfluesqn7cuftjpwdynm2gygrqsqqqa2w4ua43m image: https://image.nostr.build/87dbc55a6391d15bddda206561d53867a5679dd95e84fe8ed62bfe2e3adcadf3.jpg From 297bcb17c0105a5e40a0bc8313842a7ad22bf95a Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 19:41:25 +0200 Subject: [PATCH 05/23] Killed parser.ts in favor of NostrParserExtension --- src/__tests__/parser.test.ts | 95 ++++++++++---- .../testExtensions/extensions/index.ts | 6 +- src/extensions/NostrParserExtension.ts | 123 ++++++++++++++++++ src/parser.ts | 62 --------- .../NostrMatcherPlugin/matchers/findLinks.ts | 4 +- .../matchers/findNostrRefs.ts | 2 +- 6 files changed, 196 insertions(+), 96 deletions(-) create mode 100644 src/extensions/NostrParserExtension.ts delete mode 100644 src/parser.ts diff --git a/src/__tests__/parser.test.ts b/src/__tests__/parser.test.ts index 9064f98..1715166 100644 --- a/src/__tests__/parser.test.ts +++ b/src/__tests__/parser.test.ts @@ -1,10 +1,8 @@ // @vitest-environment happy-dom /* eslint-disable no-empty-pattern, */ -/* eslint-disable prettier/prettier */ import { test as base } from 'vitest' import { Editor } from '@tiptap/core' import { nip19 } from 'nostr-tools' -import { parseNoteContent } from '../parser' import { getExtensions, getExtensionsMarkdown } from './testExtensions/extensions' import { fakeNote } from './testUtils' @@ -27,9 +25,8 @@ describe('parseNoteContent', () => { const note = fakeNote({ content: 'Hello nostr-editor! https://github.com/cesardeazevedo/nostr-editor', }) - const newState = parseNoteContent(editor.state, note) - expect(newState.doc.textContent).toStrictEqual('Hello nostr-editor! https://github.com/cesardeazevedo/nostr-editor') - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -67,9 +64,9 @@ describe('parseNoteContent', () => { ['imeta', 'url http://host.com/video', 'm video/mp4'], ], }) - const newState = parseNoteContent(editor.state, note) - expect(newState.doc.textContent).toStrictEqual('http://host.com/image http://host.com/video https://simplelink.com') - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + expect(editor.state.doc.textContent).toStrictEqual('http://host.com/image http://host.com/video https://simplelink.com') + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -147,9 +144,9 @@ describe('parseNoteContent', () => { const note = fakeNote({ content: `Hi! https://google.com #tag nostr:${nevent} Hi nostr:nprofile1qqsvvcpmpuwvlmrztkwq3d6nunmhf6hh688jw6fzxyjmtl2d5u5qr8spz3mhxue69uhhyetvv9ujuerpd46hxtnfdufzkeuj check this out https://nostr.com/img.jpg https://v.nostr.build/g6BQ.mp4`, }) - const newState = parseNoteContent(editor.state, note) - expect(newState.doc.textContent).toStrictEqual(note.content) - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + expect(editor.state.doc.textContent).toStrictEqual(note.content) + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -290,8 +287,7 @@ describe('parseNoteContent', () => { text **bold** *italic* [link](https://google.com) `, }) - const newState = parseNoteContent(editorMarkdown.state, note) - editorMarkdown.view.updateState(newState) + editorMarkdown.commands.parseNote(note) expect(editorMarkdown.storage.markdown.getMarkdown()).toStrictEqual(`# Title - list 1 @@ -299,7 +295,7 @@ describe('parseNoteContent', () => { - list 3 text **bold** *italic* link`) - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + expect(editorMarkdown.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -405,21 +401,64 @@ text **bold** *italic* link`) `) }) - test('Should assert image links with line breaks', ({ editorMarkdown }) => { + test('Should assert a nostr links inside markdown', ({ editorMarkdown }) => { const note = fakeNote({ kind: 30023, + content: `### Test nostr:nprofile1qqsvvcpmpuwvlmrztkwq3d6nunmhf6hh688jw6fzxyjmtl2d5u5qr8spz3mhxue69uhhyetvv9ujuerpd46hxtnfdufzkeuj`, + }) + editorMarkdown.commands.parseNote(note) + expect(editorMarkdown.storage.markdown.getMarkdown()).toStrictEqual(note.content) + expect(editorMarkdown.state.doc.textContent).toStrictEqual('Test nostr:nprofile1qqsvvcpmpuwvlmrztkwq3d6nunmhf6hh688jw6fzxyjmtl2d5u5qr8spz3mhxue69uhhyetvv9ujuerpd46hxtnfdufzkeuj') + expect(editorMarkdown.getJSON()).toMatchInlineSnapshot(` + { + "content": [ + { + "attrs": { + "level": 3, + }, + "content": [ + { + "text": "Test ", + "type": "text", + }, + { + "attrs": { + "pubkey": "c6603b0f1ccfec625d9c08b753e4f774eaf7d1cf2769223125b5fd4da728019e", + "relays": [ + "wss://relay.damus.io", + ], + }, + "content": [ + { + "text": "nostr:nprofile1qqsvvcpmpuwvlmrztkwq3d6nunmhf6hh688jw6fzxyjmtl2d5u5qr8spz3mhxue69uhhyetvv9ujuerpd46hxtnfdufzkeuj", + "type": "text", + }, + ], + "type": "nprofile", + }, + ], + "type": "heading", + }, + ], + "type": "doc", + } + `) + }) + + // TODO: NOT WORKING, Investigate later + test.skip('Should assert image links with line breaks', ({ editor }) => { + const note = fakeNote({ + kind: 1, content: ` - https://host.com/1.jpeg +https://host.com/1.jpeg - https://host.com/2.jpeg +https://host.com/2.jpeg `, }) - const newState = parseNoteContent(editorMarkdown.state, note) - editorMarkdown.view.updateState(newState) - // TODO: This is certainly incorrect, investigate later - expect(newState.doc.textContent).toStrictEqual('https://host.com/1.jpeghttps://host.com/2.jpeg') - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + //expect(editor.state.doc.textContent).toStrictEqual('https://host.com/1.jpeg https://host.com/2.jpeg') + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -467,9 +506,9 @@ text **bold** *italic* link`) content: 'Test: https://github.com/nostr:npub1cesrkrcuelkxyhvupzm48e8hwn4005w0ya5jyvf9kh75mfegqx0q4kt37c/wrong/link/ text', }) - const newState = parseNoteContent(editor.state, note) - expect(newState.doc.textContent).toStrictEqual(note.content) - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + expect(editor.state.doc.textContent).toStrictEqual(note.content) + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { @@ -508,9 +547,9 @@ text **bold** *italic* link`) content: 'Test addr nostr:naddr1qqwysetjv5syxmmdv4ejqsnfw33k76twyp38jgznwp5hyctvqgsph3c2q9yt8uckmgelu0yf7glruudvfluesqn7cuftjpwdynm2gygrqsqqqa2w4ua43m', }) - const newState = parseNoteContent(editor.state, note) - expect(newState.doc.textContent).toStrictEqual(note.content) - expect(newState.toJSON().doc).toMatchInlineSnapshot(` + editor.commands.parseNote(note) + expect(editor.state.doc.textContent).toStrictEqual(note.content) + expect(editor.getJSON()).toMatchInlineSnapshot(` { "content": [ { diff --git a/src/__tests__/testExtensions/extensions/index.ts b/src/__tests__/testExtensions/extensions/index.ts index 57b7429..3c4dd64 100644 --- a/src/__tests__/testExtensions/extensions/index.ts +++ b/src/__tests__/testExtensions/extensions/index.ts @@ -1,7 +1,6 @@ import YoutubeExtension from '@tiptap/extension-youtube' import StarterKit from '@tiptap/starter-kit' import { Markdown as MarkdownExtension } from 'tiptap-markdown' -import { NostrMatcherExtension } from '../../../extensions/NostrMatcherExtension' import { ImageExtension } from './ImageExtension' import { LinkExtension } from './LinkExtension' import { NAddrExtension } from './NAddressExtension' @@ -10,20 +9,21 @@ import { NProfileExtension } from './NProfileExtension' import { TagExtension } from './TagExtension' import { TweetExtension } from './TweetExtension' import { VideoExtension } from './VideoExtension' +import { NostrParserExtension } from '../../../extensions/NostrParserExtension' export function getExtensions() { return [ StarterKit.configure({ history: false }), - NostrMatcherExtension, + NostrParserExtension, TagExtension, LinkExtension, NEventExtension, NAddrExtension, + NProfileExtension, TweetExtension, ImageExtension, VideoExtension.extend({ renderText: (p) => p.node.attrs.src }), YoutubeExtension.extend({ renderText: (p) => p.node.attrs.src }), - NProfileExtension, ] } diff --git a/src/extensions/NostrParserExtension.ts b/src/extensions/NostrParserExtension.ts new file mode 100644 index 0000000..6e0fae7 --- /dev/null +++ b/src/extensions/NostrParserExtension.ts @@ -0,0 +1,123 @@ +import { Extension } from '@tiptap/core'; +import { type NostrEvent } from 'nostr-tools'; +import type { Attrs, MarkType, NodeType } from 'prosemirror-model'; +import type { Transaction } from 'prosemirror-state'; +import { findLinks } from '../plugins/NostrMatcherPlugin/matchers/findLinks'; +import { findNostrRefs } from '../plugins/NostrMatcherPlugin/matchers/findNostrRefs'; +import { findTags } from '../plugins/NostrMatcherPlugin/matchers/findTags'; +import { parseReferences, type NostrReference } from '../plugins/NostrMatcherPlugin/nip27.references'; +import { parseImeta, type IMetaTags } from '../plugins/NostrMatcherPlugin/nip92.imeta'; +import type { Matches } from '../plugins/NostrMatcherPlugin/NostrMatcherPlugin'; +import { removeIntersectingNodes } from '../plugins/NostrMatcherPlugin/utils'; + +declare module '@tiptap/core' { + interface Commands { + nostrparser: { + parseNote: (event: NostrEvent) => ReturnType + } + } +} + +export const NostrParserExtension = Extension.create({ + name: 'nostrparser', + priority: 100, + addCommands() { + return { + parseNote: (event: NostrEvent, imeta?: IMetaTags, references?: NostrReference[]) => (props) => { + function addMark(tr: Transaction, from: number, to: number, mark: MarkType | undefined, attrs: Attrs) { + if (mark) { + tr.addMark(from, to, mark.create(attrs)) + } + } + function replaceWith( + tr: Transaction, + from: number, + to: number, + node: NodeType | undefined, + attrs: Attrs, + content?: string, + ) { + if (node) { + tr.replaceWith(from, to, node.create(attrs, content ? node.schema.text(content) : null)) + } + } + + props.commands.setContent(event.content) + + const content = event.kind === 1 ? event.content : props.tr.doc.textContent + + const tr = props.state.tr + + const refs = findNostrRefs(content, references || parseReferences({ content })) + const links = findLinks(content, imeta || parseImeta(event.tags)) + const tags = findTags(content) + const replacements = [...links, ...tags, ...refs].map((match) => ({ + ...match, + from: match.from + 1, + to: match.to + 1, + })) + replacements + // All the replacements should be done in reverse order so we maintain the correct ranges + .sort((a, b) => (a.to > b.to ? -1 : 1)) + .reduce(removeIntersectingNodes, [] as Matches[]) + .forEach((match) => { + const { kind, text, from, to } = match + const { nodes, marks } = this.editor.state.schema + switch (kind) { + case 'text': { + addMark(tr, from, to, marks.link, { href: match.href }) + break + } + case 'image': { + replaceWith(tr, from, to, nodes.image, { src: match.href }, text) + break + } + case 'youtube': { + replaceWith(tr, from, to, nodes.youtube, { src: match.href }, text) + break + } + case 'tweet': { + replaceWith(tr, from, to, nodes.tweet, { src: match.href }, text) + break + } + case 'video': { + replaceWith(tr, from, to, nodes.video, { src: match.href }, text) + break + } + case 'tag': { + addMark(tr, from, to, marks.tag, { tag: match.text }) + break + } + case 'nostr': { + const { ref } = match + switch (ref.prefix) { + case 'npub': + case 'nprofile': { + replaceWith(tr, from, to, nodes.nprofile, ref.profile, text) + break + } + case 'note': + case 'nevent': { + replaceWith(tr, from, to, nodes.nevent, ref.event, text) + break + } + case 'naddr': { + replaceWith(tr, from, to, nodes.naddr, ref.address, text) + break + } + default: { + break + } + } + break + } + default: { + break + } + } + }) + return true + }, + } + }, +}) diff --git a/src/parser.ts b/src/parser.ts deleted file mode 100644 index dc95e9a..0000000 --- a/src/parser.ts +++ /dev/null @@ -1,62 +0,0 @@ -import markdownIt from 'markdown-it' -import { type NostrEvent } from 'nostr-tools' -import { DOMParser } from 'prosemirror-model' -import type { EditorState } from 'prosemirror-state' -import { parseReferences, type NostrReference } from './plugins/NostrMatcherPlugin/nip27.references' -import type { IMetaTags } from './plugins/NostrMatcherPlugin/nip92.imeta' -import { parseImeta } from './plugins/NostrMatcherPlugin/nip92.imeta' - -const md = markdownIt() - -export function parseNoteContent( - editor: EditorState, - event: NostrEvent, - references?: NostrReference[], - imeta?: IMetaTags, -) { - return event.kind === 30023 - ? parseMarkdownContent(editor, event, references, imeta) - : parseTextContent(editor, event, references, imeta) -} - -export function parseTextContent( - editor: EditorState, - event: NostrEvent, - references?: NostrReference[], - imeta?: IMetaTags, -) { - const { tr } = editor - const changes = tr - .insertText(event.content.replace(/\n+/g, '
')) - .setMeta('imeta', imeta || parseImeta(event.tags)) - .setMeta('references', references || parseReferences(event)) - return editor.apply(changes) -} - -export function parseMarkdownContent( - editor: EditorState, - event: NostrEvent, - references?: NostrReference[], - imeta?: IMetaTags, -) { - const html = md.render(event.content) - const node = new window.DOMParser().parseFromString(html, 'text/html') - const domParser = DOMParser.fromSchema(editor.schema) - const result = domParser.parse(node) - - const { tr } = editor - - const newState = tr - .replaceWith(0, tr.doc.content.size, result) - .setMeta('imeta', imeta || parseImeta(event.tags)) - .setMeta('references', references || parseReferences(event)) - - return editor.apply(newState) -} - -export function parseUserAbout(editor: EditorState, about: string) { - const tr = editor.tr.insertText(about) - tr.setMeta('imeta', null) - tr.setMeta('references', null) - return editor.apply(tr) -} diff --git a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts b/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts index 680d823..aeaa235 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts +++ b/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts @@ -11,7 +11,7 @@ export interface MatchLinks extends MatchBase { href: string } -function getLinkKind(url: string, href: string, imeta: IMetaTags): MatchLinks['kind'] { +function getLinkKind(url: string, href: string, imeta?: IMetaTags): MatchLinks['kind'] { const mimetype = imeta?.[url]?.m?.split?.('/')?.[0] if (mimetype && ['image', 'video'].includes(mimetype)) { return mimetype as 'image' | 'video' @@ -30,7 +30,7 @@ function getLinkKind(url: string, href: string, imeta: IMetaTags): MatchLinks['k } } -export function findLinks(text: string, imeta: IMetaTags): MatchLinks[] { +export function findLinks(text: string, imeta?: IMetaTags): MatchLinks[] { const links: MatchLinks[] = [] for (const { start: from, end: to, value, href } of linkifyjs.find(text) || []) { diff --git a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts b/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts index 25c32e7..a90ea9c 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts +++ b/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts @@ -7,7 +7,7 @@ export interface MatchNostr extends MatchBase { ref: NostrReference } -export function findNostrRefs(text: string, references: NostrReference[]): MatchNostr[] { +export function findNostrRefs(text: string, references?: NostrReference[]): MatchNostr[] { const refs: MatchNostr[] = [] const parsed = references || parseReferences({ content: text }) for (const ref of parsed) { From e259455da211ceaa2aa2e1a3f0dd3dc805f94464 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 19:49:22 +0200 Subject: [PATCH 06/23] Revert minor changes on nip27 parser --- src/plugins/NostrMatcherPlugin/nip27.references.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/NostrMatcherPlugin/nip27.references.ts b/src/plugins/NostrMatcherPlugin/nip27.references.ts index 7003520..4946601 100644 --- a/src/plugins/NostrMatcherPlugin/nip27.references.ts +++ b/src/plugins/NostrMatcherPlugin/nip27.references.ts @@ -1,7 +1,7 @@ // Adapted from nostr-tools/src/references.ts import type { Event as NostrEvent } from 'nostr-tools' import { nip19 } from 'nostr-tools' -import type { AddressPointer, ProfilePointer } from 'nostr-tools/nip19' +import type { AddressPointer, EventPointer, ProfilePointer } from 'nostr-tools/nip19' type BaseReference = { index: number @@ -9,12 +9,13 @@ type BaseReference = { author?: string } +export type EventReference = BaseReference & { prefix: 'nevent' | 'note'; event: EventPointer } export type ProfileReference = BaseReference & { prefix: 'nprofile' | 'npub'; profile: ProfilePointer } type AddressReference = BaseReference & { prefix: 'naddr'; address: AddressPointer } -export type NostrReference = ProfileReference | AddressReference +export type NostrReference = ProfileReference | EventReference | AddressReference -const mentionRegex = /\bnostr:((npub|naddr|nprofile)1\w+)\b|#\[(\d+)\]/g +const mentionRegex = /\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g const { decode } = nip19 From a16d09f3ec584dbf84bdffdc5afa783083de4b7a Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 19:49:41 +0200 Subject: [PATCH 07/23] Initial cleanup on NostrMatcherExtension --- src/extensions/NostrMatcherExtension.ts | 3 +-- .../NostrMatcherPlugin/NostrMatcherPlugin.ts | 19 +------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/extensions/NostrMatcherExtension.ts b/src/extensions/NostrMatcherExtension.ts index b18741e..acd53e3 100644 --- a/src/extensions/NostrMatcherExtension.ts +++ b/src/extensions/NostrMatcherExtension.ts @@ -10,7 +10,6 @@ export const NostrMatcherExtension = Extension.create({ name: 'nostrMatcher', addProseMirrorPlugins() { - const { imeta, references } = this.editor.storage - return [new NostrMatcherPlugin(imeta, references).plugin] + return [new NostrMatcherPlugin().plugin] }, }) diff --git a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts index 1a07e2c..58421b8 100644 --- a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts +++ b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts @@ -8,8 +8,6 @@ import type { MatchNostr } from './matchers/findNostrRefs' import { findNostrRefs } from './matchers/findNostrRefs' import type { MatchTag } from './matchers/findTags' import { findTags } from './matchers/findTags' -import type { NostrReference } from './nip27.references' -import type { IMetaTags } from './nip92.imeta' import type { GetMarkRange, NodeWithPosition } from './types' import { isValidTLD, removeIntersectingNodes } from './utils' @@ -18,25 +16,10 @@ export type Matches = MatchLinks | MatchNostr | MatchTag export class NostrMatcherPlugin { plugin: Plugin - constructor(imeta?: IMetaTags, references?: NostrReference[]) { + constructor() { this.plugin = new Plugin({ key: new PluginKey('nostr'), - state: { - init: () => { - return { - imeta, - references, - } - }, - apply: (tr) => { - return { - imeta: tr.getMeta('imeta'), - references: tr.getMeta('references'), - } - }, - }, - appendTransaction: (transactions, oldState, newState) => { const isUndo = undoDepth(oldState) - undoDepth(newState) === 1 const markLink = newState.schema.marks.link From fe45fee9692149c72762db0657a48aa755b50da9 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 19:50:35 +0200 Subject: [PATCH 08/23] Minor linter changes --- eslint.config.js | 1 + src/__tests__/parser.test.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.js b/eslint.config.js index e8f490e..70036ba 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,6 +10,7 @@ export default [ eslintPluginPrettierRecommended, { rules: { + 'prettier/prettier': 0, '@typescript-eslint/consistent-type-imports': 'error', }, }, diff --git a/src/__tests__/parser.test.ts b/src/__tests__/parser.test.ts index 9064f98..b5c350c 100644 --- a/src/__tests__/parser.test.ts +++ b/src/__tests__/parser.test.ts @@ -1,6 +1,5 @@ // @vitest-environment happy-dom /* eslint-disable no-empty-pattern, */ -/* eslint-disable prettier/prettier */ import { test as base } from 'vitest' import { Editor } from '@tiptap/core' import { nip19 } from 'nostr-tools' From 7c0738652edce7fd39f3008904d0cbfea1e07e30 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 19:55:31 +0200 Subject: [PATCH 09/23] Remove imeta/ref state from NostrMatcherPlugin --- src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts | 11 +++++------ src/plugins/NostrMatcherPlugin/matchers/findLinks.ts | 4 ++-- .../NostrMatcherPlugin/matchers/findNostrRefs.ts | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts index 58421b8..c649964 100644 --- a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts +++ b/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts @@ -77,7 +77,7 @@ export class NostrMatcherPlugin { // Check newLinkText for a remaining valid link if (from === to) { - this.findMatches(newLinkText, newFrom, newState).forEach((match) => { + this.findMatches(newLinkText, newFrom).forEach((match) => { this.replaceNodes(tr, newState, match) }) } @@ -86,7 +86,7 @@ export class NostrMatcherPlugin { const replacements = this.findTextBlocksInRange(doc, { from, to }, newState.schema.marks.link).flatMap( ({ text, positionStart }) => { - return this.findMatches(text, positionStart + 1, newState) + return this.findMatches(text, positionStart + 1) .filter((range) => { const fromIsInRange = range.from >= from && range.from <= to const toIsInRange = range.to >= from && range.to <= to @@ -220,10 +220,9 @@ export class NostrMatcherPlugin { })) } - private findMatches(text: string, positionStart: number, state: EditorState): Matches[] { - const { imeta, references } = this.plugin.getState(state) - const links = findLinks(text, imeta) - const refs = findNostrRefs(text, references) + private findMatches(text: string, positionStart: number): Matches[] { + const links = findLinks(text) + const refs = findNostrRefs(text) const tags = findTags(text) const res = [...links, ...tags, ...refs].map((match) => ({ ...match, diff --git a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts b/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts index 680d823..aeaa235 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts +++ b/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts @@ -11,7 +11,7 @@ export interface MatchLinks extends MatchBase { href: string } -function getLinkKind(url: string, href: string, imeta: IMetaTags): MatchLinks['kind'] { +function getLinkKind(url: string, href: string, imeta?: IMetaTags): MatchLinks['kind'] { const mimetype = imeta?.[url]?.m?.split?.('/')?.[0] if (mimetype && ['image', 'video'].includes(mimetype)) { return mimetype as 'image' | 'video' @@ -30,7 +30,7 @@ function getLinkKind(url: string, href: string, imeta: IMetaTags): MatchLinks['k } } -export function findLinks(text: string, imeta: IMetaTags): MatchLinks[] { +export function findLinks(text: string, imeta?: IMetaTags): MatchLinks[] { const links: MatchLinks[] = [] for (const { start: from, end: to, value, href } of linkifyjs.find(text) || []) { diff --git a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts b/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts index 25c32e7..a90ea9c 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts +++ b/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts @@ -7,7 +7,7 @@ export interface MatchNostr extends MatchBase { ref: NostrReference } -export function findNostrRefs(text: string, references: NostrReference[]): MatchNostr[] { +export function findNostrRefs(text: string, references?: NostrReference[]): MatchNostr[] { const refs: MatchNostr[] = [] const parsed = references || parseReferences({ content: text }) for (const ref of parsed) { From 678cc16e3aa5e231d8af8bca6322fc7fea90c0f0 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 20:01:24 +0200 Subject: [PATCH 10/23] Fix missing nip19 revert --- .../NostrMatcherPlugin/nip27.references.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/plugins/NostrMatcherPlugin/nip27.references.ts b/src/plugins/NostrMatcherPlugin/nip27.references.ts index 4946601..343dd9e 100644 --- a/src/plugins/NostrMatcherPlugin/nip27.references.ts +++ b/src/plugins/NostrMatcherPlugin/nip27.references.ts @@ -48,6 +48,25 @@ export function parseReferences(evt: Partial): NostrReference[] { }) break } + case 'note': { + references.push({ + index, + prefix: 'note', + text: ref[0], + event: { id: data as string, relays: [] }, + }) + break + } + case 'nevent': { + references.push({ + index, + prefix: 'nevent', + text: ref[0], + event: data as EventPointer, + author: data.author, + }) + break + } case 'naddr': { references.push({ index, @@ -79,6 +98,15 @@ export function parseReferences(evt: Partial): NostrReference[] { }) break } + case 'e': { + references.push({ + index, + prefix: 'nevent', + text: ref[0], + event: { id: tag[1], relays: tag[2] ? [tag[2]] : [] }, + }) + break + } case 'a': { try { const [kind, pubkey, identifier] = tag[1].split(':') From 806c0106a18fbda39c6e295c74e8ae3ddfdf67bf Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Thu, 1 Aug 2024 20:07:50 +0200 Subject: [PATCH 11/23] Added missing prosemirror-markdown dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 26864b5..fe6d403 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "prosemirror-history": "^1.4.1", "prosemirror-model": "^1.22.1", "prosemirror-state": "^1.4.3", + "prosemirror-markdown": "^1.13.0", "tiptap-markdown": "^0.8.10", "tlds": "^1.254.0" } From badc1aeb4b46616718440227936ff5178948b1fe Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 1 Aug 2024 12:43:01 -0700 Subject: [PATCH 12/23] Move naddr and nprofile to lib --- examples/react/src/App.tsx | 4 +- .../react/src/extensions/NAddressExtension.ts | 39 ---------- .../react/src/extensions/NProfileExtension.ts | 39 ---------- .../extensions/NAddressExtension.ts | 39 ---------- .../extensions/NEventExtension.ts | 41 ----------- .../extensions/NProfileExtension.ts | 41 ----------- .../testExtensions/extensions/index.ts | 8 +- src/extensions/NAddrExtension.ts | 73 +++++++++++++++++++ src/extensions/NProfileExtension.ts | 71 ++++++++++++++++++ src/index.ts | 2 + 10 files changed, 151 insertions(+), 206 deletions(-) delete mode 100644 examples/react/src/extensions/NAddressExtension.ts delete mode 100644 examples/react/src/extensions/NProfileExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/NAddressExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/NEventExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/NProfileExtension.ts create mode 100644 src/extensions/NAddrExtension.ts create mode 100644 src/extensions/NProfileExtension.ts diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index 380e85b..9f23409 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -4,7 +4,7 @@ import { Markdown as MarkdownExtension } from 'tiptap-markdown' import type { AnyExtension } from '@tiptap/react' import { EditorContent, ReactNodeViewRenderer, useEditor } from '@tiptap/react' import { StarterKit } from '@tiptap/starter-kit' -import { NostrMatcherExtension, NEventExtension } from 'nostr-editor' +import { NostrMatcherExtension, NEventExtension, NAddrExtension, NProfileExtension } from 'nostr-editor' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import ReactJsonView from 'react-json-view' import { Image } from './components/Image' @@ -14,8 +14,6 @@ import { NEvent } from './components/NEvent' import { Tweet } from './components/Tweet' import { Video } from './components/Video' import { LinkExtension } from './extensions/LinkExtension' -import { NAddrExtension } from './extensions/NAddressExtension' -import { NProfileExtension } from './extensions/NProfileExtension' import { TagExtension } from './extensions/TagExtension' import { TweetExtension } from './extensions/TweetExtension' import { VideoExtension } from './extensions/VideoExtension' diff --git a/examples/react/src/extensions/NAddressExtension.ts b/examples/react/src/extensions/NAddressExtension.ts deleted file mode 100644 index 974eb28..0000000 --- a/examples/react/src/extensions/NAddressExtension.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Node } from '@tiptap/core' -import type { MarkdownSerializerState } from 'prosemirror-markdown' -import type { Node as ProsemirrorNode } from '@tiptap/pm/model' - -export const NAddrExtension = Node.create({ - name: 'naddr', - - group: 'block', - - atom: true, - - isolating: true, - - content: 'text*', - - addAttributes() { - return { - kind: { default: null }, - pubkey: { default: null }, - relays: { default: null }, - identifier: { default: null }, - } - }, - - addStorage() { - return { - markdown: { - serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) - }, - parse: {}, - }, - } - }, - - renderHTML() { - return ['div', {}, 0] - }, -}) diff --git a/examples/react/src/extensions/NProfileExtension.ts b/examples/react/src/extensions/NProfileExtension.ts deleted file mode 100644 index 81bd26c..0000000 --- a/examples/react/src/extensions/NProfileExtension.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Node } from '@tiptap/core' -import type { MarkdownSerializerState } from 'prosemirror-markdown' -import type { Node as ProsemirrorNode } from '@tiptap/pm/model' - -export const NProfileExtension = Node.create({ - name: 'nprofile', - - inline: true, - - inclusive: true, - - group: 'inline', - - addAttributes() { - return { - pubkey: { default: null }, - relays: { default: null }, - } - }, - - addStorage() { - return { - markdown: { - serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) - }, - parse: {}, - }, - } - }, - - renderText(p) { - return p.node.textContent - }, - - renderHTML(p) { - return ['span', { ...p.node.attrs }, '@'] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/NAddressExtension.ts b/src/__tests__/testExtensions/extensions/NAddressExtension.ts deleted file mode 100644 index 974eb28..0000000 --- a/src/__tests__/testExtensions/extensions/NAddressExtension.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Node } from '@tiptap/core' -import type { MarkdownSerializerState } from 'prosemirror-markdown' -import type { Node as ProsemirrorNode } from '@tiptap/pm/model' - -export const NAddrExtension = Node.create({ - name: 'naddr', - - group: 'block', - - atom: true, - - isolating: true, - - content: 'text*', - - addAttributes() { - return { - kind: { default: null }, - pubkey: { default: null }, - relays: { default: null }, - identifier: { default: null }, - } - }, - - addStorage() { - return { - markdown: { - serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) - }, - parse: {}, - }, - } - }, - - renderHTML() { - return ['div', {}, 0] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/NEventExtension.ts b/src/__tests__/testExtensions/extensions/NEventExtension.ts deleted file mode 100644 index c69f001..0000000 --- a/src/__tests__/testExtensions/extensions/NEventExtension.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Node } from '@tiptap/core' -import type { Node as ProsemirrorNode } from '@tiptap/pm/model' -import type { MarkdownSerializerState } from 'prosemirror-markdown' - -export const NEventExtension = Node.create({ - name: 'nevent', - - group: 'block', - - atom: true, - - isolating: true, - - selectable: true, - - content: 'text?', - - addStorage() { - return { - markdown: { - serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) - }, - parse: {}, - }, - } - }, - - addAttributes() { - return { - id: { default: null }, - kind: { default: null }, - author: { default: null }, - relays: { default: null }, - } - }, - - renderHTML() { - return ['div', {}, 0] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/NProfileExtension.ts b/src/__tests__/testExtensions/extensions/NProfileExtension.ts deleted file mode 100644 index cfa5301..0000000 --- a/src/__tests__/testExtensions/extensions/NProfileExtension.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Node } from '@tiptap/core' -import type { MarkdownSerializerState } from 'prosemirror-markdown' -import type { Node as ProsemirrorNode } from '@tiptap/pm/model' - -export const NProfileExtension = Node.create({ - name: 'nprofile', - - inline: true, - - inclusive: true, - - group: 'inline', - - content: 'text?', - - addAttributes() { - return { - pubkey: { default: null }, - relays: { default: null }, - } - }, - - addStorage() { - return { - markdown: { - serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) - }, - parse: {}, - }, - } - }, - - renderText(p) { - return p.node.textContent - }, - - renderHTML(p) { - return ['span', { ...p.node.attrs }, '@'] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/index.ts b/src/__tests__/testExtensions/extensions/index.ts index 3c4dd64..4d6a977 100644 --- a/src/__tests__/testExtensions/extensions/index.ts +++ b/src/__tests__/testExtensions/extensions/index.ts @@ -3,12 +3,12 @@ import StarterKit from '@tiptap/starter-kit' import { Markdown as MarkdownExtension } from 'tiptap-markdown' import { ImageExtension } from './ImageExtension' import { LinkExtension } from './LinkExtension' -import { NAddrExtension } from './NAddressExtension' -import { NEventExtension } from './NEventExtension' -import { NProfileExtension } from './NProfileExtension' import { TagExtension } from './TagExtension' import { TweetExtension } from './TweetExtension' import { VideoExtension } from './VideoExtension' +import { NAddrExtension } from '../../../extensions/NAddrExtension' +import { NEventExtension } from '../../../extensions/NEventExtension' +import { NProfileExtension } from '../../../extensions/NProfileExtension' import { NostrParserExtension } from '../../../extensions/NostrParserExtension' export function getExtensions() { @@ -17,8 +17,8 @@ export function getExtensions() { NostrParserExtension, TagExtension, LinkExtension, - NEventExtension, NAddrExtension, + NEventExtension, NProfileExtension, TweetExtension, ImageExtension, diff --git a/src/extensions/NAddrExtension.ts b/src/extensions/NAddrExtension.ts new file mode 100644 index 0000000..5f16c6e --- /dev/null +++ b/src/extensions/NAddrExtension.ts @@ -0,0 +1,73 @@ +import { nip19 } from 'nostr-tools' +import type { AddressPointer } from 'nostr-tools/nip19' +import { Node, nodePasteRule } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import type { MarkdownSerializerState } from 'prosemirror-markdown' + +export const NADDR_REGEX = /(nostr:)?(naddr1[0-9a-z]+)/g + +export const NAddrExtension = Node.create({ + name: 'naddr', + + group: 'block', + + atom: true, + + selectable: true, + + content: 'text*', + + addAttributes() { + return { + identifier: { default: null }, + pubkey: { default: null }, + kind: { default: null }, + relays: { default: null }, + } + }, + + renderHTML() { + return ['div', {}, 0] + }, + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + + addPasteRules() { + return [ + nodePasteRule({ + type: this.type, + getAttributes: match => match.data, + find: text => { + const matches = [] + + for (const match of text.matchAll(NADDR_REGEX)) { + try { + const data = nip19.decode(match[2]).data as AddressPointer + + matches.push({ + index: match.index, + replaceWith: match[2], + text: match[0], + match, + data, + }) + } catch (e) { + continue + } + } + + return matches + }, + }), + ] + }, +}) diff --git a/src/extensions/NProfileExtension.ts b/src/extensions/NProfileExtension.ts new file mode 100644 index 0000000..0d1dda9 --- /dev/null +++ b/src/extensions/NProfileExtension.ts @@ -0,0 +1,71 @@ +import { nip19 } from 'nostr-tools' +import type { ProfilePointer } from 'nostr-tools/nip19' +import { Node, nodePasteRule } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import type { MarkdownSerializerState } from 'prosemirror-markdown' + +export const NPROFILE_REGEX = /(nostr:)?(nprofile1[0-9a-z]+)/g + +export const NProfileExtension = Node.create({ + name: 'nprofile', + + inline: true, + + inclusive: true, + + group: 'inline', + + content: 'text?', + + addAttributes() { + return { + pubkey: { default: null }, + relays: { default: null }, + } + }, + + renderHTML() { + return ['div', {}, 0] + }, + + addStorage() { + return { + markdown: { + serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { + state.write(node.textContent) + }, + parse: {}, + }, + } + }, + + addPasteRules() { + return [ + nodePasteRule({ + type: this.type, + getAttributes: match => match.data, + find: text => { + const matches = [] + + for (const match of text.matchAll(NPROFILE_REGEX)) { + try { + const data = nip19.decode(match[2]).data as ProfilePointer + + matches.push({ + index: match.index, + replaceWith: match[2], + text: match[0], + match, + data, + }) + } catch (e) { + continue + } + } + + return matches + }, + }), + ] + }, +}) diff --git a/src/index.ts b/src/index.ts index ec53d24..0e5ee88 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,5 @@ export { NostrMatcherExtension } from './extensions/NostrMatcherExtension' +export { NProfileExtension } from './extensions/NProfileExtension' export { NEventExtension } from './extensions/NEventExtension' +export { NAddrExtension } from './extensions/NAddrExtension' export * from './types' From 7661ec9d660c987c5f6707822ee69280fe26e8a6 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 1 Aug 2024 12:57:19 -0700 Subject: [PATCH 13/23] Add createPasteRuleMatch util, support npub1 and note1 --- examples/react/src/TestText.tsx | 2 ++ src/extensions/NAddrExtension.ts | 11 +++-------- src/extensions/NEventExtension.ts | 23 +++++++++++++++-------- src/extensions/NProfileExtension.ts | 23 +++++++++++++++-------- src/extensions/util.ts | 4 ++++ 5 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 src/extensions/util.ts diff --git a/examples/react/src/TestText.tsx b/examples/react/src/TestText.tsx index 1814bda..5797114 100644 --- a/examples/react/src/TestText.tsx +++ b/examples/react/src/TestText.tsx @@ -11,6 +11,8 @@ export const TestText = () => (
nostr:nevent1qvzqqqqqqypzplnld0r0wvutw6alsrd5q2k7vk2nug9j7glxd6ycyp9k8nzz2wdrqyg8wumn8ghj7mn0wd68ytnhd9hx2qg5waehxw309aex2mrp0yhxgctdw4eju6t0qyxhwumn8ghj7mn0wvhxcmmvqqs9gg4thq8ng87z8377jxksjwhk9dl0f8su9c4kq335ydzp0ykmv5gqt3csa
+ nostr:note1dezy67z2sl5yxm6scwmy6w4k0zjleyw3tnttxyduygz96cl79fnsgcsf6g +
nostr:naddr1qqwysetjv5syxmmdv4ejqsnfw33k76twyp38jgznwp5hyctvqgsph3c2q9yt8uckmgelu0yf7glruudvfluesqn7cuftjpwdynm2gygrqsqqqa2w4ua43m image: https://image.nostr.build/87dbc55a6391d15bddda206561d53867a5679dd95e84fe8ed62bfe2e3adcadf3.jpg diff --git a/src/extensions/NAddrExtension.ts b/src/extensions/NAddrExtension.ts index 5f16c6e..630192f 100644 --- a/src/extensions/NAddrExtension.ts +++ b/src/extensions/NAddrExtension.ts @@ -3,6 +3,7 @@ import type { AddressPointer } from 'nostr-tools/nip19' import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' +import {createPasteRuleMatch} from './util' export const NADDR_REGEX = /(nostr:)?(naddr1[0-9a-z]+)/g @@ -22,7 +23,7 @@ export const NAddrExtension = Node.create({ identifier: { default: null }, pubkey: { default: null }, kind: { default: null }, - relays: { default: null }, + relays: { default: [] }, } }, @@ -53,13 +54,7 @@ export const NAddrExtension = Node.create({ try { const data = nip19.decode(match[2]).data as AddressPointer - matches.push({ - index: match.index, - replaceWith: match[2], - text: match[0], - match, - data, - }) + matches.push(createPasteRuleMatch(match, data)) } catch (e) { continue } diff --git a/src/extensions/NEventExtension.ts b/src/extensions/NEventExtension.ts index bc29ca5..3afe95a 100644 --- a/src/extensions/NEventExtension.ts +++ b/src/extensions/NEventExtension.ts @@ -3,6 +3,9 @@ import type { EventPointer } from 'nostr-tools/nip19' import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' +import {createPasteRuleMatch} from './util' + +export const NOTE_REGEX = /(nostr:)?(note1[0-9a-z]+)/g export const NEVENT_REGEX = /(nostr:)?(nevent1[0-9a-z]+)/g @@ -22,7 +25,7 @@ export const NEventExtension = Node.create({ id: { default: null }, kind: { default: null }, author: { default: null }, - relays: { default: null }, + relays: { default: [] }, } }, @@ -49,17 +52,21 @@ export const NEventExtension = Node.create({ find: text => { const matches = [] + for (const match of text.matchAll(NOTE_REGEX)) { + try { + const id = nip19.decode(match[2]).data as string + + matches.push(createPasteRuleMatch(match, {id})) + } catch (e) { + continue + } + } + for (const match of text.matchAll(NEVENT_REGEX)) { try { const data = nip19.decode(match[2]).data as EventPointer - matches.push({ - index: match.index, - replaceWith: match[2], - text: match[0], - match, - data, - }) + matches.push(createPasteRuleMatch(match, data)) } catch (e) { continue } diff --git a/src/extensions/NProfileExtension.ts b/src/extensions/NProfileExtension.ts index 0d1dda9..5816fa5 100644 --- a/src/extensions/NProfileExtension.ts +++ b/src/extensions/NProfileExtension.ts @@ -3,6 +3,9 @@ import type { ProfilePointer } from 'nostr-tools/nip19' import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' +import {createPasteRuleMatch} from './util' + +export const NPUB_REGEX = /(nostr:)?(npub1[0-9a-z]+)/g export const NPROFILE_REGEX = /(nostr:)?(nprofile1[0-9a-z]+)/g @@ -20,7 +23,7 @@ export const NProfileExtension = Node.create({ addAttributes() { return { pubkey: { default: null }, - relays: { default: null }, + relays: { default: [] }, } }, @@ -47,17 +50,21 @@ export const NProfileExtension = Node.create({ find: text => { const matches = [] + for (const match of text.matchAll(NPUB_REGEX)) { + try { + const pubkey = nip19.decode(match[2]).data as string + + matches.push(createPasteRuleMatch(match, {pubkey})) + } catch (e) { + continue + } + } + for (const match of text.matchAll(NPROFILE_REGEX)) { try { const data = nip19.decode(match[2]).data as ProfilePointer - matches.push({ - index: match.index, - replaceWith: match[2], - text: match[0], - match, - data, - }) + matches.push(createPasteRuleMatch(match, data)) } catch (e) { continue } diff --git a/src/extensions/util.ts b/src/extensions/util.ts new file mode 100644 index 0000000..c9ee957 --- /dev/null +++ b/src/extensions/util.ts @@ -0,0 +1,4 @@ +import type {PasteRuleMatch} from '@tiptap/core' + +export const createPasteRuleMatch = >(match: RegExpMatchArray, data: T): PasteRuleMatch => + ({index: match.index!, replaceWith: match[2], text: match[0], match, data}) From d5425e14a6bde07b8eb8210862636777d09934cd Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 1 Aug 2024 14:12:43 -0700 Subject: [PATCH 14/23] Add suggestions to nprofile plugin --- examples/react/package.json | 5 +- examples/react/pnpm-lock.yaml | 26 ++++ examples/react/src/App.tsx | 142 +++++++++++++++++- .../src/components/PersonSuggestions.tsx | 15 ++ package.json | 2 +- src/extensions/NProfileExtension.ts | 10 +- 6 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 examples/react/src/components/PersonSuggestions.tsx diff --git a/examples/react/package.json b/examples/react/package.json index 3d85848..89ca795 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -20,13 +20,16 @@ "@tiptap/pm": "^2.5.4", "@tiptap/react": "^2.5.4", "@tiptap/starter-kit": "^2.5.4", + "@tiptap/suggestion": "^2.5.8", "luxon": "^3.4.4", "nostr-editor": "link:../..", "nostr-tools": "^2.7.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-json-view": "^1.21.3", - "react-tweet": "^3.2.1" + "react-tweet": "^3.2.1", + "throttle-debounce": "^5.0.2", + "tippy.js": "^6.3.7" }, "devDependencies": { "@types/luxon": "^3.4.2", diff --git a/examples/react/pnpm-lock.yaml b/examples/react/pnpm-lock.yaml index a0c9d30..f017996 100644 --- a/examples/react/pnpm-lock.yaml +++ b/examples/react/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@tiptap/starter-kit': specifier: ^2.5.4 version: 2.5.4(@tiptap/pm@2.5.4) + '@tiptap/suggestion': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) luxon: specifier: ^3.4.4 version: 3.4.4 @@ -56,6 +59,12 @@ importers: react-tweet: specifier: ^3.2.1 version: 3.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + throttle-debounce: + specifier: ^5.0.2 + version: 5.0.2 + tippy.js: + specifier: ^6.3.7 + version: 6.3.7 devDependencies: '@types/luxon': specifier: ^3.4.2 @@ -694,6 +703,12 @@ packages: '@tiptap/starter-kit@2.5.4': resolution: {integrity: sha512-IYnSETtBUSsy+Ece4kfVyzew+zyj7W9rP2Ronx0CbjeWQarfCAGxjuZ6uGLPB+tC5ZuMVt68Gyqb2y8GFes2Yw==} + '@tiptap/suggestion@2.5.8': + resolution: {integrity: sha512-u0emCyGpzSshKR5mIJVwPwycKikP05137fnD0RFI3+nftO6n/2h54rs2yU6BYA8dc01VZRB00cJ/zHO6DsZWEA==} + peerDependencies: + '@tiptap/core': ^2.5.8 + '@tiptap/pm': ^2.5.8 + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1724,6 +1739,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} @@ -2437,6 +2456,11 @@ snapshots: transitivePeerDependencies: - '@tiptap/pm' + '@tiptap/suggestion@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4)': + dependencies: + '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) + '@tiptap/pm': 2.5.4 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.8 @@ -3572,6 +3596,8 @@ snapshots: dependencies: any-promise: 1.3.0 + throttle-debounce@5.0.2: {} + tippy.js@6.3.7: dependencies: '@popperjs/core': 2.11.8 diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index 9f23409..9fe654c 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -1,3 +1,8 @@ +import tippy from 'tippy.js' +import {throttle} from 'throttle-debounce' +import {PluginKey} from '@tiptap/pm/state' +import {mergeAttributes} from '@tiptap/core' +import Suggestion from '@tiptap/suggestion' import ImageExtension from '@tiptap/extension-image' import YoutubeExtension from '@tiptap/extension-youtube' import { Markdown as MarkdownExtension } from 'tiptap-markdown' @@ -5,6 +10,7 @@ import type { AnyExtension } from '@tiptap/react' import { EditorContent, ReactNodeViewRenderer, useEditor } from '@tiptap/react' import { StarterKit } from '@tiptap/starter-kit' import { NostrMatcherExtension, NEventExtension, NAddrExtension, NProfileExtension } from 'nostr-editor' +import ReactDOM from 'react-dom/client' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import ReactJsonView from 'react-json-view' import { Image } from './components/Image' @@ -13,6 +19,7 @@ import { NAddr } from './components/NAddr' import { NEvent } from './components/NEvent' import { Tweet } from './components/Tweet' import { Video } from './components/Video' +import { PersonSuggestions } from './components/PersonSuggestions' import { LinkExtension } from './extensions/LinkExtension' import { TagExtension } from './extensions/TagExtension' import { TweetExtension } from './extensions/TweetExtension' @@ -20,6 +27,7 @@ import { VideoExtension } from './extensions/VideoExtension' import { TestText } from './TestText' import { Sidebar } from './Sidebar' import type { EditorType, EditorExtensionSettings } from './types' +import { pool } from './nostr' function App() { const [raw, setRaw] = useState('') @@ -77,7 +85,139 @@ function App() { if (settings.youtube) baseExtensions.push(YoutubeExtension.extend({ renderText: (p) => p.node.attrs.src })) if (settings.tweet) baseExtensions.push(TweetExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Tweet) })) if (settings.nprofile1) - baseExtensions.push(NProfileExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Mention) })) + baseExtensions.push( + NProfileExtension + .extend({ + addNodeView: () => ReactNodeViewRenderer(Mention), + addProseMirrorPlugins() { + return [ + Suggestion({ + char: '@', + editor: this.editor, + pluginKey: new PluginKey('@'), + command: ({editor, range, props}: any) => { + // increase range.to by one when the next node is of type "text" + // and starts with a space character + const nodeAfter = editor.view.state.selection.$to.nodeAfter + const overrideSpace = nodeAfter?.text?.startsWith(' ') + + if (overrideSpace) { + range.to += 1 + } + + const attrs = { + pubkey: props.pubkey, + relays: ['wss://purplepag.es'], + } + + editor + .chain() + .focus() + .insertContentAt(range, [ + {type: 'nprofile', attrs}, + {type: 'text', text: ' '}, + ]) + .run() + + window.getSelection()?.collapseToEnd() + }, + render: () => { + const target = document.createElement("div") + const root = ReactDOM.createRoot(target) + + let popover: any + let renderProps = {loading: false, index: 0, items: []} + + const render = newProps => { + renderProps = {...renderProps, ...newProps} + + root.render() + } + + const search = throttle(800, async () => { + render({loading: true}) + + const items = [] + const sub = pool.subscribeMany(['wss://relay.nostr.band'], [{kinds: [0], search: renderProps.query}], { + onevent(event) { + items.push(event) + }, + }) + + setTimeout(() => { + sub.close() + + if (items.length > 0) { + render({loading: false, items}) + } else { + render({loading: false}) + } + }, 800) + }) + + return { + onStart: props => { + popover = tippy("body", { + getReferenceClientRect: props.clientRect, + appendTo: () => document.body, + content: target, + showOnCreate: true, + interactive: true, + trigger: "manual", + placement: "bottom-start", + }) + + render(props) + }, + onUpdate: props => { + if (props.clientRect) { + popover[0].setProps({ + getReferenceClientRect: props.clientRect, + }) + } + + render(props) + search() + }, + onKeyDown: props => { + if (props.event.key === "Escape") { + popover[0].hide() + + return true + } + + if (props.event.key === "Enter") { + const item = renderProps.items[renderProps.index] + + if (item) { + renderProps.command(item) + } + + return true + } + + if (props.event.key === "ArrowUp") { + render({index: Math.max(0, renderProps.index - 1)}) + + return true + } + + if (props.event.key === "ArrowDown") { + render({index: Math.min(renderProps.items.length - 1, renderProps.index + 1)}) + + return true + } + }, + onExit: () => { + popover[0].destroy() + }, + } + }, + }), + ] + }, + }) + ) if (settings.nevent1) baseExtensions.push(NEventExtension.extend({ addNodeView: () => ReactNodeViewRenderer(NEvent) })) if (settings.naddr1) baseExtensions.push(NAddrExtension.extend({ addNodeView: () => ReactNodeViewRenderer(NAddr) })) diff --git a/examples/react/src/components/PersonSuggestions.tsx b/examples/react/src/components/PersonSuggestions.tsx new file mode 100644 index 0000000..75da605 --- /dev/null +++ b/examples/react/src/components/PersonSuggestions.tsx @@ -0,0 +1,15 @@ +export function PersonSuggestions({query, command, loading, items, index}) { + console.log({query, command, loading, items}) + return loading + ?
loading...
+ :
+ {items.slice(0, 10).map((item, i) => { + const className = `px-3 py-2 hover:bg-gray-100 cursor-pointer ${index === i ? 'bg-gray-100' : ''}` + const {name, display_name} = JSON.parse(item.content) + + return
command(item)} key={item.id}> + {name || display_name} +
+ })} +
+} diff --git a/package.json b/package.json index fe6d403..5ab7347 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,9 @@ "markdown-it": "^14.1.0", "nostr-tools": "^2.7.1", "prosemirror-history": "^1.4.1", + "prosemirror-markdown": "^1.13.0", "prosemirror-model": "^1.22.1", "prosemirror-state": "^1.4.3", - "prosemirror-markdown": "^1.13.0", "tiptap-markdown": "^0.8.10", "tlds": "^1.254.0" } diff --git a/src/extensions/NProfileExtension.ts b/src/extensions/NProfileExtension.ts index 5816fa5..5734442 100644 --- a/src/extensions/NProfileExtension.ts +++ b/src/extensions/NProfileExtension.ts @@ -1,8 +1,8 @@ import { nip19 } from 'nostr-tools' import type { ProfilePointer } from 'nostr-tools/nip19' -import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' +import {nodePasteRule, Node} from '@tiptap/core' import {createPasteRuleMatch} from './util' export const NPUB_REGEX = /(nostr:)?(npub1[0-9a-z]+)/g @@ -11,18 +11,13 @@ export const NPROFILE_REGEX = /(nostr:)?(nprofile1[0-9a-z]+)/g export const NProfileExtension = Node.create({ name: 'nprofile', - inline: true, - inclusive: true, - group: 'inline', - content: 'text?', - addAttributes() { return { - pubkey: { default: null }, + pubkey: { default: null, }, relays: { default: [] }, } }, @@ -76,3 +71,4 @@ export const NProfileExtension = Node.create({ ] }, }) + From 35444ceb646e5a15ef3b1a56173d6def64b7921f Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 18:37:21 +0200 Subject: [PATCH 15/23] Add nostr: link as attributes --- src/extensions/NAddrExtension.ts | 20 ++++++++++++------- src/extensions/NEventExtension.ts | 31 +++++++++++++++++++---------- src/extensions/NProfileExtension.ts | 30 +++++++++++++++++----------- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/extensions/NAddrExtension.ts b/src/extensions/NAddrExtension.ts index 630192f..459e96a 100644 --- a/src/extensions/NAddrExtension.ts +++ b/src/extensions/NAddrExtension.ts @@ -3,7 +3,7 @@ import type { AddressPointer } from 'nostr-tools/nip19' import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' -import {createPasteRuleMatch} from './util' +import { createPasteRuleMatch } from './util' export const NADDR_REGEX = /(nostr:)?(naddr1[0-9a-z]+)/g @@ -16,10 +16,11 @@ export const NAddrExtension = Node.create({ selectable: true, - content: 'text*', + draggable: true, addAttributes() { return { + naddr: { default: null }, identifier: { default: null }, pubkey: { default: null }, kind: { default: null }, @@ -28,14 +29,18 @@ export const NAddrExtension = Node.create({ }, renderHTML() { - return ['div', {}, 0] + return ['div', {}] + }, + + renderText(props) { + return props.node.attrs.naddr }, addStorage() { return { markdown: { serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) + state.write(node.attrs.naddr) }, parse: {}, }, @@ -46,15 +51,16 @@ export const NAddrExtension = Node.create({ return [ nodePasteRule({ type: this.type, - getAttributes: match => match.data, - find: text => { + getAttributes: (match) => match.data, + find: (text) => { const matches = [] for (const match of text.matchAll(NADDR_REGEX)) { try { + const naddr = match[0] const data = nip19.decode(match[2]).data as AddressPointer - matches.push(createPasteRuleMatch(match, data)) + matches.push(createPasteRuleMatch(match, { ...data, naddr })) } catch (e) { continue } diff --git a/src/extensions/NEventExtension.ts b/src/extensions/NEventExtension.ts index 3afe95a..28a275a 100644 --- a/src/extensions/NEventExtension.ts +++ b/src/extensions/NEventExtension.ts @@ -3,7 +3,7 @@ import type { EventPointer } from 'nostr-tools/nip19' import { Node, nodePasteRule } from '@tiptap/core' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' -import {createPasteRuleMatch} from './util' +import { createPasteRuleMatch } from './util' export const NOTE_REGEX = /(nostr:)?(note1[0-9a-z]+)/g @@ -14,11 +14,9 @@ export const NEventExtension = Node.create({ group: 'block', - atom: true, - selectable: true, - content: 'text*', + draggable: true, addAttributes() { return { @@ -26,18 +24,27 @@ export const NEventExtension = Node.create({ kind: { default: null }, author: { default: null }, relays: { default: [] }, + nevent: { default: null }, } }, - renderHTML() { - return ['div', {}, 0] + renderHTML(p) { + return ['div', { 'data-nevent': p.node.attrs.nevent }] + }, + + renderText(props) { + return props.node.attrs.nevent + }, + + parseHTML() { + return [{ tag: 'div[data-nevent]' }] }, addStorage() { return { markdown: { serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) + state.write(node.attrs.nevent) }, parse: {}, }, @@ -48,15 +55,16 @@ export const NEventExtension = Node.create({ return [ nodePasteRule({ type: this.type, - getAttributes: match => match.data, - find: text => { + getAttributes: (match) => match.data, + find: (text) => { const matches = [] for (const match of text.matchAll(NOTE_REGEX)) { try { const id = nip19.decode(match[2]).data as string + const nevent = match[0] - matches.push(createPasteRuleMatch(match, {id})) + matches.push(createPasteRuleMatch(match, { id, nevent })) } catch (e) { continue } @@ -65,8 +73,9 @@ export const NEventExtension = Node.create({ for (const match of text.matchAll(NEVENT_REGEX)) { try { const data = nip19.decode(match[2]).data as EventPointer + const nevent = match[0] - matches.push(createPasteRuleMatch(match, data)) + matches.push(createPasteRuleMatch(match, { ...data, nevent })) } catch (e) { continue } diff --git a/src/extensions/NProfileExtension.ts b/src/extensions/NProfileExtension.ts index 5734442..fc673ad 100644 --- a/src/extensions/NProfileExtension.ts +++ b/src/extensions/NProfileExtension.ts @@ -2,8 +2,8 @@ import { nip19 } from 'nostr-tools' import type { ProfilePointer } from 'nostr-tools/nip19' import type { Node as ProsemirrorNode } from '@tiptap/pm/model' import type { MarkdownSerializerState } from 'prosemirror-markdown' -import {nodePasteRule, Node} from '@tiptap/core' -import {createPasteRuleMatch} from './util' +import { Node, nodePasteRule } from '@tiptap/core' +import { createPasteRuleMatch } from './util' export const NPUB_REGEX = /(nostr:)?(npub1[0-9a-z]+)/g @@ -12,25 +12,30 @@ export const NPROFILE_REGEX = /(nostr:)?(nprofile1[0-9a-z]+)/g export const NProfileExtension = Node.create({ name: 'nprofile', inline: true, - inclusive: true, group: 'inline', - content: 'text?', + atom: true, + addAttributes() { return { - pubkey: { default: null, }, + nprofile: { default: null }, + pubkey: { default: null }, relays: { default: [] }, } }, renderHTML() { - return ['div', {}, 0] + return ['span', { 'data-type': 'nprofile' }, '@'] + }, + + renderText(props) { + return props.node.attrs.nprofile }, addStorage() { return { markdown: { serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) + state.write(node.attrs.nprofile) }, parse: {}, }, @@ -41,15 +46,16 @@ export const NProfileExtension = Node.create({ return [ nodePasteRule({ type: this.type, - getAttributes: match => match.data, - find: text => { + getAttributes: (match) => match.data, + find: (text) => { const matches = [] for (const match of text.matchAll(NPUB_REGEX)) { try { + const nprofile = match[0] const pubkey = nip19.decode(match[2]).data as string - matches.push(createPasteRuleMatch(match, {pubkey})) + matches.push(createPasteRuleMatch(match, { pubkey, nprofile })) } catch (e) { continue } @@ -57,9 +63,10 @@ export const NProfileExtension = Node.create({ for (const match of text.matchAll(NPROFILE_REGEX)) { try { + const nprofile = match[0] const data = nip19.decode(match[2]).data as ProfilePointer - matches.push(createPasteRuleMatch(match, data)) + matches.push(createPasteRuleMatch(match, { ...data, nprofile })) } catch (e) { continue } @@ -71,4 +78,3 @@ export const NProfileExtension = Node.create({ ] }, }) - From 0d497556405936dad67ef6107abf5675437ae426 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 18:38:04 +0200 Subject: [PATCH 16/23] Don't pass text content when replacing nodes, just pass as attribute --- src/extensions/NostrParserExtension.ts | 112 ++++++++++++++++++------- 1 file changed, 81 insertions(+), 31 deletions(-) diff --git a/src/extensions/NostrParserExtension.ts b/src/extensions/NostrParserExtension.ts index 6e0fae7..5b75c8c 100644 --- a/src/extensions/NostrParserExtension.ts +++ b/src/extensions/NostrParserExtension.ts @@ -1,14 +1,24 @@ -import { Extension } from '@tiptap/core'; -import { type NostrEvent } from 'nostr-tools'; -import type { Attrs, MarkType, NodeType } from 'prosemirror-model'; -import type { Transaction } from 'prosemirror-state'; -import { findLinks } from '../plugins/NostrMatcherPlugin/matchers/findLinks'; -import { findNostrRefs } from '../plugins/NostrMatcherPlugin/matchers/findNostrRefs'; -import { findTags } from '../plugins/NostrMatcherPlugin/matchers/findTags'; -import { parseReferences, type NostrReference } from '../plugins/NostrMatcherPlugin/nip27.references'; -import { parseImeta, type IMetaTags } from '../plugins/NostrMatcherPlugin/nip92.imeta'; -import type { Matches } from '../plugins/NostrMatcherPlugin/NostrMatcherPlugin'; -import { removeIntersectingNodes } from '../plugins/NostrMatcherPlugin/utils'; +import type { AnyExtension } from '@tiptap/core' +import { Extension, getText } from '@tiptap/core' +import ImageExtension from '@tiptap/extension-image' +import YoutubeExtension from '@tiptap/extension-youtube' +import { type NostrEvent } from 'nostr-tools' +import { type Attrs, type MarkType, type NodeType } from 'prosemirror-model' +import type { Transaction } from 'prosemirror-state' +import { findLinks } from '../helpers/findLinks' +import { findNostrRefs } from '../helpers/findNostrRefs' +import { findTags } from '../helpers/findTags' +import { parseReferences, type NostrReference } from '../helpers/nip27.references' +import { parseImeta, type IMetaTags } from '../helpers/nip92.imeta' +import type { Matches } from '../plugins/AutoLinkPlugin' +import { removeIntersectingNodes } from '../helpers/utils' +import { LinkExtension } from './LinkExtension' +import { NAddrExtension } from './NAddrExtension' +import { NEventExtension } from './NEventExtension' +import { NProfileExtension } from './NProfileExtension' +import { TagExtension } from './TagExtension' +import { TweetExtension } from './TweetExtension' +import { VideoExtension } from './VideoExtension' declare module '@tiptap/core' { interface Commands { @@ -18,9 +28,57 @@ declare module '@tiptap/core' { } } -export const NostrParserExtension = Extension.create({ +export interface NostrParserOptions { + nprofile: boolean + nevent: boolean + naddr: boolean + link: boolean + image: boolean + youtube: boolean + tweet: boolean + video: boolean + tag: boolean +} + +export const NostrParserExtension = Extension.create({ name: 'nostrparser', - priority: 100, + + addExtensions() { + const extensions = [] as AnyExtension[] + if (this.options.nprofile !== false) { + extensions.push(NProfileExtension) + } + if (this.options.nevent !== false) { + extensions.push(NEventExtension) + } + if (this.options.naddr !== false) { + extensions.push(NAddrExtension) + } + if (this.options.link !== false) { + extensions.push(LinkExtension) + } + if (this.options.tag !== false) { + extensions.push(TagExtension) + } + if (this.options.image !== false) { + extensions.push( + ImageExtension.extend({ + renderText: (p) => p.node.attrs.src, + }), + ) + } + if (this.options.video !== false) { + extensions.push(VideoExtension) + } + if (this.options.youtube !== false) { + extensions.push(YoutubeExtension) + } + if (this.options.tweet !== false) { + extensions.push(TweetExtension) + } + return extensions + }, + addCommands() { return { parseNote: (event: NostrEvent, imeta?: IMetaTags, references?: NostrReference[]) => (props) => { @@ -29,24 +87,16 @@ export const NostrParserExtension = Extension.create({ tr.addMark(from, to, mark.create(attrs)) } } - function replaceWith( - tr: Transaction, - from: number, - to: number, - node: NodeType | undefined, - attrs: Attrs, - content?: string, - ) { + function replaceWith(tr: Transaction, from: number, to: number, node: NodeType | undefined, attrs: Attrs) { if (node) { - tr.replaceWith(from, to, node.create(attrs, content ? node.schema.text(content) : null)) + tr.replaceWith(from, to, node.create(attrs)) } } props.commands.setContent(event.content) - const content = event.kind === 1 ? event.content : props.tr.doc.textContent - const tr = props.state.tr + const content = getText(tr.doc) const refs = findNostrRefs(content, references || parseReferences({ content })) const links = findLinks(content, imeta || parseImeta(event.tags)) @@ -69,19 +119,19 @@ export const NostrParserExtension = Extension.create({ break } case 'image': { - replaceWith(tr, from, to, nodes.image, { src: match.href }, text) + replaceWith(tr, from, to, nodes.image, { src: match.href }) break } case 'youtube': { - replaceWith(tr, from, to, nodes.youtube, { src: match.href }, text) + replaceWith(tr, from, to, nodes.youtube, { src: match.href }) break } case 'tweet': { - replaceWith(tr, from, to, nodes.tweet, { src: match.href }, text) + replaceWith(tr, from, to, nodes.tweet, { src: match.href }) break } case 'video': { - replaceWith(tr, from, to, nodes.video, { src: match.href }, text) + replaceWith(tr, from, to, nodes.video, { src: match.href }) break } case 'tag': { @@ -93,16 +143,16 @@ export const NostrParserExtension = Extension.create({ switch (ref.prefix) { case 'npub': case 'nprofile': { - replaceWith(tr, from, to, nodes.nprofile, ref.profile, text) + replaceWith(tr, from, to, nodes.nprofile, { ...ref.profile, nprofile: text }) break } case 'note': case 'nevent': { - replaceWith(tr, from, to, nodes.nevent, ref.event, text) + replaceWith(tr, from, to, nodes.nevent, { ...ref.event, nevent: text }) break } case 'naddr': { - replaceWith(tr, from, to, nodes.naddr, ref.address, text) + replaceWith(tr, from, to, nodes.naddr, { ...ref.address, naddr: text }) break } default: { From 8a05ba6f2d67473e2e7cbd690630c0513ad3c301 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 21:16:41 +0200 Subject: [PATCH 17/23] Moved all other extensions to the package * Moved some files to helper folder --- .../react/src/extensions/LinkExtension.ts | 19 ------ .../extensions/ImageExtension.ts | 35 ---------- .../testExtensions/extensions/TagExtension.ts | 41 ------------ .../extensions/TweetExtension.ts | 19 ------ .../extensions/VideoExtension.ts | 25 ------- .../testExtensions/extensions/index.ts | 32 --------- src/extensions/AutoLinkExtension.ts | 10 +++ .../extensions/LinkExtension.ts | 0 src/extensions/NostrMatcherExtension.ts | 15 ----- .../src => src}/extensions/TagExtension.ts | 0 .../src => src}/extensions/TweetExtension.ts | 14 ++-- .../src => src}/extensions/VideoExtension.ts | 12 ++-- src/extensions/util.ts | 8 ++- .../matchers => helpers}/findLinks.ts | 6 +- .../matchers => helpers}/findNostrRefs.ts | 6 +- .../matchers => helpers}/findTags.ts | 2 +- .../nip27.references.ts | 0 .../nip92.imeta.ts | 0 .../NostrMatcherPlugin => helpers}/types.ts | 0 .../NostrMatcherPlugin => helpers}/utils.ts | 2 +- src/index.ts | 7 +- ...ostrMatcherPlugin.ts => AutoLinkPlugin.ts} | 67 +++++-------------- 22 files changed, 60 insertions(+), 260 deletions(-) delete mode 100644 examples/react/src/extensions/LinkExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/ImageExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/TagExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/TweetExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/VideoExtension.ts delete mode 100644 src/__tests__/testExtensions/extensions/index.ts create mode 100644 src/extensions/AutoLinkExtension.ts rename src/{__tests__/testExtensions => }/extensions/LinkExtension.ts (100%) delete mode 100644 src/extensions/NostrMatcherExtension.ts rename {examples/react/src => src}/extensions/TagExtension.ts (100%) rename {examples/react/src => src}/extensions/TweetExtension.ts (79%) rename {examples/react/src => src}/extensions/VideoExtension.ts (69%) rename src/{plugins/NostrMatcherPlugin/matchers => helpers}/findLinks.ts (91%) rename src/{plugins/NostrMatcherPlugin/matchers => helpers}/findNostrRefs.ts (74%) rename src/{plugins/NostrMatcherPlugin/matchers => helpers}/findTags.ts (90%) rename src/{plugins/NostrMatcherPlugin => helpers}/nip27.references.ts (100%) rename src/{plugins/NostrMatcherPlugin => helpers}/nip92.imeta.ts (100%) rename src/{plugins/NostrMatcherPlugin => helpers}/types.ts (100%) rename src/{plugins/NostrMatcherPlugin => helpers}/utils.ts (90%) rename src/plugins/{NostrMatcherPlugin/NostrMatcherPlugin.ts => AutoLinkPlugin.ts} (79%) diff --git a/examples/react/src/extensions/LinkExtension.ts b/examples/react/src/extensions/LinkExtension.ts deleted file mode 100644 index b2065ce..0000000 --- a/examples/react/src/extensions/LinkExtension.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Mark } from '@tiptap/core' - -export const LinkExtension = Mark.create({ - name: 'link' as const, - - inclusive: false, - - excludes: '_', - - addAttributes() { - return { - href: { default: null }, - } - }, - - renderHTML(p) { - return ['a', p.mark.attrs, 0] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/ImageExtension.ts b/src/__tests__/testExtensions/extensions/ImageExtension.ts deleted file mode 100644 index 394b6d6..0000000 --- a/src/__tests__/testExtensions/extensions/ImageExtension.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { mergeAttributes, Node } from '@tiptap/core' - -export interface ImageOptions {} - -export const ImageExtension = Node.create({ - name: 'image', - - inline: false, - - group: 'block', - - draggable: false, - - content: 'text*', - - addAttributes() { - return { - src: { default: null }, - alt: { default: null }, - title: { default: null }, - } - }, - - parseHTML() { - return [ - { - tag: 'img[src]', - }, - ] - }, - - renderHTML({ HTMLAttributes }) { - return ['img', mergeAttributes(HTMLAttributes)] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/TagExtension.ts b/src/__tests__/testExtensions/extensions/TagExtension.ts deleted file mode 100644 index 6e41e2a..0000000 --- a/src/__tests__/testExtensions/extensions/TagExtension.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Mark } from '@tiptap/core' - -export interface TagAttributes { - tag: string -} - -export const TagExtension = Mark.create({ - name: 'tag', - - inline: true, - - selectable: true, - - inclusive: false, - - group: 'inline', - - addStorage() { - return { - markdown: { - serialize: { - open: '', - close: '', - mixable: false, - expelEnclosingWhitespace: true, - }, - parse: {}, - }, - } - }, - - renderHTML(p) { - return ['a', { ...p.mark.attrs }, 0] - }, - - addAttributes() { - return { - tag: { default: null }, - } - }, -}) diff --git a/src/__tests__/testExtensions/extensions/TweetExtension.ts b/src/__tests__/testExtensions/extensions/TweetExtension.ts deleted file mode 100644 index b159d20..0000000 --- a/src/__tests__/testExtensions/extensions/TweetExtension.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Node } from '@tiptap/core' - -export const TweetExtension = Node.create({ - name: 'tweet', - - group: 'block', - - atom: true, - - addAttributes() { - return { - src: { default: null }, - } - }, - - renderHTML() { - return ['div', {}, 0] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/VideoExtension.ts b/src/__tests__/testExtensions/extensions/VideoExtension.ts deleted file mode 100644 index a2bf3c3..0000000 --- a/src/__tests__/testExtensions/extensions/VideoExtension.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Node } from '@tiptap/core' - -export const VideoExtension = Node.create({ - name: 'video', - - inline: false, - - inclusive: false, - - group: 'block', - - atom: true, - - content: 'text*', - - addAttributes() { - return { - src: { default: null }, - } - }, - - renderHTML() { - return ['a', {}, 0] - }, -}) diff --git a/src/__tests__/testExtensions/extensions/index.ts b/src/__tests__/testExtensions/extensions/index.ts deleted file mode 100644 index 4d6a977..0000000 --- a/src/__tests__/testExtensions/extensions/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import YoutubeExtension from '@tiptap/extension-youtube' -import StarterKit from '@tiptap/starter-kit' -import { Markdown as MarkdownExtension } from 'tiptap-markdown' -import { ImageExtension } from './ImageExtension' -import { LinkExtension } from './LinkExtension' -import { TagExtension } from './TagExtension' -import { TweetExtension } from './TweetExtension' -import { VideoExtension } from './VideoExtension' -import { NAddrExtension } from '../../../extensions/NAddrExtension' -import { NEventExtension } from '../../../extensions/NEventExtension' -import { NProfileExtension } from '../../../extensions/NProfileExtension' -import { NostrParserExtension } from '../../../extensions/NostrParserExtension' - -export function getExtensions() { - return [ - StarterKit.configure({ history: false }), - NostrParserExtension, - TagExtension, - LinkExtension, - NAddrExtension, - NEventExtension, - NProfileExtension, - TweetExtension, - ImageExtension, - VideoExtension.extend({ renderText: (p) => p.node.attrs.src }), - YoutubeExtension.extend({ renderText: (p) => p.node.attrs.src }), - ] -} - -export function getExtensionsMarkdown() { - return [...getExtensions(), MarkdownExtension] -} diff --git a/src/extensions/AutoLinkExtension.ts b/src/extensions/AutoLinkExtension.ts new file mode 100644 index 0000000..3f13768 --- /dev/null +++ b/src/extensions/AutoLinkExtension.ts @@ -0,0 +1,10 @@ +import { Extension } from '@tiptap/core' +import { AutoLinkPlugin } from '../plugins/AutoLinkPlugin' + +export const AutoLinkExtension = Extension.create({ + name: 'autolink', + + addProseMirrorPlugins() { + return [new AutoLinkPlugin().plugin] + }, +}) diff --git a/src/__tests__/testExtensions/extensions/LinkExtension.ts b/src/extensions/LinkExtension.ts similarity index 100% rename from src/__tests__/testExtensions/extensions/LinkExtension.ts rename to src/extensions/LinkExtension.ts diff --git a/src/extensions/NostrMatcherExtension.ts b/src/extensions/NostrMatcherExtension.ts deleted file mode 100644 index acd53e3..0000000 --- a/src/extensions/NostrMatcherExtension.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Extension } from '@tiptap/core' -import { NostrMatcherPlugin } from '../plugins/NostrMatcherPlugin/NostrMatcherPlugin' -import type { IMetaFields } from '../plugins/NostrMatcherPlugin/nip92.imeta' - -type Storage = { - imeta?: IMetaFields -} - -export const NostrMatcherExtension = Extension.create({ - name: 'nostrMatcher', - - addProseMirrorPlugins() { - return [new NostrMatcherPlugin().plugin] - }, -}) diff --git a/examples/react/src/extensions/TagExtension.ts b/src/extensions/TagExtension.ts similarity index 100% rename from examples/react/src/extensions/TagExtension.ts rename to src/extensions/TagExtension.ts diff --git a/examples/react/src/extensions/TweetExtension.ts b/src/extensions/TweetExtension.ts similarity index 79% rename from examples/react/src/extensions/TweetExtension.ts rename to src/extensions/TweetExtension.ts index fc55f44..69c534c 100644 --- a/examples/react/src/extensions/TweetExtension.ts +++ b/src/extensions/TweetExtension.ts @@ -7,13 +7,9 @@ export const TweetExtension = Node.create({ group: 'block', - atom: true, - - isolating: true, - selectable: true, - content: 'text*', + draggable: true, addAttributes() { return { @@ -25,14 +21,18 @@ export const TweetExtension = Node.create({ return { markdown: { serialize(state: MarkdownSerializerState, node: ProsemirrorNode) { - state.write(node.textContent) + state.write(node.attrs.src) }, parse: {}, }, } }, + renderText(props) { + return props.node.attrs.src + }, + renderHTML() { - return ['div', {}, 0] + return ['div', {}] }, }) diff --git a/examples/react/src/extensions/VideoExtension.ts b/src/extensions/VideoExtension.ts similarity index 69% rename from examples/react/src/extensions/VideoExtension.ts rename to src/extensions/VideoExtension.ts index 67a2fd9..78a7d6d 100644 --- a/examples/react/src/extensions/VideoExtension.ts +++ b/src/extensions/VideoExtension.ts @@ -7,13 +7,13 @@ export const VideoExtension = Node.create({ inclusive: false, - isolating: true, - group: 'block', atom: true, - content: 'text*', + selectable: true, + + draggable: true, addAttributes() { return { @@ -21,7 +21,11 @@ export const VideoExtension = Node.create({ } }, + renderText(props) { + return props.node.attrs.src + }, + renderHTML() { - return ['a', {}, 0] + return ['a', {}] }, }) diff --git a/src/extensions/util.ts b/src/extensions/util.ts index c9ee957..4b1d5e5 100644 --- a/src/extensions/util.ts +++ b/src/extensions/util.ts @@ -1,4 +1,6 @@ -import type {PasteRuleMatch} from '@tiptap/core' +import type { PasteRuleMatch } from '@tiptap/core' -export const createPasteRuleMatch = >(match: RegExpMatchArray, data: T): PasteRuleMatch => - ({index: match.index!, replaceWith: match[2], text: match[0], match, data}) +export const createPasteRuleMatch = >( + match: RegExpMatchArray, + data: T, +): PasteRuleMatch => ({ index: match.index!, replaceWith: match[2], text: match[0], match, data }) diff --git a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts b/src/helpers/findLinks.ts similarity index 91% rename from src/plugins/NostrMatcherPlugin/matchers/findLinks.ts rename to src/helpers/findLinks.ts index aeaa235..73afdd5 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findLinks.ts +++ b/src/helpers/findLinks.ts @@ -1,7 +1,7 @@ import * as linkifyjs from 'linkifyjs' -import type { IMetaTags } from '../nip92.imeta' -import type { MatchBase } from '../types' -import { isValidTLD } from '../utils' +import type { IMetaTags } from './nip92.imeta' +import type { MatchBase } from './types' +import { isValidTLD } from './utils' const IMAGE_EXTENSIONS = /.(jpg|jpeg|gif|png|bmp|svg|webp)$/ const VIDEO_EXTENSIONS = /.(webm|mp4|ogg|mov)$/ diff --git a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts b/src/helpers/findNostrRefs.ts similarity index 74% rename from src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts rename to src/helpers/findNostrRefs.ts index a90ea9c..e9fb8e6 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findNostrRefs.ts +++ b/src/helpers/findNostrRefs.ts @@ -1,6 +1,6 @@ -import type { NostrReference } from '../nip27.references' -import { parseReferences } from '../nip27.references' -import type { MatchBase } from '../types' +import type { NostrReference } from './nip27.references' +import { parseReferences } from './nip27.references' +import type { MatchBase } from './types' export interface MatchNostr extends MatchBase { kind: 'nostr' diff --git a/src/plugins/NostrMatcherPlugin/matchers/findTags.ts b/src/helpers/findTags.ts similarity index 90% rename from src/plugins/NostrMatcherPlugin/matchers/findTags.ts rename to src/helpers/findTags.ts index 0d82156..655b73c 100644 --- a/src/plugins/NostrMatcherPlugin/matchers/findTags.ts +++ b/src/helpers/findTags.ts @@ -1,4 +1,4 @@ -import type { MatchBase } from '../types' +import type { MatchBase } from './types' export interface MatchTag extends MatchBase { kind: 'tag' diff --git a/src/plugins/NostrMatcherPlugin/nip27.references.ts b/src/helpers/nip27.references.ts similarity index 100% rename from src/plugins/NostrMatcherPlugin/nip27.references.ts rename to src/helpers/nip27.references.ts diff --git a/src/plugins/NostrMatcherPlugin/nip92.imeta.ts b/src/helpers/nip92.imeta.ts similarity index 100% rename from src/plugins/NostrMatcherPlugin/nip92.imeta.ts rename to src/helpers/nip92.imeta.ts diff --git a/src/plugins/NostrMatcherPlugin/types.ts b/src/helpers/types.ts similarity index 100% rename from src/plugins/NostrMatcherPlugin/types.ts rename to src/helpers/types.ts diff --git a/src/plugins/NostrMatcherPlugin/utils.ts b/src/helpers/utils.ts similarity index 90% rename from src/plugins/NostrMatcherPlugin/utils.ts rename to src/helpers/utils.ts index 6fb3ac9..49a675a 100644 --- a/src/plugins/NostrMatcherPlugin/utils.ts +++ b/src/helpers/utils.ts @@ -1,6 +1,6 @@ import extractDomain from 'extract-domain' import tlds from 'tlds' -import type { Matches } from './NostrMatcherPlugin' +import type { Matches } from '../plugins/AutoLinkPlugin' export function isValidTLD(str: string): boolean { const domain = extractDomain(str) diff --git a/src/index.ts b/src/index.ts index 0e5ee88..c9fb886 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,10 @@ -export { NostrMatcherExtension } from './extensions/NostrMatcherExtension' +export { AutoLinkExtension } from './extensions/AutoLinkExtension' export { NProfileExtension } from './extensions/NProfileExtension' export { NEventExtension } from './extensions/NEventExtension' export { NAddrExtension } from './extensions/NAddrExtension' +export { LinkExtension } from './extensions/LinkExtension' +export { VideoExtension } from './extensions/VideoExtension' +export { TagExtension } from './extensions/TagExtension' +export { TweetExtension } from './extensions/TweetExtension' +export { NostrClipboardExtension } from './extensions/NostrClipboardExtension' export * from './types' diff --git a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts b/src/plugins/AutoLinkPlugin.ts similarity index 79% rename from src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts rename to src/plugins/AutoLinkPlugin.ts index c649964..5197a00 100644 --- a/src/plugins/NostrMatcherPlugin/NostrMatcherPlugin.ts +++ b/src/plugins/AutoLinkPlugin.ts @@ -2,23 +2,23 @@ import { combineTransactionSteps, getChangedRanges, type Range } from '@tiptap/c import { undoDepth } from 'prosemirror-history' import type { Attrs, MarkType, Node, NodeType } from 'prosemirror-model' import { Plugin, PluginKey, type EditorState, type Transaction } from 'prosemirror-state' -import type { MatchLinks } from './matchers/findLinks' -import { findLinks } from './matchers/findLinks' -import type { MatchNostr } from './matchers/findNostrRefs' -import { findNostrRefs } from './matchers/findNostrRefs' -import type { MatchTag } from './matchers/findTags' -import { findTags } from './matchers/findTags' -import type { GetMarkRange, NodeWithPosition } from './types' -import { isValidTLD, removeIntersectingNodes } from './utils' +import type { MatchLinks } from '../helpers/findLinks' +import { findLinks } from '../helpers/findLinks' +import type { MatchNostr } from '../helpers/findNostrRefs' +import { findNostrRefs } from '../helpers/findNostrRefs' +import type { MatchTag } from '../helpers/findTags' +import { findTags } from '../helpers/findTags' +import type { GetMarkRange, NodeWithPosition } from '../helpers/types' +import { isValidTLD, removeIntersectingNodes } from '../helpers/utils' export type Matches = MatchLinks | MatchNostr | MatchTag -export class NostrMatcherPlugin { +export class AutoLinkPlugin { plugin: Plugin constructor() { this.plugin = new Plugin({ - key: new PluginKey('nostr'), + key: new PluginKey('autolink'), appendTransaction: (transactions, oldState, newState) => { const isUndo = undoDepth(oldState) - undoDepth(newState) === 1 @@ -108,27 +108,11 @@ export class NostrMatcherPlugin { return tr }, - - props: { - clipboardTextSerializer(slice) { - let text = '' - slice.content.descendants((node) => { - if (node.type.name === 'paragraph') { - return - } - text += node.textContent - if (node.type.name === 'nprofile') { - text += node.attrs.text - } - }) - return text - }, - }, }) } private replaceNodes(tr: Transaction, state: EditorState, match: Matches) { - const { kind, text, from, to } = match + const { kind, from, to } = match const { nodes, marks } = state.schema switch (kind) { case 'text': { @@ -136,43 +120,25 @@ export class NostrMatcherPlugin { break } case 'image': { - this.replaceWith(tr, from, to, nodes.image, { src: match.href }, text) + this.replaceWith(tr, from, to, nodes.image, { src: match.href }) break } case 'youtube': { - this.replaceWith(tr, from, to, nodes.youtube, { src: match.href }, text) + this.replaceWith(tr, from, to, nodes.youtube, { src: match.href }) break } case 'tweet': { - this.replaceWith(tr, from, to, nodes.tweet, { src: match.href }, text) + this.replaceWith(tr, from, to, nodes.tweet, { src: match.href }) break } case 'video': { - this.replaceWith(tr, from, to, nodes.video, { src: match.href }, text) + this.replaceWith(tr, from, to, nodes.video, { src: match.href }) break } case 'tag': { this.addMark(tr, from, to, marks.tag, { tag: match.text }) break } - case 'nostr': { - const { ref } = match - switch (ref.prefix) { - case 'npub': - case 'nprofile': { - this.replaceWith(tr, from, to, nodes.nprofile, ref.profile, text) - break - } - case 'naddr': { - this.replaceWith(tr, from, to, nodes.naddr, ref.address, text) - break - } - default: { - break - } - } - break - } default: { break } @@ -191,10 +157,9 @@ export class NostrMatcherPlugin { to: number, node: NodeType | undefined, attrs: Attrs, - content?: string, ) { if (node) { - tr.replaceWith(from, to, node.create(attrs, content ? node.schema.text(content) : null)) + tr.replaceWith(from, to, node.create(attrs)) } } From 704c3d0fe17b223517e4a9c5a126864752780601 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 22:06:44 +0200 Subject: [PATCH 18/23] Move autocomplete search logic to a hook --- examples/react/src/App.tsx | 321 ++++++++---------- .../src/components/PersonSuggestions.tsx | 15 - examples/react/src/components/Suggestions.tsx | 74 ++++ examples/react/src/hooks/useSearch.ts | 21 ++ 4 files changed, 233 insertions(+), 198 deletions(-) delete mode 100644 examples/react/src/components/PersonSuggestions.tsx create mode 100644 examples/react/src/components/Suggestions.tsx create mode 100644 examples/react/src/hooks/useSearch.ts diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index 9fe654c..a249304 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -1,33 +1,40 @@ -import tippy from 'tippy.js' -import {throttle} from 'throttle-debounce' -import {PluginKey} from '@tiptap/pm/state' -import {mergeAttributes} from '@tiptap/core' -import Suggestion from '@tiptap/suggestion' +import DocumentExtension from '@tiptap/extension-document' +import Dropcursor from '@tiptap/extension-dropcursor' import ImageExtension from '@tiptap/extension-image' +import ParagraphExtension from '@tiptap/extension-paragraph' +import TextExtension from '@tiptap/extension-text' import YoutubeExtension from '@tiptap/extension-youtube' -import { Markdown as MarkdownExtension } from 'tiptap-markdown' +import { PluginKey } from '@tiptap/pm/state' import type { AnyExtension } from '@tiptap/react' -import { EditorContent, ReactNodeViewRenderer, useEditor } from '@tiptap/react' +import { EditorContent, ReactNodeViewRenderer, ReactRenderer, useEditor } from '@tiptap/react' import { StarterKit } from '@tiptap/starter-kit' -import { NostrMatcherExtension, NEventExtension, NAddrExtension, NProfileExtension } from 'nostr-editor' -import ReactDOM from 'react-dom/client' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import Suggestion from '@tiptap/suggestion' +import { + AutoLinkExtension, + LinkExtension, + NAddrExtension, + NEventExtension, + NProfileExtension, + TagExtension, + TweetExtension, + VideoExtension, +} from 'nostr-editor' +import { nip19 } from 'nostr-tools' +import { useCallback, useMemo, useRef, useState } from 'react' import ReactJsonView from 'react-json-view' +import type { Instance } from 'tippy.js' +import tippy from 'tippy.js' +import { Markdown as MarkdownExtension } from 'tiptap-markdown' import { Image } from './components/Image' import { Mention } from './components/Mention' import { NAddr } from './components/NAddr' import { NEvent } from './components/NEvent' +import Suggestions from './components/Suggestions' import { Tweet } from './components/Tweet' import { Video } from './components/Video' -import { PersonSuggestions } from './components/PersonSuggestions' -import { LinkExtension } from './extensions/LinkExtension' -import { TagExtension } from './extensions/TagExtension' -import { TweetExtension } from './extensions/TweetExtension' -import { VideoExtension } from './extensions/VideoExtension' -import { TestText } from './TestText' import { Sidebar } from './Sidebar' -import type { EditorType, EditorExtensionSettings } from './types' -import { pool } from './nostr' +import { TestText } from './TestText' +import type { EditorExtensionSettings, EditorType } from './types' function App() { const [raw, setRaw] = useState('') @@ -45,36 +52,33 @@ function App() { tweet: true, }) const extensions = useMemo(() => { - const baseExtensions: AnyExtension[] = [] + const baseExtensions: AnyExtension[] = [Dropcursor] if (type === 'text') { // Disabled markdown elements - baseExtensions.push( - StarterKit.configure({ - heading: false, - bold: false, - italic: false, - strike: false, - listItem: false, - bulletList: false, - orderedList: false, - code: false, - codeBlock: false, - blockquote: false, - }), - ) - } else { - // Markdown - // StarterKit already bundles markdown elements + baseExtensions.push(DocumentExtension) + baseExtensions.push(ParagraphExtension) + baseExtensions.push(TextExtension) + } else if (type === 'markdown') { + // StarterKit already bundles some markdown elements baseExtensions.push(MarkdownExtension) baseExtensions.push(StarterKit) + } else { + // todo } - baseExtensions.push(NostrMatcherExtension) - - if (settings.links) baseExtensions.push(LinkExtension) - if (settings.tags) baseExtensions.push(TagExtension) - if (settings.videos) baseExtensions.push(VideoExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Video) })) + if (settings.links) { + baseExtensions.push(AutoLinkExtension) + } + if (settings.links) { + baseExtensions.push(LinkExtension) + } + if (settings.tags) { + baseExtensions.push(TagExtension) + } + if (settings.videos) { + baseExtensions.push(VideoExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Video) })) + } if (settings.images) baseExtensions.push( ImageExtension.extend({ @@ -82,145 +86,101 @@ function App() { renderText: (p) => p.node.attrs.src, }), ) - if (settings.youtube) baseExtensions.push(YoutubeExtension.extend({ renderText: (p) => p.node.attrs.src })) - if (settings.tweet) baseExtensions.push(TweetExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Tweet) })) + if (settings.youtube) { + baseExtensions.push(YoutubeExtension.extend({ renderText: (p) => p.node.attrs.src })) + } + if (settings.tweet) { + baseExtensions.push(TweetExtension.extend({ addNodeView: () => ReactNodeViewRenderer(Tweet) })) + } if (settings.nprofile1) baseExtensions.push( - NProfileExtension - .extend({ - addNodeView: () => ReactNodeViewRenderer(Mention), - addProseMirrorPlugins() { - return [ - Suggestion({ - char: '@', - editor: this.editor, - pluginKey: new PluginKey('@'), - command: ({editor, range, props}: any) => { - // increase range.to by one when the next node is of type "text" - // and starts with a space character - const nodeAfter = editor.view.state.selection.$to.nodeAfter - const overrideSpace = nodeAfter?.text?.startsWith(' ') - - if (overrideSpace) { - range.to += 1 - } - - const attrs = { - pubkey: props.pubkey, - relays: ['wss://purplepag.es'], - } - - editor - .chain() - .focus() - .insertContentAt(range, [ - {type: 'nprofile', attrs}, - {type: 'text', text: ' '}, - ]) - .run() - - window.getSelection()?.collapseToEnd() - }, - render: () => { - const target = document.createElement("div") - const root = ReactDOM.createRoot(target) - - let popover: any - let renderProps = {loading: false, index: 0, items: []} - - const render = newProps => { - renderProps = {...renderProps, ...newProps} - - root.render() - } - - const search = throttle(800, async () => { - render({loading: true}) - - const items = [] - const sub = pool.subscribeMany(['wss://relay.nostr.band'], [{kinds: [0], search: renderProps.query}], { - onevent(event) { - items.push(event) - }, + NProfileExtension.extend({ + addNodeView: () => ReactNodeViewRenderer(Mention), + addProseMirrorPlugins() { + return [ + Suggestion({ + char: '@', + editor: this.editor, + pluginKey: new PluginKey('@'), + command: ({ editor, range, props }) => { + // increase range.to by one when the next node is of type "text" + // and starts with a space character + const nodeAfter = editor.view.state.selection.$to.nodeAfter + const overrideSpace = nodeAfter?.text?.startsWith(' ') + + if (overrideSpace) { + range.to += 1 + } + + const attrs = { + pubkey: props.pubkey, + relays: ['wss://purplepag.es', 'wss://relay.nostr.band'], + } + attrs.nprofile = 'nostr:' + nip19.nprofileEncode(attrs) + + editor + .chain() + .focus() + .insertContentAt(range, [ + { type: 'nprofile', attrs }, + { type: 'text', text: ' ' }, + ]) + .run() + + window.getSelection()?.collapseToEnd() + }, + render: () => { + let component: ReactRenderer + let popover: Instance[] + return { + onStart: (props) => { + component = new ReactRenderer(Suggestions, { + props, + editor: props.editor, }) - setTimeout(() => { - sub.close() - - if (items.length > 0) { - render({loading: false, items}) - } else { - render({loading: false}) - } - }, 800) - }) - - return { - onStart: props => { - popover = tippy("body", { + popover = tippy('body', { + getReferenceClientRect: props.clientRect as () => DOMRect | ClientRect, + appendTo: () => document.body, + content: component.element, + showOnCreate: true, + interactive: true, + trigger: 'manual', + placement: 'bottom-start', + }) + }, + onUpdate: (props) => { + component.updateProps(props) + if (props.clientRect) { + popover[0].setProps({ getReferenceClientRect: props.clientRect, - appendTo: () => document.body, - content: target, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom-start", }) - - render(props) - }, - onUpdate: props => { - if (props.clientRect) { - popover[0].setProps({ - getReferenceClientRect: props.clientRect, - }) - } - - render(props) - search() - }, - onKeyDown: props => { - if (props.event.key === "Escape") { - popover[0].hide() - - return true - } - - if (props.event.key === "Enter") { - const item = renderProps.items[renderProps.index] - - if (item) { - renderProps.command(item) - } - - return true - } - - if (props.event.key === "ArrowUp") { - render({index: Math.max(0, renderProps.index - 1)}) - - return true - } - - if (props.event.key === "ArrowDown") { - render({index: Math.min(renderProps.items.length - 1, renderProps.index + 1)}) - - return true - } - }, - onExit: () => { - popover[0].destroy() - }, - } - }, - }), - ] - }, - }) + } + }, + onKeyDown: (props) => { + if (props.event.key === 'Escape') { + popover[0].hide() + return true + } + return component.ref?.onKeyDown?.(props) + }, + onExit() { + popover[0].destroy() + component.destroy() + }, + } + }, + }), + ] + }, + }), ) - if (settings.nevent1) + if (settings.nevent1) { baseExtensions.push(NEventExtension.extend({ addNodeView: () => ReactNodeViewRenderer(NEvent) })) - if (settings.naddr1) baseExtensions.push(NAddrExtension.extend({ addNodeView: () => ReactNodeViewRenderer(NAddr) })) + } + if (settings.naddr1) { + baseExtensions.push(NAddrExtension.extend({ addNodeView: () => ReactNodeViewRenderer(NAddr) })) + } return baseExtensions }, [type, settings]) @@ -236,21 +196,16 @@ function App() { }, [extensions], ) - useEffect(() => { - // Preserve the content when settings change - editor?.commands.setContent(prevContent.current, true) - }, [editor, prevContent]) - const handleSnapshot = useCallback(() => { if (editor) { prevContent.current = editor.getText() if (type === 'text') { - setRaw(editor.getText()) + setRaw(editor.getText({blockSeparator: '\n'})) } else { setRaw(editor.storage.markdown.getMarkdown()) } // ReactJsonView is buggy so we need to stringify and parse - setSnapshot(JSON.parse(JSON.stringify(editor?.state.toJSON() || {})).doc.content) + setSnapshot(JSON.parse(JSON.stringify(editor?.getJSON().content || {}))) } }, [type, editor]) @@ -286,13 +241,13 @@ function App() { {raw && ( <> -

raw text

-
{raw}
+

{type === 'text' ? 'editor.getText()' : 'editor.storage.markdown.getMarkdown()'}

+
{raw}
)} {snapshot && ( -
-

Schema

+
+

editor.getJSON()

)} diff --git a/examples/react/src/components/PersonSuggestions.tsx b/examples/react/src/components/PersonSuggestions.tsx deleted file mode 100644 index 75da605..0000000 --- a/examples/react/src/components/PersonSuggestions.tsx +++ /dev/null @@ -1,15 +0,0 @@ -export function PersonSuggestions({query, command, loading, items, index}) { - console.log({query, command, loading, items}) - return loading - ?
loading...
- :
- {items.slice(0, 10).map((item, i) => { - const className = `px-3 py-2 hover:bg-gray-100 cursor-pointer ${index === i ? 'bg-gray-100' : ''}` - const {name, display_name} = JSON.parse(item.content) - - return
command(item)} key={item.id}> - {name || display_name} -
- })} -
-} diff --git a/examples/react/src/components/Suggestions.tsx b/examples/react/src/components/Suggestions.tsx new file mode 100644 index 0000000..c49ca49 --- /dev/null +++ b/examples/react/src/components/Suggestions.tsx @@ -0,0 +1,74 @@ +import type { NostrEvent } from 'nostr-tools' +import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' +import { useSearch } from '../hooks/useSearch' + +type Props = { + query: string + command: (event: NostrEvent) => void +} + +const Suggestions = forwardRef(function Suggestions(props: Props, ref) { + const [selectedIndex, setSelectedIndex] = useState(0) + + const items = useSearch(props.query) + + const selectItem = (index: number) => { + const item = items[index] + if (item) { + props.command(item) + } + } + + const upHandler = () => { + setSelectedIndex((selectedIndex + items.length - 1) % items.length) + } + + const downHandler = () => { + setSelectedIndex((selectedIndex + 1) % items.length) + } + + const enterHandler = () => { + selectItem(selectedIndex) + } + + useEffect(() => setSelectedIndex(0), [items]) + + useImperativeHandle(ref, () => ({ + onKeyDown: ({ event }: { event: KeyboardEvent }) => { + if (event.key === 'ArrowUp') { + upHandler() + return true + } + + if (event.key === 'ArrowDown') { + downHandler() + return true + } + + if (event.key === 'Enter') { + enterHandler() + return true + } + + return false + }, + })) + + return ( +
+ {items.map((item, index) => { + const { name, display_name } = JSON.parse(item.content) + return ( +
selectItem(index)}> + {display_name || name} +
+ ) + })} +
+ ) +}) + +export default Suggestions diff --git a/examples/react/src/hooks/useSearch.ts b/examples/react/src/hooks/useSearch.ts new file mode 100644 index 0000000..6991123 --- /dev/null +++ b/examples/react/src/hooks/useSearch.ts @@ -0,0 +1,21 @@ +import { useEffect, useState } from 'react' +import { pool } from '../nostr' +import type { NostrEvent } from 'nostr-tools' + +export function useSearch(search: string) { + const [items, setItems] = useState([]) + + useEffect(() => { + if (search) { + setItems([]) + const sub = pool.subscribeMany(['wss://relay.nostr.band'], [{ kinds: [0], search }], { + onevent: (event: NostrEvent) => { + setItems((prev) => [...prev, event]) + }, + }) + return () => sub.close() + } + }, [search]) + + return items +} From 6ab9a87685718026401d78e3c207f2406d235343 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 22:07:36 +0200 Subject: [PATCH 19/23] Added some draggable handlers --- examples/react/src/components/Image.tsx | 18 +++++++++++------- examples/react/src/components/NAddr.tsx | 8 ++++---- examples/react/src/components/NEvent.tsx | 9 +++++---- examples/react/src/components/Tweet.tsx | 2 +- examples/react/src/components/Video.tsx | 12 +++++------- src/index.ts | 1 - 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/examples/react/src/components/Image.tsx b/examples/react/src/components/Image.tsx index 4498a87..8d82edd 100644 --- a/examples/react/src/components/Image.tsx +++ b/examples/react/src/components/Image.tsx @@ -1,13 +1,17 @@ -import type { NodeViewRendererProps } from '@tiptap/core' +import { IconX } from '@tabler/icons-react' +import type { NodeViewProps } from '@tiptap/core' import { NodeViewWrapper } from '@tiptap/react' -export function Image(props: NodeViewRendererProps) { +export function Image(props: NodeViewProps) { const { src } = props.node.attrs return ( - <> - - - - + + {props.selected && ( + + )} + + ) } diff --git a/examples/react/src/components/NAddr.tsx b/examples/react/src/components/NAddr.tsx index 334457a..42de902 100644 --- a/examples/react/src/components/NAddr.tsx +++ b/examples/react/src/components/NAddr.tsx @@ -1,14 +1,14 @@ -import type { NodeViewRendererProps } from '@tiptap/react' +import type { NodeViewProps } from '@tiptap/react' import { NodeViewWrapper } from '@tiptap/react' import { useMention, useProfileParsed } from '../hooks/useMention' -export function NAddr(props: NodeViewRendererProps) { +export function NAddr(props: NodeViewProps) { const { pubkey, identifier } = props.node.attrs const mention = useMention(pubkey) const profile = useProfileParsed(mention) return ( - -
+ +
{profile?.display_name || profile?.name} diff --git a/examples/react/src/components/NEvent.tsx b/examples/react/src/components/NEvent.tsx index 71e950d..ebfba20 100644 --- a/examples/react/src/components/NEvent.tsx +++ b/examples/react/src/components/NEvent.tsx @@ -1,6 +1,6 @@ +import { IconX } from '@tabler/icons-react' import type { NodeViewProps } from '@tiptap/core' import { NodeViewWrapper } from '@tiptap/react' -import { IconX } from '@tabler/icons-react' import { DateTime } from 'luxon' import type { NostrEvent } from 'nostr-tools/core' import { useEffect, useMemo, useState } from 'react' @@ -8,7 +8,7 @@ import { useMention, useProfileParsed } from '../hooks/useMention' import { pool } from '../nostr' export function NEvent(props: NodeViewProps) { - const { id, relays, author } = props.node.attrs + const { id, relays, author, nevent } = props.node.attrs const [event, setEvent] = useState() const user = useMention(author, relays) @@ -31,8 +31,9 @@ export function NEvent(props: NodeViewProps) { }, [user]) return ( - -
+ +
{props.selected &&
selected
} )} diff --git a/examples/react/src/components/NAddr.tsx b/examples/react/src/components/NAddr.tsx index 42de902..3f39049 100644 --- a/examples/react/src/components/NAddr.tsx +++ b/examples/react/src/components/NAddr.tsx @@ -7,7 +7,7 @@ export function NAddr(props: NodeViewProps) { const mention = useMention(pubkey) const profile = useProfileParsed(mention) return ( - +
diff --git a/examples/react/src/components/NEvent.tsx b/examples/react/src/components/NEvent.tsx index ebfba20..27d580b 100644 --- a/examples/react/src/components/NEvent.tsx +++ b/examples/react/src/components/NEvent.tsx @@ -31,7 +31,7 @@ export function NEvent(props: NodeViewProps) { }, [user]) return ( - +
diff --git a/examples/react/src/components/Tweet.tsx b/examples/react/src/components/Tweet.tsx index 8b92d60..4a44664 100644 --- a/examples/react/src/components/Tweet.tsx +++ b/examples/react/src/components/Tweet.tsx @@ -6,7 +6,7 @@ export function Tweet(props: NodeViewRendererProps) { const { src } = props.node.attrs const id = src.slice(src.lastIndexOf('/') + 1) return ( - + ) diff --git a/examples/react/src/components/Video.tsx b/examples/react/src/components/Video.tsx index d7f395c..f9bebd1 100644 --- a/examples/react/src/components/Video.tsx +++ b/examples/react/src/components/Video.tsx @@ -6,7 +6,7 @@ export function Video(props: NodeViewRendererProps) { const { src } = props.node.attrs const extension = useMemo(() => new URL(src).pathname.split('.').pop(), [src]) return ( - + diff --git a/examples/react/src/index.css b/examples/react/src/index.css index f33018c..2f9c4a2 100644 --- a/examples/react/src/index.css +++ b/examples/react/src/index.css @@ -40,13 +40,14 @@ blockquote { @apply border-l-4 border-l-gray-200 border-solid pl-4 text-gray-500 italic; } -}; +} @tailwind components; @tailwind utilities; - -html, body, #root { +html, +body, +#root { height: 100%; } @@ -81,7 +82,7 @@ html, body, #root { padding: 8px; width: 400px; transform: translateY(-20px); - transition: all 150ms cubic-bezier(.25, .8, .25, 1); + transition: all 150ms cubic-bezier(0.25, 0.8, 0.25, 1); } [data-tooltip]:hover::after { diff --git a/src/plugins/AutoLinkPlugin.ts b/src/plugins/AutoLinkPlugin.ts index 5197a00..1dba4aa 100644 --- a/src/plugins/AutoLinkPlugin.ts +++ b/src/plugins/AutoLinkPlugin.ts @@ -151,13 +151,7 @@ export class AutoLinkPlugin { } } - private replaceWith( - tr: Transaction, - from: number, - to: number, - node: NodeType | undefined, - attrs: Attrs, - ) { + private replaceWith(tr: Transaction, from: number, to: number, node: NodeType | undefined, attrs: Attrs) { if (node) { tr.replaceWith(from, to, node.create(attrs)) } From feb5a4b67ddd23486ce689dabf574e40da3a57af Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 22:38:49 +0200 Subject: [PATCH 22/23] Use Throttler on useSearch --- examples/react/src/hooks/useSearch.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/react/src/hooks/useSearch.ts b/examples/react/src/hooks/useSearch.ts index 6991123..116eb22 100644 --- a/examples/react/src/hooks/useSearch.ts +++ b/examples/react/src/hooks/useSearch.ts @@ -1,21 +1,23 @@ import { useEffect, useState } from 'react' -import { pool } from '../nostr' +import { useThrottle } from "@uidotdev/usehooks"; import type { NostrEvent } from 'nostr-tools' +import { pool } from '../nostr' export function useSearch(search: string) { const [items, setItems] = useState([]) + const value = useThrottle(search, 500); useEffect(() => { - if (search) { + if (value) { setItems([]) - const sub = pool.subscribeMany(['wss://relay.nostr.band'], [{ kinds: [0], search }], { + const sub = pool.subscribeMany(['wss://relay.nostr.band'], [{ kinds: [0], search: value }], { onevent: (event: NostrEvent) => { setItems((prev) => [...prev, event]) }, }) return () => sub.close() } - }, [search]) + }, [value]) return items } From e08dcf06b0b302a72a9e2c932101b82097b2e567 Mon Sep 17 00:00:00 2001 From: Cesar Augusto Date: Mon, 5 Aug 2024 22:39:19 +0200 Subject: [PATCH 23/23] Update dependencies files --- examples/react/package.json | 4 +- examples/react/pnpm-lock.yaml | 52 +- package.json | 4 + pnpm-lock.yaml | 2534 ++++++++++++++++++++------------- 4 files changed, 1618 insertions(+), 976 deletions(-) diff --git a/examples/react/package.json b/examples/react/package.json index 89ca795..db6225f 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -13,7 +13,9 @@ "dependencies": { "@tabler/icons-react": "^3.11.0", "@tiptap/core": "^2.5.4", + "@tiptap/extension-dropcursor": "^2.5.8", "@tiptap/extension-image": "^2.5.4", + "@tiptap/extension-paragraph": "^2.5.8", "@tiptap/extension-task-item": "^2.5.4", "@tiptap/extension-task-list": "^2.5.4", "@tiptap/extension-youtube": "^2.5.4", @@ -21,6 +23,7 @@ "@tiptap/react": "^2.5.4", "@tiptap/starter-kit": "^2.5.4", "@tiptap/suggestion": "^2.5.8", + "@uidotdev/usehooks": "^2.4.1", "luxon": "^3.4.4", "nostr-editor": "link:../..", "nostr-tools": "^2.7.1", @@ -28,7 +31,6 @@ "react-dom": "^18.3.1", "react-json-view": "^1.21.3", "react-tweet": "^3.2.1", - "throttle-debounce": "^5.0.2", "tippy.js": "^6.3.7" }, "devDependencies": { diff --git a/examples/react/pnpm-lock.yaml b/examples/react/pnpm-lock.yaml index f017996..0e18c99 100644 --- a/examples/react/pnpm-lock.yaml +++ b/examples/react/pnpm-lock.yaml @@ -14,9 +14,15 @@ importers: '@tiptap/core': specifier: ^2.5.4 version: 2.5.4(@tiptap/pm@2.5.4) + '@tiptap/extension-dropcursor': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-image': specifier: ^2.5.4 version: 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-paragraph': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-task-item': specifier: ^2.5.4 version: 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) @@ -38,6 +44,9 @@ importers: '@tiptap/suggestion': specifier: ^2.5.8 version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) + '@uidotdev/usehooks': + specifier: ^2.4.1 + version: 2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) luxon: specifier: ^3.4.4 version: 3.4.4 @@ -59,9 +68,6 @@ importers: react-tweet: specifier: ^3.2.1 version: 3.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - throttle-debounce: - specifier: ^5.0.2 - version: 5.0.2 tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -598,11 +604,11 @@ packages: peerDependencies: '@tiptap/core': ^2.5.4 - '@tiptap/extension-dropcursor@2.5.4': - resolution: {integrity: sha512-jzSnuuYhlc0SsHvAteWkE9TJy3eRwkxQs4MO2JxALOzJECN4G82nlX8vciihBD6xf7lVgVSBACejK9+rsTHqCg==} + '@tiptap/extension-dropcursor@2.5.8': + resolution: {integrity: sha512-xPmIfTYqurFF8RukCPlHd8mT8I7hDinWrgq7CQTRROxcJ3DNw8PooWrKWaBYs9HXHe1pbiQ5EK0uOsNvQ1bcDg==} peerDependencies: - '@tiptap/core': ^2.5.4 - '@tiptap/pm': ^2.5.4 + '@tiptap/core': ^2.5.8 + '@tiptap/pm': ^2.5.8 '@tiptap/extension-floating-menu@2.5.4': resolution: {integrity: sha512-EqD4rgi3UhnDcV3H1+ndAS4Ue2zpsU7hFKoevOIV6GS7xVnWN70AGt6swH24QzuHKKISFtWoLpKjrwRORNIxuA==} @@ -658,10 +664,10 @@ packages: peerDependencies: '@tiptap/core': ^2.5.4 - '@tiptap/extension-paragraph@2.5.4': - resolution: {integrity: sha512-pC1YIkkRPXoU0eDrhfAf8ZrFJQzvw2ftP6KRhLnnSw/Ot1DOjT1r95l7zsFefS9oCDMT/L4HghTAiPZ4rcpPbg==} + '@tiptap/extension-paragraph@2.5.8': + resolution: {integrity: sha512-AMfD3lfGSiomfkSE2tUourUjVahLtIfWUQew13NTPuWoxAXaSyoCGO0ULkiou/lO3JVUUUmF9+KJrAHWGIARdA==} peerDependencies: - '@tiptap/core': ^2.5.4 + '@tiptap/core': ^2.5.8 '@tiptap/extension-strike@2.5.4': resolution: {integrity: sha512-OSN6ePbCwEhi3hYZZOPow/P9Ym2Kv3NhVbUvasjZCiqQuk8TGc33xirPWl9DTjb/BLfL66TtJ2tKUEVOKl5dKg==} @@ -797,6 +803,13 @@ packages: resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} engines: {node: ^18.18.0 || >=20.0.0} + '@uidotdev/usehooks@2.4.1': + resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==} + engines: {node: '>=16'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1739,10 +1752,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - throttle-debounce@5.0.2: - resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} - engines: {node: '>=12.22'} - tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} @@ -2325,7 +2334,7 @@ snapshots: dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) - '@tiptap/extension-dropcursor@2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4)': + '@tiptap/extension-dropcursor@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4)': dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) '@tiptap/pm': 2.5.4 @@ -2375,7 +2384,7 @@ snapshots: dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) - '@tiptap/extension-paragraph@2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': + '@tiptap/extension-paragraph@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) @@ -2441,7 +2450,7 @@ snapshots: '@tiptap/extension-code': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-code-block': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-document': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) - '@tiptap/extension-dropcursor': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) + '@tiptap/extension-dropcursor': 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-gapcursor': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-hard-break': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-heading': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) @@ -2450,7 +2459,7 @@ snapshots: '@tiptap/extension-italic': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-list-item': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-ordered-list': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) - '@tiptap/extension-paragraph': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-paragraph': 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-strike': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-text': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) transitivePeerDependencies: @@ -2580,6 +2589,11 @@ snapshots: '@typescript-eslint/types': 7.16.1 eslint-visitor-keys: 3.4.3 + '@uidotdev/usehooks@2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-react@4.3.1(vite@5.3.4)': @@ -3596,8 +3610,6 @@ snapshots: dependencies: any-promise: 1.3.0 - throttle-debounce@5.0.2: {} - tippy.js@6.3.7: dependencies: '@popperjs/core': 2.11.8 diff --git a/package.json b/package.json index 5ab7347..5325efe 100644 --- a/package.json +++ b/package.json @@ -19,13 +19,17 @@ "lint": "eslint src", "build": "tsc && vite build", "type-check": "tsc --noEmit", + "format": "prettier --write .", "test": "vitest", "preview": "vite preview" }, "devDependencies": { "@eslint/js": "^9.7.0", "@playwright/test": "^1.45.2", + "@tiptap/extension-document": "^2.5.8", "@tiptap/extension-image": "^2.5.4", + "@tiptap/extension-paragraph": "^2.5.8", + "@tiptap/extension-text": "^2.5.8", "@tiptap/extension-youtube": "^2.5.4", "@tiptap/starter-kit": "^2.5.4", "@types/eslint__js": "^8.42.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04cbc4b..582defb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false importers: - .: dependencies: '@tiptap/core': @@ -57,9 +56,18 @@ importers: '@playwright/test': specifier: ^1.45.2 version: 1.45.2 + '@tiptap/extension-document': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-image': specifier: ^2.5.4 version: 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-paragraph': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-text': + specifier: ^2.5.8 + version: 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-youtube': specifier: ^2.5.4 version: 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) @@ -113,268 +121,322 @@ importers: version: 8.39.1(typescript@5.5.3) packages: - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== } + engines: { node: '>=6.9.0' } '@babel/parser@7.24.8': - resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== } + engines: { node: '>=6.0.0' } hasBin: true '@babel/types@7.24.9': - resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== } + engines: { node: '>=6.9.0' } '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== } + engines: { node: '>=12' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== } + engines: { node: '>=12' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== } + engines: { node: '>=12' } cpu: [arm] os: [android] '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== } + engines: { node: '>=12' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== } + engines: { node: '>=12' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== } + engines: { node: '>=12' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== } + engines: { node: '>=12' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== } + engines: { node: '>=12' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== } + engines: { node: '>=12' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== } + engines: { node: '>=12' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== } + engines: { node: '>=12' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== } + engines: { node: '>=12' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== } + engines: { node: '>=12' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== } + engines: { node: '>=12' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== } + engines: { node: '>=12' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== } + engines: { node: '>=12' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== } + engines: { node: '>=12' } cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== } + engines: { node: '>=12' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== } + engines: { node: '>=12' } cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== } + engines: { node: '>=12' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== } + engines: { node: '>=12' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== } + engines: { node: '>=12' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== } + engines: { node: '>=12' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/config-array@0.17.0': - resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/js@9.7.0': - resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: '>=12.22' } '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} - engines: {node: '>=18.18'} + resolution: + { integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== } + engines: { node: '>=18.18' } '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: '>=12' } '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + resolution: + { integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== } '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + resolution: + { integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw== } '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + resolution: + { integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w== } hasBin: true '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + resolution: + { integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== } '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + resolution: + { integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== } '@noble/ciphers@0.5.3': - resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} + resolution: + { integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w== } '@noble/curves@1.1.0': - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + resolution: + { integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== } '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + resolution: + { integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== } '@noble/hashes@1.3.1': - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} + resolution: + { integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== } + engines: { node: '>= 16' } '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + resolution: + { integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== } + engines: { node: '>= 16' } '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: '>=14' } '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } '@playwright/test@1.45.2': - resolution: {integrity: sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ== } + engines: { node: '>=18' } hasBin: true '@promptbook/utils@0.58.0': - resolution: {integrity: sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ==} + resolution: + { integrity: sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ== } '@puppeteer/browsers@1.4.6': - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} - engines: {node: '>=16.3.0'} + resolution: + { integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ== } + engines: { node: '>=16.3.0' } hasBin: true peerDependencies: typescript: '>= 4.7.4' @@ -383,16 +445,19 @@ packages: optional: true '@puppeteer/browsers@1.9.1': - resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} - engines: {node: '>=16.3.0'} + resolution: + { integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA== } + engines: { node: '>=16.3.0' } hasBin: true '@remirror/core-constants@2.0.2': - resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} + resolution: + { integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== } '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== } + engines: { node: '>=14.0.0' } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: @@ -400,87 +465,104 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.18.1': - resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} + resolution: + { integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA== } cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.18.1': - resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} + resolution: + { integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg== } cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.18.1': - resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} + resolution: + { integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ== } cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.18.1': - resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} + resolution: + { integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA== } cpu: [x64] os: [darwin] '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} + resolution: + { integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g== } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.18.1': - resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} + resolution: + { integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ== } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.18.1': - resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} + resolution: + { integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ== } cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.18.1': - resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} + resolution: + { integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ== } cpu: [arm64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} + resolution: + { integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ== } cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.18.1': - resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} + resolution: + { integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg== } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.18.1': - resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} + resolution: + { integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg== } cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.18.1': - resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} + resolution: + { integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g== } cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.18.1': - resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} + resolution: + { integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ== } cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.18.1': - resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} + resolution: + { integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g== } cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.18.1': - resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} + resolution: + { integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg== } cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.18.1': - resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} + resolution: + { integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw== } cpu: [x64] os: [win32] '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + resolution: + { integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg== } peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -488,10 +570,12 @@ packages: optional: true '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + resolution: + { integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA== } '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + resolution: + { integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw== } peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -499,210 +583,261 @@ packages: optional: true '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + resolution: + { integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg== } '@scure/base@1.1.1': - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + resolution: + { integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== } '@scure/bip32@1.3.1': - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + resolution: + { integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== } '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + resolution: + { integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== } '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + resolution: + { integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== } '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== } + engines: { node: '>=14.16' } '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== } + engines: { node: '>=14.16' } '@tiptap/core@2.5.4': - resolution: {integrity: sha512-Zs/hShr4+W02+0nOlpmr5cS2YjDRLqd+XMt+jsiQH0QNr3s1Lc82pfF6C3CjgLEZtdUzImZrW2ABtLlpvbogaA==} + resolution: + { integrity: sha512-Zs/hShr4+W02+0nOlpmr5cS2YjDRLqd+XMt+jsiQH0QNr3s1Lc82pfF6C3CjgLEZtdUzImZrW2ABtLlpvbogaA== } peerDependencies: '@tiptap/pm': ^2.5.4 '@tiptap/extension-blockquote@2.5.4': - resolution: {integrity: sha512-UqeJunZM3IiCQGZE0X5YNUOWYkuIieqrwPgOEghAIjnhDcQizQcouRQ5R7cwwv/scNr2JvZHncOTLrALV3Janw==} + resolution: + { integrity: sha512-UqeJunZM3IiCQGZE0X5YNUOWYkuIieqrwPgOEghAIjnhDcQizQcouRQ5R7cwwv/scNr2JvZHncOTLrALV3Janw== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-bold@2.5.4': - resolution: {integrity: sha512-H5sjqloFMjq7VOSfE+U4T7dqGoflOiF6RW6/gZm/U6KYeHG2/bG0ktq7mWAnnhbiKiy7gUcxyJCV+ILdGX9C5g==} + resolution: + { integrity: sha512-H5sjqloFMjq7VOSfE+U4T7dqGoflOiF6RW6/gZm/U6KYeHG2/bG0ktq7mWAnnhbiKiy7gUcxyJCV+ILdGX9C5g== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-bullet-list@2.5.4': - resolution: {integrity: sha512-aAfpALeD6OxymkbtrzDqbgkAkzVVHudxOb8GsK1N6m42nFL7Q9JzHJ5/8KzB+xi25CcIbS+HmXJkRIQJXgNbSA==} + resolution: + { integrity: sha512-aAfpALeD6OxymkbtrzDqbgkAkzVVHudxOb8GsK1N6m42nFL7Q9JzHJ5/8KzB+xi25CcIbS+HmXJkRIQJXgNbSA== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-code-block@2.5.4': - resolution: {integrity: sha512-lZRz44ACSL0IC4syWkNsNSe90sZuLig0yidfV9rs2muSCLoS3PRcCIJv4GjdBHouangxxBZqzIqWgPBqe6pqwA==} + resolution: + { integrity: sha512-lZRz44ACSL0IC4syWkNsNSe90sZuLig0yidfV9rs2muSCLoS3PRcCIJv4GjdBHouangxxBZqzIqWgPBqe6pqwA== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-code@2.5.4': - resolution: {integrity: sha512-PCP0VcWR0Jsj3rum3czp1jateR+kv1iuB9E+TieGLN4vFqhoiUwSv2UAuhvD8x66MGCYLA3btgnmPov1w/iNmA==} + resolution: + { integrity: sha512-PCP0VcWR0Jsj3rum3czp1jateR+kv1iuB9E+TieGLN4vFqhoiUwSv2UAuhvD8x66MGCYLA3btgnmPov1w/iNmA== } peerDependencies: '@tiptap/core': ^2.5.4 - '@tiptap/extension-document@2.5.4': - resolution: {integrity: sha512-4RDrhASxCTOZETYhIhEW1TfZqx3Tm+LQxouvBMFyODmT1PSgsg5Xz1FYpDPr+J49bGAK0Pr9ae0XcGW011L3sA==} + '@tiptap/extension-document@2.5.8': + resolution: + { integrity: sha512-r3rP4ihCJAdp3VRIeqd80etHx7jttzZaKNFX8hkQShHK6eTHwrR92VL0jDE4K+NOE3bxjMsOlYizJYWV042BtA== } peerDependencies: - '@tiptap/core': ^2.5.4 + '@tiptap/core': ^2.5.8 '@tiptap/extension-dropcursor@2.5.4': - resolution: {integrity: sha512-jzSnuuYhlc0SsHvAteWkE9TJy3eRwkxQs4MO2JxALOzJECN4G82nlX8vciihBD6xf7lVgVSBACejK9+rsTHqCg==} + resolution: + { integrity: sha512-jzSnuuYhlc0SsHvAteWkE9TJy3eRwkxQs4MO2JxALOzJECN4G82nlX8vciihBD6xf7lVgVSBACejK9+rsTHqCg== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-focus@2.5.4': - resolution: {integrity: sha512-/Iq++93f9S+bNJzj3OmgOydCO58VfAhmnsImbGK/GmxV39hHbgJdazxMugwdQlvrY/oe3+Y+WY8ZI1WlWwTJ4g==} + resolution: + { integrity: sha512-/Iq++93f9S+bNJzj3OmgOydCO58VfAhmnsImbGK/GmxV39hHbgJdazxMugwdQlvrY/oe3+Y+WY8ZI1WlWwTJ4g== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-gapcursor@2.5.4': - resolution: {integrity: sha512-wzTh1piODZBS0wmuDgPjjg8PQwclYa5LssnxDIo9pDSnt4l3AfHSAJIJSGIfgt96KnzF1wqRTRpe08qNa1n7/g==} + resolution: + { integrity: sha512-wzTh1piODZBS0wmuDgPjjg8PQwclYa5LssnxDIo9pDSnt4l3AfHSAJIJSGIfgt96KnzF1wqRTRpe08qNa1n7/g== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-hard-break@2.5.4': - resolution: {integrity: sha512-nLn6HP9tqgdGGwbMORXVtcY30DTGctYFaWADRthvBjVgacYSeKlhUcsSu3YgaxtbxZp6BhfRvD2kKrxyQsSjnQ==} + resolution: + { integrity: sha512-nLn6HP9tqgdGGwbMORXVtcY30DTGctYFaWADRthvBjVgacYSeKlhUcsSu3YgaxtbxZp6BhfRvD2kKrxyQsSjnQ== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-heading@2.5.4': - resolution: {integrity: sha512-DuAB58/e7eho1rkyad0Z/SjW+EB+H2hRqHlswEeZZYhBTjzey5UmBwkMWTGC/SQiRisx1xYQYTd8T0fiABi5hw==} + resolution: + { integrity: sha512-DuAB58/e7eho1rkyad0Z/SjW+EB+H2hRqHlswEeZZYhBTjzey5UmBwkMWTGC/SQiRisx1xYQYTd8T0fiABi5hw== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-history@2.5.4': - resolution: {integrity: sha512-WB1fZYGIlpahAD6Ba+mj9vIb1tk8S3TsADXDFKxLVpZWZPQ+B7duGJP7g/vRH2XAXEs836JzC2oxjKeaop3k7A==} + resolution: + { integrity: sha512-WB1fZYGIlpahAD6Ba+mj9vIb1tk8S3TsADXDFKxLVpZWZPQ+B7duGJP7g/vRH2XAXEs836JzC2oxjKeaop3k7A== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-horizontal-rule@2.5.4': - resolution: {integrity: sha512-uXLDe/iyzQbyfDkJ8kE5XaAkY3EOcbTFLjbueqGlkbWtjJgy+3LysGvh8fQj8PAOaIBMaFRFhTq7GMbW2ebRog==} + resolution: + { integrity: sha512-uXLDe/iyzQbyfDkJ8kE5XaAkY3EOcbTFLjbueqGlkbWtjJgy+3LysGvh8fQj8PAOaIBMaFRFhTq7GMbW2ebRog== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm': ^2.5.4 '@tiptap/extension-image@2.5.4': - resolution: {integrity: sha512-4ySSP7iPsbbo1SlPJYj546TKettuO6FGY5MQKxH8AGnZWyQGZYl89GpU1iGFAaeHq4dKUemM5D3ikgSynEQLow==} + resolution: + { integrity: sha512-4ySSP7iPsbbo1SlPJYj546TKettuO6FGY5MQKxH8AGnZWyQGZYl89GpU1iGFAaeHq4dKUemM5D3ikgSynEQLow== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-italic@2.5.4': - resolution: {integrity: sha512-TAhtl/fNBgv1elzF3HWES8uwVdpKBSYrq1e6yeYfj74mQn//3ksvdhWQrLzc1e+zcoHbk1PeOp/5ODdPuZ6tkg==} + resolution: + { integrity: sha512-TAhtl/fNBgv1elzF3HWES8uwVdpKBSYrq1e6yeYfj74mQn//3ksvdhWQrLzc1e+zcoHbk1PeOp/5ODdPuZ6tkg== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-list-item@2.5.4': - resolution: {integrity: sha512-bPxUCFt9HnAfoaZQgwqCfRAZ6L3QlYhIRDDbOvZag7IxCdQuZmeY4k5OZfQIGijNDTag7CN9cdL4fl9rnm6/sQ==} + resolution: + { integrity: sha512-bPxUCFt9HnAfoaZQgwqCfRAZ6L3QlYhIRDDbOvZag7IxCdQuZmeY4k5OZfQIGijNDTag7CN9cdL4fl9rnm6/sQ== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/extension-ordered-list@2.5.4': - resolution: {integrity: sha512-cl3cTJitY6yDUmxqgjDUtDWCyX1VVsZNJ6i9yiPeARcxvzFc81KmUJxTGl8WPT5TjqmM+TleRkZjsxgvXX57+Q==} + resolution: + { integrity: sha512-cl3cTJitY6yDUmxqgjDUtDWCyX1VVsZNJ6i9yiPeARcxvzFc81KmUJxTGl8WPT5TjqmM+TleRkZjsxgvXX57+Q== } peerDependencies: '@tiptap/core': ^2.5.4 - '@tiptap/extension-paragraph@2.5.4': - resolution: {integrity: sha512-pC1YIkkRPXoU0eDrhfAf8ZrFJQzvw2ftP6KRhLnnSw/Ot1DOjT1r95l7zsFefS9oCDMT/L4HghTAiPZ4rcpPbg==} + '@tiptap/extension-paragraph@2.5.8': + resolution: + { integrity: sha512-AMfD3lfGSiomfkSE2tUourUjVahLtIfWUQew13NTPuWoxAXaSyoCGO0ULkiou/lO3JVUUUmF9+KJrAHWGIARdA== } peerDependencies: - '@tiptap/core': ^2.5.4 + '@tiptap/core': ^2.5.8 '@tiptap/extension-strike@2.5.4': - resolution: {integrity: sha512-OSN6ePbCwEhi3hYZZOPow/P9Ym2Kv3NhVbUvasjZCiqQuk8TGc33xirPWl9DTjb/BLfL66TtJ2tKUEVOKl5dKg==} + resolution: + { integrity: sha512-OSN6ePbCwEhi3hYZZOPow/P9Ym2Kv3NhVbUvasjZCiqQuk8TGc33xirPWl9DTjb/BLfL66TtJ2tKUEVOKl5dKg== } peerDependencies: '@tiptap/core': ^2.5.4 - '@tiptap/extension-text@2.5.4': - resolution: {integrity: sha512-+3x/hYqhmCYbvedCcQzQHFtZ5MAcMOlKuczomZtygf8AfDfuQVrG1m4GoJyNzJdqxjN80/xq4e2vDVvqQxYTCw==} + '@tiptap/extension-text@2.5.8': + resolution: + { integrity: sha512-CNkD51jRMdcYCqFVOkrnebqBQ6pCD3ZD5z9kO5bOC5UPZKZBkLsWdlrHGAVwosxcGxdJACbqJ0Nj+fMgIw4tNA== } peerDependencies: - '@tiptap/core': ^2.5.4 + '@tiptap/core': ^2.5.8 '@tiptap/extension-youtube@2.5.4': - resolution: {integrity: sha512-iHcvXOA32MZsVJTT7mvZ1CWKUo2quQMQXfBniizLm0lUG1ftSioqnDuXy4kEjeCBR2cnZr3yph6tbG/pF0RcHg==} + resolution: + { integrity: sha512-iHcvXOA32MZsVJTT7mvZ1CWKUo2quQMQXfBniizLm0lUG1ftSioqnDuXy4kEjeCBR2cnZr3yph6tbG/pF0RcHg== } peerDependencies: '@tiptap/core': ^2.5.4 '@tiptap/pm@2.5.4': - resolution: {integrity: sha512-oFIsuniptdUXn93x4aM2sVN3hYKo9Fj55zAkYrWhwxFYUYcPxd5ibra2we+wRK5TaiPu098wpC+yMSTZ/KKMpA==} + resolution: + { integrity: sha512-oFIsuniptdUXn93x4aM2sVN3hYKo9Fj55zAkYrWhwxFYUYcPxd5ibra2we+wRK5TaiPu098wpC+yMSTZ/KKMpA== } '@tiptap/starter-kit@2.5.4': - resolution: {integrity: sha512-IYnSETtBUSsy+Ece4kfVyzew+zyj7W9rP2Ronx0CbjeWQarfCAGxjuZ6uGLPB+tC5ZuMVt68Gyqb2y8GFes2Yw==} + resolution: + { integrity: sha512-IYnSETtBUSsy+Ece4kfVyzew+zyj7W9rP2Ronx0CbjeWQarfCAGxjuZ6uGLPB+tC5ZuMVt68Gyqb2y8GFes2Yw== } '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + resolution: + { integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== } '@types/argparse@1.0.38': - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + resolution: + { integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== } '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + resolution: + { integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== } '@types/eslint__js@8.42.3': - resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} + resolution: + { integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw== } '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + resolution: + { integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== } '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + resolution: + { integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== } '@types/jsdom@21.1.7': - resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + resolution: + { integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA== } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } '@types/linkify-it@3.0.5': - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + resolution: + { integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== } '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + resolution: + { integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== } '@types/markdown-it@13.0.8': - resolution: {integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==} + resolution: + { integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg== } '@types/markdown-it@14.1.1': - resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} + resolution: + { integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg== } '@types/mdurl@1.0.5': - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + resolution: + { integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== } '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + resolution: + { integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== } '@types/node@20.14.11': - resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + resolution: + { integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== } '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + resolution: + { integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== } '@types/which@2.0.2': - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + resolution: + { integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw== } '@types/ws@8.5.11': - resolution: {integrity: sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==} + resolution: + { integrity: sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w== } '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + resolution: + { integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== } '@typescript-eslint/eslint-plugin@7.16.1': - resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 @@ -712,8 +847,9 @@ packages: optional: true '@typescript-eslint/parser@7.16.1': - resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -722,12 +858,14 @@ packages: optional: true '@typescript-eslint/scope-manager@7.16.1': - resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw== } + engines: { node: ^18.18.0 || >=20.0.0 } '@typescript-eslint/type-utils@7.16.1': - resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -736,12 +874,14 @@ packages: optional: true '@typescript-eslint/types@7.16.1': - resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ== } + engines: { node: ^18.18.0 || >=20.0.0 } '@typescript-eslint/typescript-estree@7.16.1': - resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -749,47 +889,60 @@ packages: optional: true '@typescript-eslint/utils@7.16.1': - resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 '@typescript-eslint/visitor-keys@7.16.1': - resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg== } + engines: { node: ^18.18.0 || >=20.0.0 } '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + resolution: + { integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== } '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + resolution: + { integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== } '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + resolution: + { integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== } '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + resolution: + { integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== } '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + resolution: + { integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== } '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + resolution: + { integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw== } '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + resolution: + { integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg== } '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + resolution: + { integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ== } '@vue/compiler-core@3.4.32': - resolution: {integrity: sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==} + resolution: + { integrity: sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw== } '@vue/compiler-dom@3.4.32': - resolution: {integrity: sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==} + resolution: + { integrity: sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A== } '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + resolution: + { integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA== } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -797,283 +950,360 @@ packages: optional: true '@vue/shared@3.4.32': - resolution: {integrity: sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==} + resolution: + { integrity: sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg== } '@wdio/config@8.39.0': - resolution: {integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A== } + engines: { node: ^16.13 || >=18 } '@wdio/logger@8.38.0': - resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q== } + engines: { node: ^16.13 || >=18 } '@wdio/protocols@8.38.0': - resolution: {integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==} + resolution: + { integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA== } '@wdio/repl@8.24.12': - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw== } + engines: { node: ^16.13 || >=18 } '@wdio/types@8.39.0': - resolution: {integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q== } + engines: { node: ^16.13 || >=18 } '@wdio/utils@8.39.0': - resolution: {integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q== } + engines: { node: ^16.13 || >=18 } '@zip.js/zip.js@2.7.47': - resolution: {integrity: sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==} - engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + resolution: + { integrity: sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg== } + engines: { bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0' } abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + resolution: + { integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== } + engines: { node: '>=6.5' } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== } + engines: { node: '>=0.4.0' } acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== } + engines: { node: '>=0.4.0' } hasBin: true agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== } + engines: { node: '>= 14' } ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: '>=8' } ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: '>=12' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } + engines: { node: '>=10' } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: '>=12' } archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA== } + engines: { node: '>= 14' } archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ== } + engines: { node: '>= 14' } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + resolution: + { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: '>=8' } assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + resolution: + { integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== } ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== } + engines: { node: '>=4' } async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + resolution: + { integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + resolution: + { integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + resolution: + { integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== } bare-fs@2.3.1: - resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + resolution: + { integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== } bare-os@2.4.0: - resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + resolution: + { integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== } bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + resolution: + { integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== } bare-stream@2.1.3: - resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + resolution: + { integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== } + engines: { node: '>=10.0.0' } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: '>=8' } buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== } buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w== } + engines: { node: '>=8.0.0' } buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + { integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== } cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== } + engines: { node: '>=8' } cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== } + engines: { node: '>=14.16' } cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== } + engines: { node: '>=14.16' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: '>=6' } chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== } + engines: { node: '>=4' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: '>=10' } chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + resolution: + { integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== } chromium-bidi@0.4.16: - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + resolution: + { integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA== } peerDependencies: devtools-protocol: '*' cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: '>=12' } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: '>= 0.8' } commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + resolution: + { integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== } + engines: { node: ^12.20.0 || >=14 } compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg== } + engines: { node: '>= 14' } computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + resolution: + { integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + resolution: + { integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== } crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== } + engines: { node: '>=0.8' } hasBin: true crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g== } + engines: { node: '>= 14' } crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + resolution: + { integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== } cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + resolution: + { integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== } cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: '>= 8' } css-shorthand-properties@1.1.1: - resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} + resolution: + { integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A== } css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + resolution: + { integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q== } cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== } + engines: { node: '>=18' } data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== } + engines: { node: '>= 12' } data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== } + engines: { node: '>= 14' } data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== } + engines: { node: '>=18' } de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + resolution: + { integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== } debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1081,8 +1311,9 @@ packages: optional: true debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1090,108 +1321,135 @@ packages: optional: true decamelize@6.0.0: - resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + resolution: + { integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== } decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== } + engines: { node: '>=10' } deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== } + engines: { node: '>=6' } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } deepmerge-ts@5.1.0: - resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw== } + engines: { node: '>=16.0.0' } defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== } + engines: { node: '>=10' } degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== } + engines: { node: '>= 14' } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: '>=0.4.0' } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } + engines: { node: '>=6' } devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + resolution: + { integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ== } devtools-protocol@0.0.1302984: - resolution: {integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==} + resolution: + { integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA== } diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: '>=8' } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg== } + engines: { node: '>=14.0.0' } edgedriver@5.6.0: - resolution: {integrity: sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==} + resolution: + { integrity: sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ== } hasBin: true emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + { integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: '>=0.12' } esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== } + engines: { node: '>=12' } hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== } + engines: { node: '>=6' } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: '>=10' } escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== } + engines: { node: '>=6.0' } hasBin: true eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + resolution: + { integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== } hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' @@ -1204,375 +1462,473 @@ packages: optional: true eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint@9.7.0: - resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: '>=4' } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: '>=4.0' } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: '>=0.10.0' } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== } + engines: { node: '>=6' } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== } + engines: { node: '>=0.8.x' } execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + resolution: + { integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== } + engines: { node: '>=16.17' } extract-domain@5.0.2: - resolution: {integrity: sha512-D2Dr7oFpo1Y7QbuySLswRJ2cAY6zZAobIaKKy3qeog36F4YXVeK6F+rtZP2tHEiMyMPXQzp3DRJZ6jK2Yn6mgg==} + resolution: + { integrity: sha512-D2Dr7oFpo1Y7QbuySLswRJ2cAY6zZAobIaKKy3qeog36F4YXVeK6F+rtZP2tHEiMyMPXQzp3DRJZ6jK2Yn6mgg== } peerDependencies: psl: ^1.9.0 extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== } + engines: { node: '>= 10.17.0' } hasBin: true fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + resolution: + { integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + resolution: + { integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== } fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + resolution: + { integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== } + engines: { node: ^12.20 || >= 14.13 } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } + engines: { node: '>=16.0.0' } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: '>=8' } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: '>=10' } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } + engines: { node: '>=16' } flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== } foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== } + engines: { node: '>=14' } form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} + resolution: + { integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== } + engines: { node: '>= 14.17' } form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } + engines: { node: '>= 6' } formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + resolution: + { integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== } + engines: { node: '>=12.20.0' } fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + resolution: + { integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== } + engines: { node: '>=14.14' } fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== } + engines: { node: '>=6 <7 || >=8' } fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } geckodriver@4.4.2: - resolution: {integrity: sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA==} - engines: {node: ^16.13 || >=18 || >=20} + resolution: + { integrity: sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA== } + engines: { node: ^16.13 || >=18 || >=20 } hasBin: true get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + resolution: + { integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== } get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw== } + engines: { node: '>=16' } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } + engines: { node: '>=8' } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: '>=10' } get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== } + engines: { node: '>=16' } get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== } + engines: { node: '>= 14' } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: '>=10.13.0' } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== } hasBin: true globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } + engines: { node: '>=18' } globals@15.8.0: - resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw== } + engines: { node: '>=18' } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } + engines: { node: '>=10' } got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== } + engines: { node: '>=14.16' } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + resolution: + { integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } happy-dom@14.12.3: - resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g== } + engines: { node: '>=16.0.0' } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } + engines: { node: '>= 0.4' } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== } hasBin: true html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== } + engines: { node: '>=18' } http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + resolution: + { integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== } http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } + engines: { node: '>= 14' } http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} + resolution: + { integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== } + engines: { node: '>=10.19.0' } https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== } + engines: { node: '>= 14' } human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + resolution: + { integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== } + engines: { node: '>=16.17.0' } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } + engines: { node: '>=0.10.0' } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: '>= 4' } immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + resolution: + { integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: '>=6' } import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== } + engines: { node: '>=8' } import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + resolution: + { integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: '>=0.8.19' } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== } + engines: { node: '>= 12' } is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== } + engines: { node: '>= 0.4' } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: '>=8' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } + engines: { node: '>=8' } is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== } + engines: { node: '>=12' } is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + resolution: + { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } + engines: { node: '>=8' } is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== } + engines: { node: '>=16' } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== } jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + resolution: + { integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== } js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + resolution: + { integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== } js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } hasBin: true jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + resolution: + { integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== } jsdom@24.1.0: - resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA== } + engines: { node: '>=18' } peerDependencies: canvas: ^2.11.2 peerDependenciesMeta: @@ -1580,200 +1936,257 @@ packages: optional: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + resolution: + { integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: + { integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== } ky@0.33.3: - resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw== } + engines: { node: '>=14.16' } lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + resolution: + { integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== } + engines: { node: '>= 0.6.3' } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: '>= 0.8.0' } lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + resolution: + { integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== } linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + resolution: + { integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== } linkifyjs@4.1.3: - resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + resolution: + { integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== } local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== } + engines: { node: '>=14' } locate-app@2.4.21: - resolution: {integrity: sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA==} + resolution: + { integrity: sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA== } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: '>=10' } lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + resolution: + { integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== } lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + resolution: + { integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== } lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + resolution: + { integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + resolution: + { integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + resolution: + { integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== } loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} - engines: {node: '>= 0.6.0'} + resolution: + { integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== } + engines: { node: '>= 0.6.0' } loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + resolution: + { integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== } lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== } lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: '>=10' } lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== } + engines: { node: '>=12' } magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + resolution: + { integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== } markdown-it-task-lists@2.1.1: - resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} + resolution: + { integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA== } markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + resolution: + { integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== } hasBin: true mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + resolution: + { integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== } + engines: { node: '>=8.6' } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: '>= 0.6' } mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } + engines: { node: '>=12' } mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== } + engines: { node: '>=10' } mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + resolution: + { integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } + engines: { node: '>=10' } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: '>=16 || 14 >=14.17' } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } + engines: { node: '>=16 || 14 >=14.17' } mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + resolution: + { integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== } mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + resolution: + { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== } mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + resolution: + { integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== } ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + resolution: + { integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== } nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} + resolution: + { integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== } + engines: { node: '>= 0.4.0' } node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + resolution: + { integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== } + engines: { node: '>=10.5.0' } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -1781,19 +2194,23 @@ packages: optional: true node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: '>=0.10.0' } normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== } + engines: { node: '>=14.16' } nostr-tools@2.7.1: - resolution: {integrity: sha512-4qAvlHSqBAA8lQMwRWE6dalSNdQT77Xut9lPiJZgEcb9RAlR69wR2+KVBAgnZVaabVYH7FJ7gOQXLw/jQBAYBg==} + resolution: + { integrity: sha512-4qAvlHSqBAA8lQMwRWE6dalSNdQT77Xut9lPiJZgEcb9RAlR69wR2+KVBAgnZVaabVYH7FJ7gOQXLw/jQBAYBg== } peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -1801,239 +2218,305 @@ packages: optional: true nostr-wasm@0.1.0: - resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==} + resolution: + { integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA== } npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + resolution: + { integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } + engines: { node: '>=12' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } + engines: { node: '>= 0.8.0' } orderedmap@2.1.1: - resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + resolution: + { integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== } p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== } + engines: { node: '>=12.20' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: '>=10' } p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== } + engines: { node: '>=18' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: '>=10' } pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== } + engines: { node: '>= 14' } pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== } + engines: { node: '>= 14' } package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + resolution: + { integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== } pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + resolution: + { integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: '>=6' } parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + resolution: + { integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: '>=8' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } + engines: { node: '>=12' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== } + engines: { node: '>=16 || 14 >=14.18' } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: '>=8' } pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: + { integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + resolution: + { integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: + { integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== } picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + resolution: + { integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + resolution: + { integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA== } playwright-core@1.45.2: - resolution: {integrity: sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw== } + engines: { node: '>=18' } hasBin: true playwright@1.45.2: - resolution: {integrity: sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g== } + engines: { node: '>=18' } hasBin: true postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: '>= 0.8.0' } prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } + engines: { node: '>=6.0.0' } prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== } + engines: { node: '>=14' } hasBin: true pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== } + engines: { node: '>= 0.6.0' } progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== } + engines: { node: '>=0.4.0' } prosemirror-changeset@2.2.1: - resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + resolution: + { integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== } prosemirror-collab@1.3.1: - resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + resolution: + { integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== } prosemirror-commands@1.5.2: - resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + resolution: + { integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== } prosemirror-dropcursor@1.8.1: - resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + resolution: + { integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== } prosemirror-gapcursor@1.3.2: - resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + resolution: + { integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== } prosemirror-history@1.4.1: - resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + resolution: + { integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ== } prosemirror-inputrules@1.4.0: - resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + resolution: + { integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== } prosemirror-keymap@1.2.2: - resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + resolution: + { integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== } prosemirror-markdown@1.13.0: - resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} + resolution: + { integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g== } prosemirror-menu@1.2.4: - resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + resolution: + { integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== } prosemirror-model@1.22.1: - resolution: {integrity: sha512-gMrxal+F3higDFxCkBK5iQXckRVYvIu/3dopERJ6b20xfwZ9cbYvQvuldqaN+v/XytNPGyURYUpUU23kBRxWCQ==} + resolution: + { integrity: sha512-gMrxal+F3higDFxCkBK5iQXckRVYvIu/3dopERJ6b20xfwZ9cbYvQvuldqaN+v/XytNPGyURYUpUU23kBRxWCQ== } prosemirror-schema-basic@1.2.3: - resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} + resolution: + { integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA== } prosemirror-schema-list@1.4.1: - resolution: {integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==} + resolution: + { integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg== } prosemirror-state@1.4.3: - resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + resolution: + { integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== } prosemirror-tables@1.3.7: - resolution: {integrity: sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==} + resolution: + { integrity: sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== } prosemirror-trailing-node@2.0.9: - resolution: {integrity: sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==} + resolution: + { integrity: sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg== } peerDependencies: prosemirror-model: ^1.22.1 prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 prosemirror-transform@1.9.0: - resolution: {integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==} + resolution: + { integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg== } prosemirror-view@1.33.8: - resolution: {integrity: sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw==} + resolution: + { integrity: sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw== } proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== } + engines: { node: '>= 14' } proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ== } + engines: { node: '>= 14' } proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + resolution: + { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + resolution: + { integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== } pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + resolution: + { integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== } punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== } + engines: { node: '>=6' } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: '>=6' } puppeteer-core@20.9.0: - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} - engines: {node: '>=16.3.0'} + resolution: + { integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg== } + engines: { node: '>=16.3.0' } peerDependencies: typescript: '>= 4.7.4' peerDependenciesMeta: @@ -2041,321 +2524,409 @@ packages: optional: true query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + resolution: + { integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw== } querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolution: + { integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + resolution: + { integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== } quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== } + engines: { node: '>=10' } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== } readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + resolution: + { integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: '>=0.10.0' } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== } resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolution: + { integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: '>=4' } resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolution: + { integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== } hasBin: true responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== } + engines: { node: '>=14.16' } resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + resolution: + { integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw== } reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + resolution: + { integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw== } rollup@4.18.1: - resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A== } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + resolution: + { integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== } rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + resolution: + { integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== } rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + resolution: + { integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } safaridriver@0.1.2: - resolution: {integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==} + resolution: + { integrity: sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg== } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + resolution: + { integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== } + engines: { node: '>=v12.22.7' } semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== } + engines: { node: '>=10' } hasBin: true semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== } + engines: { node: '>=10' } hasBin: true serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g== } + engines: { node: '>=14.16' } setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + { integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: '>=14' } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: '>=8' } smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + resolution: + { integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== } + engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== } + engines: { node: '>= 14' } socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + resolution: + { integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== } + engines: { node: '>= 10.0.0', npm: '>= 3.0.0' } source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== } + engines: { node: '>=0.10.0' } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: '>=0.10.0' } spacetrim@0.11.36: - resolution: {integrity: sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw==} + resolution: + { integrity: sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw== } split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + resolution: + { integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== } + engines: { node: '>= 10.x' } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + resolution: + { integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + resolution: + { integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== } streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + resolution: + { integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== } string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + resolution: + { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } + engines: { node: '>=0.6.19' } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: '>=8' } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: '>=12' } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: '>=8' } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: '>=12' } strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } + engines: { node: '>=12' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: '>=8' } strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + resolution: + { integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: '>=8' } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } + engines: { node: '>=10' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: '>= 0.4' } symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + resolution: + { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== } synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== } + engines: { node: ^14.18.0 || >=16.0.0 } tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + resolution: + { integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== } tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + resolution: + { integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== } tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + resolution: + { integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== } text-decoder@1.1.1: - resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + resolution: + { integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA== } text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== } tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + resolution: + { integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== } tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== } + engines: { node: '>=14.0.0' } tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== } + engines: { node: '>=14.0.0' } tiptap-markdown@0.8.10: - resolution: {integrity: sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ==} + resolution: + { integrity: sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ== } peerDependencies: '@tiptap/core': ^2.0.3 tlds@1.254.0: - resolution: {integrity: sha512-YY4ei7K7gPGifqNSrfMaPdqTqiHcwYKUJ7zhLqQOK2ildlGgti5TSwJiXXN1YqG17I2GYZh5cZqv2r5fwBUM+w==} + resolution: + { integrity: sha512-YY4ei7K7gPGifqNSrfMaPdqTqiHcwYKUJ7zhLqQOK2ildlGgti5TSwJiXXN1YqG17I2GYZh5cZqv2r5fwBUM+w== } hasBin: true to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } + engines: { node: '>=4' } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== } + engines: { node: '>=6' } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== } + engines: { node: '>=18' } ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== } + engines: { node: '>=16' } peerDependencies: typescript: '>=4.2.0' tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + resolution: + { integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: '>= 0.8.0' } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } + engines: { node: '>=4' } type-fest@2.13.0: - resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw== } + engines: { node: '>=12.20' } type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== } + engines: { node: '>=12.20' } typescript-eslint@7.16.1: - resolution: {integrity: sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { integrity: sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA== } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -2364,64 +2935,80 @@ packages: optional: true typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== } + engines: { node: '>=14.17' } hasBin: true typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== } + engines: { node: '>=14.17' } hasBin: true uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + resolution: + { integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== } ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + resolution: + { integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== } unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + resolution: + { integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== } undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + resolution: + { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== } + engines: { node: '>= 4.0.0' } universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== } + engines: { node: '>= 4.0.0' } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } + engines: { node: '>= 10.0.0' } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + resolution: + { integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== } userhome@1.0.0: - resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig== } + engines: { node: '>= 0.8.0' } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== } + engines: { node: '>= 0.10' } vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg== } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: typescript: '*' vite: '*' @@ -2430,8 +3017,9 @@ packages: optional: true vite@5.3.4: - resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA== } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: '@types/node': ^18.0.0 || >=20.0.0 @@ -2458,8 +3046,9 @@ packages: optional: true vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -2483,37 +3072,45 @@ packages: optional: true vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + resolution: + { integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== } vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + resolution: + { integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg== } hasBin: true peerDependencies: typescript: '*' w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + resolution: + { integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== } w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== } + engines: { node: '>=18' } wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q== } + engines: { node: '>=10' } hasBin: true web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== } + engines: { node: '>= 8' } webdriver@8.39.0: - resolution: {integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg== } + engines: { node: ^16.13 || >=18 } webdriverio@8.39.1: - resolution: {integrity: sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==} - engines: {node: ^16.13 || >=18} + resolution: + { integrity: sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ== } + engines: { node: ^16.13 || >=18 } peerDependencies: devtools: ^8.14.0 peerDependenciesMeta: @@ -2521,64 +3118,79 @@ packages: optional: true webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== } + engines: { node: '>=12' } whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== } + engines: { node: '>=18' } whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== } + engines: { node: '>=12' } whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== } + engines: { node: '>=18' } whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== } + engines: { node: '>=18' } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } hasBin: true which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== } + engines: { node: ^16.13.0 || >=18.0.0 } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== } + engines: { node: '>=8' } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } + engines: { node: '>=0.10.0' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: '>=10' } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: '>=12' } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -2589,8 +3201,9 @@ packages: optional: true ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -2601,53 +3214,64 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== } + engines: { node: '>=18' } xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + resolution: + { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: '>=10' } yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: '>=12' } yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== } + engines: { node: '>=12' } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: '>=12' } yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: '>=10' } yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== } + engines: { node: '>=12.20' } z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q== } + engines: { node: '>=8.0.0' } hasBin: true zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA== } + engines: { node: '>= 14' } snapshots: - '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} @@ -3019,7 +3643,7 @@ snapshots: dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) - '@tiptap/extension-document@2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': + '@tiptap/extension-document@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) @@ -3072,7 +3696,7 @@ snapshots: dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) - '@tiptap/extension-paragraph@2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': + '@tiptap/extension-paragraph@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) @@ -3080,7 +3704,7 @@ snapshots: dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) - '@tiptap/extension-text@2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': + '@tiptap/extension-text@2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))': dependencies: '@tiptap/core': 2.5.4(@tiptap/pm@2.5.4) @@ -3117,7 +3741,7 @@ snapshots: '@tiptap/extension-bullet-list': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-code': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-code-block': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) - '@tiptap/extension-document': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-document': 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-dropcursor': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-gapcursor': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4))(@tiptap/pm@2.5.4) '@tiptap/extension-hard-break': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) @@ -3127,9 +3751,9 @@ snapshots: '@tiptap/extension-italic': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-list-item': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-ordered-list': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) - '@tiptap/extension-paragraph': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-paragraph': 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) '@tiptap/extension-strike': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) - '@tiptap/extension-text': 2.5.4(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) + '@tiptap/extension-text': 2.5.8(@tiptap/core@2.5.4(@tiptap/pm@2.5.4)) transitivePeerDependencies: - '@tiptap/pm'