From 11451075b93d4fffb3f14868a86609b2c9ab56dc Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Mon, 19 Oct 2026 17:07:45 +1100 Subject: [PATCH 1/6] refactor for new file explorer setup --- README.md | 13 ++ package-lock.json | 92 +++++++++-- package.json | 4 +- .../source-editor-card/SourceEditorCard.ts | 52 ++++-- .../source-provider/SourceProvider.styles.css | 18 --- .../source-provider/SourceProvider.ts | 113 ++++++------- src/primitives/context.ts | 2 + src/resourceLoader.ts | 59 ------- src/sourcePane.ts | 33 +++- test/helpers.test.js | 69 -------- test/sourceEditorCard.test.js | 126 ++++++++++++--- test/sourcePane.test.js | 75 ++++++++- test/sourceProvider.test.js | 151 +++++++++++++++++- 13 files changed, 533 insertions(+), 274 deletions(-) delete mode 100644 src/components/source-provider/SourceProvider.styles.css delete mode 100644 src/resourceLoader.ts delete mode 100644 test/helpers.test.js diff --git a/README.md b/README.md index d6c43e4..f5e0dce 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,19 @@ Once selected this pane as a view of a file, then the pen icon allows to switch Editing can be aborted by the cancel(X) button. +## File explorer integration + +The pane returns a headless `source-pane-source-provider` and loads +`SourceEditorCard` only when Source is selected. Mount the returned pane beneath +`solid-ui-file-explorer-provider` (using `composeExplorer`) so the provider and +card receive the shared store, resource URI and editor registration contract. +The editor waits for both the subscribed explorer context and fetched content; +either may arrive after its first render. Context accessors used by Lit lifecycle +change checks must also be reactive properties. + +JavaScript files (`.js`, `.mjs`, `.cjs`) offer and prefer Source even when a +server omits MIME metadata or erroneously types the file as an LDP container. + ## Contribute ### Tech stack diff --git a/package-lock.json b/package-lock.json index f78fb7e..f4e9d44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "@lit/context": "^1.1.6", "@typescript-eslint/parser": "^8.63.0", "lit": "^3.3.3", - "pane-registry": "5.0.1", + "pane-registry": "5.0.2-0", "rdflib": "2.4.1", - "solid-logic": "6.0.0", + "solid-logic": "6.0.1-1", "solid-ui": "5.0.1", "vite": "^8.0.16", "vitest": "^4.0.18", @@ -2312,6 +2312,17 @@ "node": ">=18.17" } }, + "node_modules/@dokieli/web-access-control": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@dokieli/web-access-control/-/web-access-control-1.1.0.tgz", + "integrity": "sha512-LId2cNz0pKafc6dwohaX6j+mr886uEV2o8L0VrAWUDxU0LPN4+8Yc8Yx3D94zrsRSJuBWRtQzSjgtEqhYg5y/w==", + "license": "Apache-2.0", + "dependencies": { + "@rdfjs/data-model": "^2.1.1", + "@rdfjs/types": "^2.0.1", + "n3": "^2.2.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -3022,6 +3033,15 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/@rdfjs/data-model": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.1.2.tgz", + "integrity": "sha512-yoSVlyCltqbaCTse3uSdf5Vo3q4UskcTm+3klaUQTwOq7Z5aCZLtLPZatXTPzr+S0WEcjTZvD++A+r3QmgamsA==", + "license": "MIT", + "bin": { + "rdfjs-data-model-test": "bin/test.js" + } + }, "node_modules/@rdfjs/types": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", @@ -7405,13 +7425,29 @@ "license": "MIT" }, "node_modules/pane-registry": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.1.tgz", - "integrity": "sha512-3aeLxm6TnRHfIDoEbpZpNe3Tlm7wWT+ipEpiV6h3cRgxyzmEtrUpS9WB8yJa/VJq0RHXEoaYlLu94fcbuOPnbA==", + "version": "5.0.2-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.2-0.tgz", + "integrity": "sha512-6fU9IyEAttMJwFThbGjLvyrXXNYx0+BmNc4InKA7kFJdVq4ozyojMcrpq4lT2g7xzR1o5xt+Ah+urTxEMQdpcQ==", "license": "MIT", "dependencies": { "rdflib": "2.4.1", - "solid-logic": "6.0.0" + "solid-logic": "6.0.1-0" + } + }, + "node_modules/pane-registry/node_modules/solid-logic": { + "version": "6.0.1-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-0.tgz", + "integrity": "sha512-ZEJ4aRK5Q16sYoNTiH8aJ2ctvpZPwvsPYKawL9pmPC7qvF6wVnOucuNLp1EHHYhdX1Wkp9a25mp/my1IsQgofA==", + "license": "MIT", + "dependencies": { + "@dokieli/web-access-control": "^1.0.0", + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" } }, "node_modules/parent-module": { @@ -8138,11 +8174,12 @@ "license": "ISC" }, "node_modules/solid-logic": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0.tgz", - "integrity": "sha512-irRWnU28Simo2WBhbCgAz4d+QawGJ4zJuiwuBQyObNwuwr4KbDC9evf0CFdnr/PJD8EhLrYT0Fk3nh1eJmQAbA==", + "version": "6.0.1-1", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-1.tgz", + "integrity": "sha512-k0EB26f3whZWfvePl6qHcHhOa4TWfnjPLphAa++s2ZR7+FvruM9Cc9eyvzJqEF6b3HF72jH8V7ENiRseFI51Ow==", "license": "MIT", "dependencies": { + "@dokieli/web-access-control": "^1.1.0", "@uvdsl/solid-oidc-client-browser": "^0.2.3", "solid-namespace": "^0.5.4", "vite": "^8.0.16", @@ -8194,10 +8231,35 @@ "fsevents": "*" } }, + "node_modules/solid-ui/node_modules/pane-registry": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.1.tgz", + "integrity": "sha512-3aeLxm6TnRHfIDoEbpZpNe3Tlm7wWT+ipEpiV6h3cRgxyzmEtrUpS9WB8yJa/VJq0RHXEoaYlLu94fcbuOPnbA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.1", + "solid-logic": "6.0.0" + } + }, + "node_modules/solid-ui/node_modules/solid-logic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0.tgz", + "integrity": "sha512-irRWnU28Simo2WBhbCgAz4d+QawGJ4zJuiwuBQyObNwuwr4KbDC9evf0CFdnr/PJD8EhLrYT0Fk3nh1eJmQAbA==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/solidos-toolkit": { - "version": "0.0.0-dev.998a984ddf8fda587eedb0c8125cb952ac28d191", - "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-0.0.0-dev.998a984ddf8fda587eedb0c8125cb952ac28d191.tgz", - "integrity": "sha512-m2b3sZkKbjV5X/J8N25h3UIbsiQARdnXCGs1AeGqFiueoq8cWm+pdOyPpqiVuqRnnA5osmKG2wovUcBBYumL0Q==", + "version": "1.0.0-dev.c11da40967c5d278451118142650415d688d8d4c", + "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-1.0.0-dev.c11da40967c5d278451118142650415d688d8d4c.tgz", + "integrity": "sha512-i5FOuvpBBbXfYpRKBv4ygdccO5EUUpfo2rp1HoOspG+AOKMVeFqizuPokl+RZX6AVn3AulqRfnlo+NUEWkidEA==", "dev": true, "dependencies": { "@babel/core": "^7.29.0", @@ -8216,10 +8278,10 @@ "vite-plugin-lit-css": "^3.0.0" }, "peerDependencies": { - "pane-registry": "^3.1.1 || ^3.1.2-0 || ^5.0.0 || ^5.0.0-0", + "pane-registry": "^3.1.1 || ^3.1.2-0 || >=5.0.2-0 <6.0.0", "rdflib": "^2.3.6", - "solid-logic": "^4.0.7 || ^4.0.8-0 || ^6.0.0 || ^6.0.0-0", - "solid-ui": "^3.1.2 || ^3.1.3-0 || ^5.0.0 || ^5.0.0-0", + "solid-logic": "^4.0.7 || ^4.0.8-0 || >=6.0.1-0 <7.0.0", + "solid-ui": "^3.1.2 || ^3.1.3-0 || >=5.0.1-0 <6.0.0", "vite": "^8.0.0", "vitest": "^4.0.0" }, diff --git a/package.json b/package.json index 8e2cf95..7ceced7 100644 --- a/package.json +++ b/package.json @@ -70,10 +70,10 @@ "@lit/context": "^1.1.6", "@typescript-eslint/parser": "^8.63.0", "lit": "^3.3.3", - "pane-registry": "5.0.1", + "pane-registry": "5.0.2-0", "rdflib": "2.4.1", - "solid-logic": "6.0.0", "solid-ui": "5.0.1", + "solid-logic": "6.0.1-1", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" diff --git a/src/components/source-editor-card/SourceEditorCard.ts b/src/components/source-editor-card/SourceEditorCard.ts index 1b3d683..373ffc5 100644 --- a/src/components/source-editor-card/SourceEditorCard.ts +++ b/src/components/source-editor-card/SourceEditorCard.ts @@ -1,16 +1,16 @@ import { html, nothing } from 'lit' import { consume } from '@lit/context' -import { customElement, query, state } from 'lit/decorators.js' +import { customElement, property, query, state } from 'lit/decorators.js' import { NamedNode, parse, serialize } from 'rdflib' import { WebComponent, type CodeEditor } from 'solid-ui' -import { fileExplorerContext, type FileExplorerContext } from 'solid-ui' +import { DEFAULT_FILE_EXPLORER_CONTEXT, fileExplorerContext } from 'solid-ui' +import { solidLogicSingleton } from 'solid-logic' import 'solid-ui/components/button' import { checkSyntax, happy } from '../../helpers' import styles from './SourceEditorCard.styles.css' import { getStatusSection } from '../../StatusSection' import { compactable } from '../../compactableFormats' import { sourceContext, SourceContext } from '../../primitives/context' -import { getResponseMetadata } from '../../resourceLoader' @customElement('source-pane-source-editor-card') export default class SourceEditorCard extends WebComponent { @@ -19,6 +19,7 @@ export default class SourceEditorCard extends WebComponent { private _editor?: CodeEditor private _originalContent?: string private _originalContentType?: string + private _loadedResourceUri?: string private _dirtyState = false private _initializing = false @@ -31,10 +32,12 @@ export default class SourceEditorCard extends WebComponent { accessor _editorMount: HTMLDivElement | null = null @consume({ context: sourceContext, subscribe: true }) + @property({ attribute: false }) accessor sourceContext: SourceContext = undefined as unknown as SourceContext @consume({ context: fileExplorerContext, subscribe: true }) - accessor fileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext + @property({ attribute: false }) + accessor fileExplorerContext = DEFAULT_FILE_EXPLORER_CONTEXT private _requireSourceContext () { if (!this.sourceContext) { @@ -83,6 +86,9 @@ export default class SourceEditorCard extends WebComponent { private async _syncEditorToCurrentView() { if (!this._editor) return + const sourceContext = this._requireSourceContext() + this._originalContent = sourceContext.originalContent + this._originalContentType = sourceContext.editorMetadata.contentType const { content, contentType } = await this._getViewContent() await this._editor.setLanguage(contentType) this._editor.setReadOnly(true) @@ -94,7 +100,7 @@ export default class SourceEditorCard extends WebComponent { updateDirtyState(dirty: boolean) { if (this._dirtyState === dirty) return this._dirtyState = dirty - this.fileExplorerContext?.edit?.updateDirtyState?.(dirty) + this.fileExplorerContext.setDirty(dirty) } updateEditingState(editing: boolean) { @@ -112,13 +118,14 @@ export default class SourceEditorCard extends WebComponent { private async _initializeEditor () { if (this._editor || this._initializing) return - this._initializing = true const sourcePaneEditor = this._editorMount const sourceContext = this.sourceContext - if (!sourcePaneEditor || !sourceContext || !this.fileExplorerContext?.store || !this.fileExplorerContext.subjectUri) { - this._initializing = false - return - } + const explorerContext = this.fileExplorerContext + if (!sourcePaneEditor || !sourceContext?.dataLoaded || + !explorerContext || explorerContext === DEFAULT_FILE_EXPLORER_CONTEXT || + !explorerContext.store || !explorerContext.subjectUri) return + + this._initializing = true try { const { CodeEditor } = await import('solid-ui') this._originalContent = sourceContext.originalContent @@ -133,6 +140,7 @@ export default class SourceEditorCard extends WebComponent { throw new Error(`Error initializing code editor: ${err instanceof Error ? err.message : String(err)}`) } this._editorReady = true + this._loadedResourceUri = sourceContext.resourceUri this._editor?.setReadOnly(true) } catch (err) { const { showError } = getStatusSection() @@ -146,6 +154,18 @@ export default class SourceEditorCard extends WebComponent { await this._initializeEditor() } + protected async updated (changedProperties: Map) { + if ((!changedProperties.has('sourceContext') && !changedProperties.has('fileExplorerContext')) || + !this.sourceContext?.dataLoaded) return + + if (!this._editor) { + await this._initializeEditor() + } else if (this._loadedResourceUri !== this.sourceContext.resourceUri) { + this._loadedResourceUri = this.sourceContext.resourceUri + await this._syncEditorToCurrentView() + } + } + disconnectedCallback() { super.disconnectedCallback() if (this._editor) { @@ -155,6 +175,7 @@ export default class SourceEditorCard extends WebComponent { this._editorReady = false this._dirtyState = false this._initializing = false + this._loadedResourceUri = undefined } private async cancelHandler () { @@ -193,8 +214,11 @@ export default class SourceEditorCard extends WebComponent { try { const response = await fetcher.webOperation('HEAD', saveSubject.uri) // , defaultFetchHeaders()) if (!happy(response, 'HEAD')) return - const metadata = getResponseMetadata(store, saveSubject as any, response) - sourceContext.updateMetadata(metadata) + const metadata = await solidLogicSingleton.resource.fetchMetadata(saveSubject) + sourceContext.updateMetadata({ + contentType: metadata.contentType, + eTag: metadata.eTag + }) this._resetEditorState() } catch (err) { throw err @@ -259,7 +283,9 @@ export default class SourceEditorCard extends WebComponent { } render() { - const sectionClass = this._editorReady ? 'sourcePaneCard' : 'sourcePaneCard sourcePaneCardLoading' + const sectionClass = this._editorReady && this.sourceContext?.dataLoaded + ? 'sourcePaneCard' + : 'sourcePaneCard sourcePaneCardLoading' return html`
diff --git a/src/components/source-provider/SourceProvider.styles.css b/src/components/source-provider/SourceProvider.styles.css deleted file mode 100644 index 4ef948a..0000000 --- a/src/components/source-provider/SourceProvider.styles.css +++ /dev/null @@ -1,18 +0,0 @@ -:host { - display: flex; - flex-direction: column; - width: 100%; - align-self: stretch; - box-sizing: border-box; - padding-bottom: 39px; -} - -@media (max-width: 600px) { - :host { - padding-bottom: 0; - } -} - -source-pane-source-header { - margin-bottom: 23px; -} diff --git a/src/components/source-provider/SourceProvider.ts b/src/components/source-provider/SourceProvider.ts index 124ee0f..ea97028 100644 --- a/src/components/source-provider/SourceProvider.ts +++ b/src/components/source-provider/SourceProvider.ts @@ -1,19 +1,16 @@ -import { html, nothing, type PropertyValues } from 'lit' -import { provide } from '@lit/context' -import { customElement, property, query, state } from 'lit/decorators.js' -import { consume } from '@lit/context' +import { html, type PropertyValues } from 'lit' +import { consume, provide } from '@lit/context' +import { customElement, property, state } from 'lit/decorators.js' import { NamedNode } from 'rdflib' import { DataBrowserContext } from 'pane-registry' import { getStatusSection } from '../../StatusSection' import { warn } from '../../debug' import { WebComponent } from 'solid-ui' +import { solidLogicSingleton } from 'solid-logic' import { sourceContext, SourceContext } from '../../primitives/context' import { SourcePaneState, EditorMetadata } from '../../types' import type SourceEditorCard from '../source-editor-card/SourceEditorCard' -import { fetchContentAndMetadata } from '../../resourceLoader' -import { fileExplorerContext, type FileExplorerContext } from 'solid-ui' -import styles from './SourceProvider.styles.css' -void import('../source-editor-card/SourceEditorCard').then(() => undefined) +import { DEFAULT_FILE_EXPLORER_CONTEXT, fileExplorerContext, type FileExplorerContext } from 'solid-ui' function createDefaultSourcePaneState(): SourcePaneState { return { @@ -29,6 +26,8 @@ function createDefaultEditorMetadata(): EditorMetadata { } function createSourceContextValue(input: { + dataLoaded: boolean + resourceUri: string | undefined originalContent: string | undefined sourcePaneState: SourcePaneState editorMetadata: EditorMetadata @@ -36,6 +35,8 @@ function createSourceContextValue(input: { updateMetadata: SourceProvider['updateEditorMetadata'] }): SourceContext { return { + dataLoaded: input.dataLoaded, + resourceUri: input.resourceUri, originalContent: input.originalContent, sourcePaneState: input.sourcePaneState, editorMetadata: input.editorMetadata, @@ -44,25 +45,8 @@ function createSourceContextValue(input: { } } -function createFileExplorerContextValue(input: { - parentContext?: FileExplorerContext - context: DataBrowserContext | undefined - subject: NamedNode | undefined -}): FileExplorerContext { - const inherited: Partial = input.parentContext ?? {} - - return { - ...inherited, - store: inherited.store ?? (input.context?.session.store as FileExplorerContext['store']), - subjectUri: input.subject?.uri ?? inherited.subjectUri, - paneSupportsEditing: inherited.paneSupportsEditing ?? true, - edit: inherited.edit - } -} @customElement('source-pane-source-provider') export default class SourceProvider extends WebComponent { - static styles = styles - @property({ attribute: false }) accessor context: DataBrowserContext | undefined = undefined @@ -70,7 +54,7 @@ export default class SourceProvider extends WebComponent { accessor subject: NamedNode | undefined = undefined @consume({ context: fileExplorerContext, subscribe: true }) - accessor parentFileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext + accessor fileExplorerContext: FileExplorerContext = DEFAULT_FILE_EXPLORER_CONTEXT @state() accessor originalContent: string | undefined = undefined @@ -86,6 +70,8 @@ export default class SourceProvider extends WebComponent { @provide({ context: sourceContext }) accessor sourceContextValue: SourceContext = createSourceContextValue({ + dataLoaded: false, + resourceUri: undefined, originalContent: undefined, sourcePaneState: createDefaultSourcePaneState(), editorMetadata: createDefaultEditorMetadata(), @@ -93,23 +79,13 @@ export default class SourceProvider extends WebComponent { updateMetadata: () => {}, }) - @provide({ context: fileExplorerContext }) - accessor fileExplorerContextValue: FileExplorerContext = createFileExplorerContextValue({ - parentContext: undefined, - context: undefined, - subject: undefined - }) - - @query('source-pane-source-editor-card') - private accessor editorCard: SourceEditorCard | null = null - private loadContentAndMetadata = async () => { if (!this.context || !this.subject) return const subjectUri = this.subject.uri try { - const { content, metadata } = await fetchContentAndMetadata(this.context.session.store as any, this.subject) + const { content, metadata } = await solidLogicSingleton.resource.fetchContentAndMetadata(this.subject) if (this.subject?.uri !== subjectUri) return this.originalContent = content @@ -124,6 +100,8 @@ export default class SourceProvider extends WebComponent { private refreshSourceContextValue() { this.sourceContextValue = createSourceContextValue({ + dataLoaded: this.dataLoaded, + resourceUri: this.subject?.uri, originalContent: this.originalContent, sourcePaneState: this.sourcePaneState, editorMetadata: this.editorMetadata, @@ -132,13 +110,8 @@ export default class SourceProvider extends WebComponent { }) } - private refreshFileExplorerContextValue() { - this.fileExplorerContextValue = createFileExplorerContextValue({ - parentContext: this.parentFileExplorerContext, - context: this.context, - subject: this.subject - }) - } + private unregisterEditor?: () => void + private registeredWith?: FileExplorerContext['registerEditor'] updateSourcePaneState = (key: K, value: SourcePaneState[K]) => { this.sourcePaneState = { @@ -155,7 +128,37 @@ export default class SourceProvider extends WebComponent { } beginEditing = () => { - this.editorCard?.beginEditing() + this.querySelector('source-pane-source-editor-card')?.beginEditing() + } + + private refreshEditorRegistration () { + if (!this.isConnected) return + + const context = this.fileExplorerContext + const registerEditor = !context || context === DEFAULT_FILE_EXPLORER_CONTEXT ? undefined : context.registerEditor + // Context values change with dirty/editing state; the provider's registrar is stable. + if (this.registeredWith === registerEditor) return + + this.unregisterEditor?.() + this.unregisterEditor = undefined + this.registeredWith = undefined + + if (registerEditor) { + this.unregisterEditor = context.registerEditor(this) + this.registeredWith = registerEditor + } + } + + connectedCallback () { + super.connectedCallback() + this.requestUpdate() + } + + disconnectedCallback () { + this.unregisterEditor?.() + this.unregisterEditor = undefined + this.registeredWith = undefined + super.disconnectedCallback() } protected willUpdate (changedProperties: PropertyValues) { @@ -171,37 +174,25 @@ export default class SourceProvider extends WebComponent { if ( changedProperties.has('context') || changedProperties.has('subject') || + changedProperties.has('dataLoaded') || changedProperties.has('originalContent') || changedProperties.has('sourcePaneState') || changedProperties.has('editorMetadata') ) { this.refreshSourceContextValue() } - - if ( - changedProperties.has('context') || - changedProperties.has('subject') || - changedProperties.has('parentFileExplorerContext') - ) { - this.refreshFileExplorerContextValue() - } } protected updated (changedProperties: PropertyValues) { super.updated(changedProperties) + this.refreshEditorRegistration() if (changedProperties.has('context') || changedProperties.has('subject')) { void this.loadContentAndMetadata() } } - render() { - return html` - ${this.dataLoaded - ? html` - - ` - : nothing } - ` + render () { + return html`` } } diff --git a/src/primitives/context.ts b/src/primitives/context.ts index 4a8841e..ee28193 100644 --- a/src/primitives/context.ts +++ b/src/primitives/context.ts @@ -2,6 +2,8 @@ import { createContext } from '@lit/context' import { EditorMetadata, SourcePaneState } from '../types' export interface SourceContext { + dataLoaded: boolean, + resourceUri: string | undefined, originalContent: string | undefined, sourcePaneState: SourcePaneState, editorMetadata: EditorMetadata, diff --git a/src/resourceLoader.ts b/src/resourceLoader.ts deleted file mode 100644 index 2a83d2b..0000000 --- a/src/resourceLoader.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ns } from 'solid-ui' -import { log } from './debug' -import { EditorMetadata } from './types' -import { LiveStore, NamedNode } from 'rdflib' -import { happy } from './helpers' - -export function getResponseMetadata (store: LiveStore, subject: NamedNode, response: Response): EditorMetadata { - let contentType: string | undefined - let eTag: string | undefined - - if (response.headers && response.headers.get('content-type')) { - contentType = response.headers.get('content-type')?.split(';')[0] ?? undefined // Should work but headers may be empty - eTag = response.headers.get('etag') ?? undefined - } else { - const reqs = store.each( - null, - store.sym('http://www.w3.org/2007/ont/link#requestedURI'), - subject - ) - reqs.forEach((req: any) => { - const responseNode = store.any( - req as any, - store.sym('http://www.w3.org/2007/ont/link#response') - ) - if (responseNode && responseNode.termType === 'NamedNode') { - contentType = store.anyValue(responseNode as any, ns.httph('content-type')) || undefined - eTag = store.anyValue(responseNode as any, ns.httph('etag')) || undefined - if (!eTag) log('sourcePane: No eTag on GET') - } - }) - } - - return { contentType, eTag } as EditorMetadata -} - -export async function fetchContentAndMetadata(store: LiveStore, subject: NamedNode): Promise<{ content: string, metadata: EditorMetadata }> { - const fetcher = store.fetcher - - try { - const response = await fetcher.webOperation('GET', subject.uri) - if (!happy(response, 'GET')) { - throw new Error('GET request failed') - } - - const content = (response as Response & { responseText?: string }).responseText - if (content === undefined) { // Defensive https://github.com/linkeddata/rdflib.js/issues/506 - throw new Error('source pane: No text in response object!!') - } - - const metadata = getResponseMetadata(store, subject, response) - if (!metadata.contentType) { - throw new Error('Error: No content-type available!') - } - return { content, metadata } - } catch (error: any) { - throw new Error(`Error reading file: ${error.message}`) - } - -} diff --git a/src/sourcePane.ts b/src/sourcePane.ts index bd225b4..946c1cf 100644 --- a/src/sourcePane.ts +++ b/src/sourcePane.ts @@ -20,6 +20,8 @@ const pane = { name: 'source', label: function (subject: NamedNode, context: DataBrowserContext) { + // Servers can omit MIME types or incorrectly advertise files as LDP containers. + if (/\.[cm]?js$/i.test(new URL(subject.uri).pathname)) return 'Javascript Source' const store = context.session.store const typeURIs = store.findTypeURIs(subject) const prefix = Util.mediaTypeClass('text/*').uri.split('*')[0] @@ -32,10 +34,24 @@ const pane = { return null }, + shouldGetFocus: function (subject: NamedNode) { + return /\.[cm]?js$/i.test(new URL(subject.uri).pathname) + }, + // Create a new text file in a Solid system, mintNew: function (context: DataBrowserContext, newPaneOptions: NewPaneOptions) { const store = context.session.store let newInstance = newPaneOptions.newInstance + // The folder pane supplies a candidate URI for every pane and appends a + // slash while constructing it. A source resource must not retain that + // container marker: it changes the MIME lookup and makes the server treat + // the PUT as an LDP container creation. + if (newInstance?.uri.endsWith('/')) { + const uri = newInstance.uri.slice(0, -1) + newInstance = store.sym(uri) + newPaneOptions.newInstance = newInstance + newPaneOptions.newBase = uri + } if (!newInstance) { let uri = newPaneOptions.newBase if (uri.endsWith('/')) { @@ -89,15 +105,26 @@ const pane = { const sourcePane = context.dom.createElement('div') sourcePane.setAttribute('class', 'sourcePane') const hasDialogsRoot = Boolean(context.dom.querySelector('solid-ui-dialogs-root')) + litRender(html` - + > ${renderStatusSection()} ${hasDialogsRoot ? '' : html``} - `, sourcePane) + `, sourcePane) + + void import('./components/source-editor-card/SourceEditorCard') + .then(() => { + const sourceProvider = sourcePane.querySelector('source-pane-source-provider') + sourceProvider?.append(context.dom.createElement('source-pane-source-editor-card')) + }) + .catch(error => { + const message = `Failed to load source editor: ${error instanceof Error ? error.message : String(error)}` + log(message) + getStatusSection().showError(message) + }) return sourcePane } diff --git a/test/helpers.test.js b/test/helpers.test.js deleted file mode 100644 index 1273e4c..0000000 --- a/test/helpers.test.js +++ /dev/null @@ -1,69 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' - -import { fetchContentAndMetadata, getResponseMetadata } from '../src/resourceLoader.ts' - -describe('resourceLoader', () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it('reads response headers into metadata', () => { - const response = { - headers: { - get: vi.fn((name) => { - if (name === 'content-type') return 'text/turtle; charset=utf-8' - if (name === 'wac-allow') return 'user="write", public="read"' - if (name === 'etag') return '"abc"' - return null - }) - } - } - const store = { - each: vi.fn(), - any: vi.fn(), - anyValue: vi.fn(() => undefined), - sym: vi.fn() - } - const subject = { uri: 'https://example.org/profile/card' } - - expect(getResponseMetadata(store, subject, response)).toEqual({ - contentType: 'text/turtle', - eTag: '"abc"' - }) - }) - - it('fetches content and applies the returned metadata', async () => { - const response = { - ok: true, - headers: { - get: vi.fn((name) => { - if (name === 'content-type') return 'text/turtle' - if (name === 'wac-allow') return 'user="write", public="read"' - if (name === 'etag') return '"abc"' - return null - }) - }, - responseText: '<> a <#Thing>.' - } - const store = { - fetcher: { - webOperation: vi.fn().mockResolvedValue(response) - }, - each: vi.fn(), - any: vi.fn(), - anyValue: vi.fn(() => undefined), - sym: vi.fn() - } - const subject = { uri: 'https://example.org/profile/card' } - - const result = await fetchContentAndMetadata(store, subject) - - expect(result).toEqual({ - content: '<> a <#Thing>.', - metadata: { - contentType: 'text/turtle', - eTag: '"abc"' - } - }) - }) -}) diff --git a/test/sourceEditorCard.test.js b/test/sourceEditorCard.test.js index a26056e..4b44175 100644 --- a/test/sourceEditorCard.test.js +++ b/test/sourceEditorCard.test.js @@ -1,4 +1,18 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import { ContextProvider } from '@lit/context' +import { DEFAULT_FILE_EXPLORER_CONTEXT, fileExplorerContext } from 'solid-ui' +import { sourceContext } from '../src/primitives/context' + +const { initializeEditor } = vi.hoisted(() => ({ initializeEditor: vi.fn(async () => {}) })) + +vi.mock('solid-ui', async importOriginal => ({ + ...await importOriginal(), + CodeEditor: class { + initialize = initializeEditor + setReadOnly () {} + destroy () {} + } +})) beforeAll(async () => { await import('../src/components/source-editor-card/SourceEditorCard.ts') @@ -13,35 +27,75 @@ describe('source-pane-source-editor-card', () => { function createCard ({ contentType = 'text/turtle' } = {}) { const card = document.createElement('source-pane-source-editor-card') - Object.defineProperty(card, 'sourceContext', { - value: { - originalContent: 'hello world', - sourcePaneState: { broken: false }, - editorMetadata: { - contentType, - eTag: '"123"' - }, - updateSourcePaneState: vi.fn(), - updateMetadata: vi.fn() + card.sourceContext = { + dataLoaded: true, + resourceUri: 'https://testingsolidos.solidcommunity.net/profile/card', + originalContent: 'hello world', + sourcePaneState: { broken: false }, + editorMetadata: { + contentType, + eTag: '"123"' }, - writable: true - }) + updateSourcePaneState: vi.fn(), + updateMetadata: vi.fn() + } - Object.defineProperty(card, 'fileExplorerContext', { - value: { - store: { fetcher: {} }, - subjectUri: 'https://testingsolidos.solidcommunity.net/profile/card', - paneSupportsEditing: true, - edit: { - updateDirtyState: vi.fn() - } - }, - writable: true - }) + card.fileExplorerContext = { + store: { fetcher: {} }, + subjectUri: 'https://testingsolidos.solidcommunity.net/profile/card', + pane: undefined, + isDirty: false, + canEdit: true, + registerEditor: vi.fn(() => vi.fn()), + beginEditing: vi.fn(), + setDirty: vi.fn() + } return card } + it('initializes after subscribed source content arrives, not just on firstUpdated', async () => { + const manager = document.createElement('div') + const values = createCard() + const source = new ContextProvider(manager, { + context: sourceContext, + initialValue: { ...values.sourceContext, dataLoaded: false } + }) + new ContextProvider(manager, { + context: fileExplorerContext, + initialValue: values.fileExplorerContext + }) + const card = document.createElement('source-pane-source-editor-card') + manager.append(card) + document.body.append(manager) + await card.updateComplete + expect(initializeEditor).not.toHaveBeenCalled() + + source.setValue(values.sourceContext) + + await vi.waitFor(() => expect(initializeEditor).toHaveBeenCalledOnce()) + await card.updateComplete + expect(card.shadowRoot.querySelector('.sourcePaneCardLoading')).toBeNull() + }) + + it('waits safely for file explorer context and retries when it arrives later', async () => { + const manager = document.createElement('div') + const values = createCard() + new ContextProvider(manager, { context: sourceContext, initialValue: values.sourceContext }) + const explorer = new ContextProvider(manager, { context: fileExplorerContext, initialValue: DEFAULT_FILE_EXPLORER_CONTEXT }) + const card = document.createElement('source-pane-source-editor-card') + manager.append(card) + document.body.append(manager) + await card.updateComplete + expect(initializeEditor).not.toHaveBeenCalled() + + explorer.setValue(values.fileExplorerContext) + + await vi.waitFor(() => expect(initializeEditor).toHaveBeenCalledOnce()) + await card.updateComplete + expect(card.shadowRoot.querySelector('.sourcePaneCardLoading')).toBeNull() + }) + it('shows prettify when not editing and content is compactable', async () => { const card = createCard({ contentType: 'text/turtle' }) document.body.appendChild(card) @@ -90,4 +144,30 @@ describe('source-pane-source-editor-card', () => { expect(card.shadowRoot.querySelector('.sourcePaneSaveButton')).not.toBeNull() expect(card.shadowRoot.querySelector('.sourcePaneCancelButton')).not.toBeNull() }) + + it('updates editor content and MIME type when the selected resource changes', async () => { + const card = createCard({ contentType: 'text/turtle' }) + const editor = { + focusEditor: vi.fn(), + setReadOnly: vi.fn(), + replaceContent: vi.fn(), + resetDirtyState: vi.fn(), + setLanguage: vi.fn(async () => {}), + destroy: vi.fn() + } + card._editor = editor + card._loadedResourceUri = 'https://testingsolidos.solidcommunity.net/profile/card' + card.sourceContext = { + ...card.sourceContext, + resourceUri: 'https://testingsolidos.solidcommunity.net/profile/notes.txt', + originalContent: 'plain text', + editorMetadata: { contentType: 'text/plain', eTag: '"456"' } + } + + await card.updated(new Map([['sourceContext', undefined]])) + + expect(editor.setLanguage).toHaveBeenCalledWith('text/plain') + expect(editor.replaceContent).toHaveBeenCalledWith('plain text') + expect(card.getOriginalContent()).toBe('plain text') + }) }) diff --git a/test/sourcePane.test.js b/test/sourcePane.test.js index 55ccdcb..ce1bb6b 100644 --- a/test/sourcePane.test.js +++ b/test/sourcePane.test.js @@ -1,15 +1,30 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import { ContextProvider } from '@lit/context' +import { fileExplorerContext } from 'solid-ui' let sourcePane beforeAll(async () => { await import('../src/components/source-provider/SourceProvider.ts') sourcePane = (await import('../src/sourcePane.ts')).default - }) function renderPaneIntoDocument () { const container = document.createElement('div') + const fileExplorer = { + store: {}, + subjectUri: 'https://janedoe.example/test.ttl', + pane: undefined, + isDirty: false, + canEdit: true, + registerEditor: vi.fn(() => vi.fn()), + beginEditing: vi.fn(), + setDirty: vi.fn() + } + new ContextProvider(container, { + context: fileExplorerContext, + initialValue: fileExplorer + }) document.body.appendChild(container) const store = { findTypeURIs: vi.fn(() => ({})) } @@ -20,7 +35,7 @@ function renderPaneIntoDocument () { } const rendered = sourcePane.render(subject, context) container.appendChild(rendered) - return { container, subject, store, rendered } + return { container, fileExplorer, subject, store, rendered } } describe('source-pane', () => { @@ -29,12 +44,62 @@ describe('source-pane', () => { vi.clearAllMocks() }) - it('renders the source provider wrapper', async () => { - const { rendered } = renderPaneIntoDocument() - await Promise.resolve() + it.each(['file.js', 'module.mjs', 'module.cjs', 'script.JS?version=1#test'])('offers and focuses Source for %s without MIME metadata', path => { + const subject = { uri: new URL(path, 'https://example.test/').href } + const context = { session: { store: { findTypeURIs: () => ({}) } } } + expect(sourcePane.label(subject, context)).toBe('Javascript Source') + expect(sourcePane.shouldGetFocus(subject)).toBe(true) + }) + + it('does not focus Source for a folder named scripts.js/', () => { + expect(sourcePane.shouldGetFocus({ uri: 'https://example.test/scripts.js/' })).toBe(false) + }) + + it('creates a file when the folder creation contract supplies a trailing slash', async () => { + const newInstance = { uri: 'https://example.test/notes.ttl/' } + const store = { + sym: vi.fn(uri => ({ uri })), + fetcher: { + webOperation: vi.fn().mockResolvedValue(undefined) + } + } + const options = { + folder: { uri: 'https://example.test/' }, + newBase: newInstance.uri, + newInstance, + pane: sourcePane, + noun: 'source', + div: document.createElement('div'), + dom: document, + iconEle: document.createElement('img'), + noIndexHTML: true + } + + await sourcePane.mintNew({ session: { store } }, options) + + expect(store.sym).toHaveBeenCalledWith('https://example.test/notes.ttl') + expect(store.fetcher.webOperation).toHaveBeenCalledWith('PUT', 'https://example.test/notes.ttl', { + data: '\n', + contentType: 'text/turtle' + }) + expect(options.newInstance.uri).toBe('https://example.test/notes.ttl') + }) + + it('loads and renders the source editor only after the source pane is selected', async () => { + expect(customElements.get('source-pane-source-editor-card')).toBeUndefined() + + const { fileExplorer, rendered } = renderPaneIntoDocument() expect(rendered).not.toBeNull() expect(rendered.className).toBe('sourcePane') expect(rendered.getAttribute('class')).toBe('sourcePane') + expect(rendered.querySelector('source-pane-source-provider')).not.toBeNull() + expect(rendered.querySelector('source-pane-source-editor-card')).toBeNull() + + await customElements.whenDefined('source-pane-source-editor-card') + await vi.waitFor(() => { + expect(rendered.querySelector('source-pane-source-editor-card')).not.toBeNull() + }) + expect(fileExplorer.registerEditor).toHaveBeenCalledOnce() }) }) diff --git a/test/sourceProvider.test.js b/test/sourceProvider.test.js index fe9c25a..6c51bfc 100644 --- a/test/sourceProvider.test.js +++ b/test/sourceProvider.test.js @@ -1,11 +1,33 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import { ContextProvider } from '@lit/context' +import { DEFAULT_FILE_EXPLORER_CONTEXT, fileExplorerContext } from 'solid-ui' -const fetchContentAndMetadata = vi.fn() - -vi.mock('../src/resourceLoader.ts', () => ({ - fetchContentAndMetadata +const { fetchContentAndMetadata } = vi.hoisted(() => ({ + fetchContentAndMetadata: vi.fn() })) +vi.mock('solid-logic', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + solidLogicSingleton: { + ...actual.solidLogicSingleton, + resource: { + ...actual.solidLogicSingleton.resource, + fetchContentAndMetadata + } + } + } +}) + +vi.mock('../src/components/source-editor-card/SourceEditorCard.ts', () => { + class SourceEditorCard extends HTMLElement { + beginEditing () {} + } + customElements.define('source-pane-source-editor-card', SourceEditorCard) + return { default: SourceEditorCard } +}) + function deferred () { let resolve let reject @@ -25,6 +47,7 @@ async function flushUpdates (element) { } beforeAll(async () => { + await import('../src/components/source-editor-card/SourceEditorCard.ts') await import('../src/components/source-provider/SourceProvider.ts') }) @@ -32,6 +55,10 @@ describe('source-pane-source-provider', () => { beforeEach(() => { document.body.innerHTML = '' vi.clearAllMocks() + fetchContentAndMetadata.mockResolvedValue({ + content: 'content one', + metadata: { contentType: 'text/turtle', eTag: '"one"' } + }) }) function createProvider () { @@ -42,10 +69,122 @@ describe('source-pane-source-provider', () => { } } provider.subject = { uri: 'https://example.test/one.ttl' } + provider.appendChild(document.createElement('source-pane-source-editor-card')) return provider } + function createFileExplorerContext () { + return { + store: undefined, + subjectUri: 'https://example.test/one.ttl', + pane: undefined, + isDirty: false, + canEdit: false, + registerEditor: vi.fn(() => vi.fn()), + beginEditing: vi.fn(), + setDirty: vi.fn() + } + } + + it('registers once when context values change but the registrar stays the same', async () => { + const provider = createProvider() + const context = createFileExplorerContext() + provider.fileExplorerContext = context + document.body.appendChild(provider) + await flushUpdates(provider) + + expect(context.registerEditor).toHaveBeenCalledExactlyOnceWith(provider) + const unregister = context.registerEditor.mock.results[0].value + + provider.fileExplorerContext = { ...context, canEdit: true, isDirty: true } + provider.requestUpdate() + await flushUpdates(provider) + + expect(context.registerEditor).toHaveBeenCalledTimes(1) + expect(unregister).not.toHaveBeenCalled() + }) + + it('unregisters when the owning provider changes or its context is removed', async () => { + const provider = createProvider() + const first = createFileExplorerContext() + const second = createFileExplorerContext() + provider.fileExplorerContext = first + document.body.appendChild(provider) + await flushUpdates(provider) + + provider.fileExplorerContext = second + provider.requestUpdate() + await flushUpdates(provider) + expect(first.registerEditor.mock.results[0].value).toHaveBeenCalledTimes(1) + expect(second.registerEditor).toHaveBeenCalledExactlyOnceWith(provider) + + provider.fileExplorerContext = DEFAULT_FILE_EXPLORER_CONTEXT + provider.requestUpdate() + await flushUpdates(provider) + expect(second.registerEditor.mock.results[0].value).toHaveBeenCalledTimes(1) + }) + + it('unregisters on disconnect and registers again on reconnect', async () => { + const provider = createProvider() + const context = createFileExplorerContext() + provider.fileExplorerContext = context + document.body.appendChild(provider) + await flushUpdates(provider) + const unregister = context.registerEditor.mock.results[0].value + + provider.remove() + expect(unregister).toHaveBeenCalledTimes(1) + + document.body.appendChild(provider) + await flushUpdates(provider) + expect(context.registerEditor).toHaveBeenCalledTimes(2) + expect(unregister).toHaveBeenCalledTimes(1) + }) + + it('does not register without a file explorer context', async () => { + const provider = createProvider() + document.body.appendChild(provider) + await flushUpdates(provider) + expect(provider.fileExplorerContext).toBe(DEFAULT_FILE_EXPLORER_CONTEXT) + }) + + it('consumes manager context updates without registering the editor again', async () => { + const manager = document.createElement('div') + const context = createFileExplorerContext() + const contextProvider = new ContextProvider(manager, { + context: fileExplorerContext, + initialValue: context + }) + const provider = createProvider() + manager.appendChild(provider) + document.body.appendChild(manager) + await flushUpdates(provider) + + expect(context.registerEditor).toHaveBeenCalledExactlyOnceWith(provider) + + contextProvider.setValue({ ...context, isDirty: true, canEdit: true }) + await flushUpdates(provider) + + expect(provider.fileExplorerContext.isDirty).toBe(true) + expect(context.registerEditor).toHaveBeenCalledTimes(1) + }) + + it('forwards the registered editing action to the editor card', async () => { + const provider = createProvider() + const context = createFileExplorerContext() + provider.fileExplorerContext = context + document.body.appendChild(provider) + await flushUpdates(provider) + await customElements.whenDefined('source-pane-source-editor-card') + const card = provider.querySelector('source-pane-source-editor-card') + const beginEditing = vi.spyOn(card, 'beginEditing').mockImplementation(() => {}) + + context.registerEditor.mock.calls[0][0].beginEditing() + + expect(beginEditing).toHaveBeenCalledTimes(1) + }) + it('reloads when subject changes and re-renders after the new async load', async () => { const secondLoad = deferred() @@ -62,7 +201,7 @@ describe('source-pane-source-provider', () => { await flushUpdates(provider) expect(provider.originalContent).toBe('content one') expect(provider.editorMetadata).toEqual({ contentType: 'text/turtle', eTag: '"one"' }) - expect(provider.shadowRoot.querySelector('source-pane-source-editor-card')).not.toBeNull() + expect(provider.querySelector('source-pane-source-editor-card')).not.toBeNull() provider.subject = { uri: 'https://example.test/two.txt' } await provider.updateComplete @@ -75,7 +214,7 @@ describe('source-pane-source-provider', () => { await flushUpdates(provider) expect(provider.originalContent).toBe('content two') expect(provider.editorMetadata).toEqual({ contentType: 'text/plain', eTag: '"two"' }) - expect(provider.shadowRoot.querySelector('source-pane-source-editor-card')).not.toBeNull() + expect(provider.querySelector('source-pane-source-editor-card')).not.toBeNull() }) it('ignores stale loads that finish after a newer subject load', async () => { From 71db03aae78e5a657ba2fe81545c4e96a4aa96ae Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 22 Oct 2026 19:41:53 +1100 Subject: [PATCH 2/6] address PR feedback --- .../source-editor-card/SourceEditorCard.ts | 32 +++++- .../source-provider/SourceProvider.ts | 21 +++- test/sourceEditorCard.test.js | 105 ++++++++++++++++++ test/sourceProvider.test.js | 22 ++++ 4 files changed, 175 insertions(+), 5 deletions(-) diff --git a/src/components/source-editor-card/SourceEditorCard.ts b/src/components/source-editor-card/SourceEditorCard.ts index 373ffc5..9055712 100644 --- a/src/components/source-editor-card/SourceEditorCard.ts +++ b/src/components/source-editor-card/SourceEditorCard.ts @@ -22,6 +22,9 @@ export default class SourceEditorCard extends WebComponent { private _loadedResourceUri?: string private _dirtyState = false private _initializing = false + private _syncGeneration = 0 + private _syncQueue: Promise = Promise.resolve() + private _editingRequested = false @state() accessor _editorReady = false @@ -68,6 +71,12 @@ export default class SourceEditorCard extends WebComponent { } beginEditing() { + if (!this._editorReady) { + this._editingRequested = true + return + } + + this._editingRequested = false this._isEditing = true this.updateEditingState(true) this.setReadOnly(false) @@ -83,20 +92,29 @@ export default class SourceEditorCard extends WebComponent { } } - private async _syncEditorToCurrentView() { + private async _syncEditorToCurrentView (syncGeneration?: number) { if (!this._editor) return + this.updateEditingState(false) const sourceContext = this._requireSourceContext() this._originalContent = sourceContext.originalContent this._originalContentType = sourceContext.editorMetadata.contentType - const { content, contentType } = await this._getViewContent() + const content = sourceContext.originalContent ?? '' + const contentType = this._originalContentType ?? 'text/turtle' await this._editor.setLanguage(contentType) + if (syncGeneration !== undefined && syncGeneration !== this._syncGeneration) return this._editor.setReadOnly(true) this._editor.replaceContent(content) this._editor.resetDirtyState() this.updateDirtyState(false) } + private queueEditorSynchronization () { + const syncGeneration = ++this._syncGeneration + this._syncQueue = this._syncQueue.then(() => this._syncEditorToCurrentView(syncGeneration)) + return this._syncQueue + } + updateDirtyState(dirty: boolean) { if (this._dirtyState === dirty) return this._dirtyState = dirty @@ -142,6 +160,7 @@ export default class SourceEditorCard extends WebComponent { this._editorReady = true this._loadedResourceUri = sourceContext.resourceUri this._editor?.setReadOnly(true) + if (this._editingRequested) this.beginEditing() } catch (err) { const { showError } = getStatusSection() showError(`Error loading code editor: ${err instanceof Error ? err.message : String(err)}`) @@ -155,6 +174,11 @@ export default class SourceEditorCard extends WebComponent { } protected async updated (changedProperties: Map) { + if (changedProperties.has('sourceContext') && !this.sourceContext?.dataLoaded) { + this._loadedResourceUri = undefined + return + } + if ((!changedProperties.has('sourceContext') && !changedProperties.has('fileExplorerContext')) || !this.sourceContext?.dataLoaded) return @@ -162,7 +186,7 @@ export default class SourceEditorCard extends WebComponent { await this._initializeEditor() } else if (this._loadedResourceUri !== this.sourceContext.resourceUri) { this._loadedResourceUri = this.sourceContext.resourceUri - await this._syncEditorToCurrentView() + await this.queueEditorSynchronization() } } @@ -181,7 +205,7 @@ export default class SourceEditorCard extends WebComponent { private async cancelHandler () { const sourceContext = this.sourceContext if (!sourceContext) return - await this._syncEditorToCurrentView() + await this.queueEditorSynchronization() this._resetEditorState() } diff --git a/src/components/source-provider/SourceProvider.ts b/src/components/source-provider/SourceProvider.ts index ea97028..310f87a 100644 --- a/src/components/source-provider/SourceProvider.ts +++ b/src/components/source-provider/SourceProvider.ts @@ -112,6 +112,8 @@ export default class SourceProvider extends WebComponent { private unregisterEditor?: () => void private registeredWith?: FileExplorerContext['registerEditor'] + private _editingRequested = false + private _childObserver?: MutationObserver updateSourcePaneState = (key: K, value: SourcePaneState[K]) => { this.sourcePaneState = { @@ -128,7 +130,20 @@ export default class SourceProvider extends WebComponent { } beginEditing = () => { - this.querySelector('source-pane-source-editor-card')?.beginEditing() + const editorCard = this.querySelector('source-pane-source-editor-card') + if (editorCard) { + editorCard.beginEditing() + } else { + this._editingRequested = true + } + } + + private applyPendingEditing () { + if (!this._editingRequested) return + const editorCard = this.querySelector('source-pane-source-editor-card') + if (!editorCard) return + this._editingRequested = false + editorCard.beginEditing() } private refreshEditorRegistration () { @@ -151,10 +166,14 @@ export default class SourceProvider extends WebComponent { connectedCallback () { super.connectedCallback() + this._childObserver = new MutationObserver(() => this.applyPendingEditing()) + this._childObserver.observe(this, { childList: true }) this.requestUpdate() } disconnectedCallback () { + this._childObserver?.disconnect() + this._childObserver = undefined this.unregisterEditor?.() this.unregisterEditor = undefined this.registeredWith = undefined diff --git a/test/sourceEditorCard.test.js b/test/sourceEditorCard.test.js index 4b44175..ba81915 100644 --- a/test/sourceEditorCard.test.js +++ b/test/sourceEditorCard.test.js @@ -14,6 +14,14 @@ vi.mock('solid-ui', async importOriginal => ({ } })) +function deferred () { + let resolve + const promise = new Promise(resolvePromise => { + resolve = resolvePromise + }) + return { promise, resolve } +} + beforeAll(async () => { await import('../src/components/source-editor-card/SourceEditorCard.ts') }) @@ -170,4 +178,101 @@ describe('source-pane-source-editor-card', () => { expect(editor.replaceContent).toHaveBeenCalledWith('plain text') expect(card.getOriginalContent()).toBe('plain text') }) + + it('refreshes retained editor content after a same-resource reload', async () => { + const card = createCard() + const editor = { + setReadOnly: vi.fn(), + replaceContent: vi.fn(), + resetDirtyState: vi.fn(), + setLanguage: vi.fn(async () => {}), + destroy: vi.fn() + } + card._editor = editor + card._loadedResourceUri = card.sourceContext.resourceUri + + card.sourceContext = { + ...card.sourceContext, + dataLoaded: false + } + await card.updated(new Map([['sourceContext', undefined]])) + expect(card._loadedResourceUri).toBeUndefined() + + card.sourceContext = { + ...card.sourceContext, + dataLoaded: true, + originalContent: 'fresh content', + editorMetadata: { contentType: 'text/plain', eTag: '"456"' } + } + await card.updated(new Map([['sourceContext', undefined]])) + + expect(editor.replaceContent).toHaveBeenCalledWith('fresh content') + expect(card.getOriginalContent()).toBe('fresh content') + }) + + it('leaves editing mode when synchronizing a new resource', async () => { + const card = createCard() + const editor = { + setReadOnly: vi.fn(), + replaceContent: vi.fn(), + resetDirtyState: vi.fn(), + setLanguage: vi.fn(async () => {}), + destroy: vi.fn() + } + card._editor = editor + card._loadedResourceUri = 'https://example.test/one.ttl' + card._isEditing = true + card.sourceContext = { + ...card.sourceContext, + resourceUri: 'https://example.test/two.txt', + originalContent: 'new content', + editorMetadata: { contentType: 'text/plain', eTag: '"456"' } + } + + await card.updated(new Map([['sourceContext', undefined]])) + + expect(card._isEditing).toBe(false) + expect(editor.setReadOnly).toHaveBeenCalledWith(true) + }) + + it('does not apply an older synchronization after a newer one starts', async () => { + const firstLanguage = deferred() + const secondLanguage = deferred() + const card = createCard() + const editor = { + setReadOnly: vi.fn(), + replaceContent: vi.fn(), + resetDirtyState: vi.fn(), + setLanguage: vi.fn() + .mockImplementationOnce(() => firstLanguage.promise) + .mockImplementationOnce(() => secondLanguage.promise), + destroy: vi.fn() + } + card._editor = editor + card._loadedResourceUri = card.sourceContext.resourceUri + + card.sourceContext = { + ...card.sourceContext, + resourceUri: 'https://example.test/two.txt', + originalContent: 'content two', + editorMetadata: { contentType: 'text/plain', eTag: '"two"' } + } + const firstUpdate = card.updated(new Map([['sourceContext', undefined]])) + + card.sourceContext = { + ...card.sourceContext, + resourceUri: 'https://example.test/three.json', + originalContent: 'content three', + editorMetadata: { contentType: 'application/json', eTag: '"three"' } + } + const secondUpdate = card.updated(new Map([['sourceContext', undefined]])) + + firstLanguage.resolve() + await firstUpdate + secondLanguage.resolve() + await secondUpdate + + expect(editor.replaceContent).toHaveBeenCalledTimes(1) + expect(editor.replaceContent).toHaveBeenCalledWith('content three') + }) }) diff --git a/test/sourceProvider.test.js b/test/sourceProvider.test.js index 6c51bfc..44a2489 100644 --- a/test/sourceProvider.test.js +++ b/test/sourceProvider.test.js @@ -185,6 +185,28 @@ describe('source-pane-source-provider', () => { expect(beginEditing).toHaveBeenCalledTimes(1) }) + it('queues the editing action until the editor card is appended', async () => { + const provider = document.createElement('source-pane-source-provider') + provider.context = { + session: { + store: {} + } + } + provider.subject = { uri: 'https://example.test/one.ttl' } + const context = createFileExplorerContext() + provider.fileExplorerContext = context + document.body.appendChild(provider) + await flushUpdates(provider) + + context.registerEditor.mock.calls[0][0].beginEditing() + const card = document.createElement('source-pane-source-editor-card') + const beginEditing = vi.spyOn(card, 'beginEditing') + provider.appendChild(card) + await Promise.resolve() + + expect(beginEditing).toHaveBeenCalledTimes(1) + }) + it('reloads when subject changes and re-renders after the new async load', async () => { const secondLoad = deferred() From da20e16523ac692ce2d2392d088183d361adf939 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Thu, 22 Oct 2026 19:44:41 +1100 Subject: [PATCH 3/6] update version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e9d44..b2f8a0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "source-pane", - "version": "4.0.0", + "version": "4.0.1-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "source-pane", - "version": "4.0.0", + "version": "4.0.1-0", "license": "MIT", "dependencies": { "@lit/context": "^1.1.6", diff --git a/package.json b/package.json index 7ceced7..cacd45e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "source-pane", - "version": "4.0.0", + "version": "4.0.1-0", "description": "Solid-compatible Panes: Source editor", "main": "dist/index.cjs.js", "exports": { From 1297da9daf6fb65855dcb07c93a21f1e94530d29 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Oct 2026 08:45:34 +0000 Subject: [PATCH 4/6] chore: update solidos dependencies (dev: solid-logic@6.0.1-3 pane-registry@5.0.2-0 solid-ui@5.0.2-2) (latest: rdflib@2.4.1) --- package-lock.json | 740 ++++++++++++++++++++++------------------------ package.json | 4 +- 2 files changed, 363 insertions(+), 381 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2f8a0f..bd8813c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "lit": "^3.3.3", "pane-registry": "5.0.2-0", "rdflib": "2.4.1", - "solid-logic": "6.0.1-1", - "solid-ui": "5.0.1", + "solid-logic": "6.0.1-3", + "solid-ui": "5.0.2-2", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" @@ -34,9 +34,9 @@ } }, "node_modules/@acemir/cssom": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", - "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "version": "0.9.32", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.32.tgz", + "integrity": "sha512-OijrAUu7rrJhSIoHNg6LMPS5e344nwUHA+1EFYYjrh64D+GmytUsfBQjci45TjT+rd5Spsp8B5xsZDT+TgyXXQ==", "dev": true, "license": "MIT" }, @@ -299,14 +299,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", - "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.10.tgz", + "integrity": "sha512-/YY9soQuWa8TURtHXHT+GbklpbAA+dZErxFGHIr6qgDg96xuGWrTAs1+MfjgVJPF0YLQsOVsOYs8lhgsPbOinQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", - "regexpu-core": "^6.3.1", + "regexpu-core": "^6.5.3", "semver": "^6.3.1" }, "engines": { @@ -344,14 +344,14 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "version": "1.22.13", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.13.tgz", + "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", + "is-core-module": "^2.17.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -540,14 +540,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -1851,9 +1851,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1875,16 +1875,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.9", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" @@ -1918,22 +1918,22 @@ } }, "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.3.tgz", + "integrity": "sha512-0GEz8qJWokkUVYQYRukmkSHIFNoBH8QTreeHrAFbvz1XFYc3Y+puhMs8PQ5x8GNugiC2l5jvDBXKLbBIByeSBw==", "dev": true, "license": "MIT", "dependencies": { - "css-tree": "^3.0.0" + "css-tree": "^3.2.1" }, "bin": { "specificity": "bin/cli.js" } }, "node_modules/@codemirror/autocomplete": { - "version": "6.20.3", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", - "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "version": "6.20.4", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.4.tgz", + "integrity": "sha512-yF8RhOf2SXlg00+qtupzLhrglcas61boqaONiNcbPIebHCpJocpqTBA6dyrtUrQO47hqyTdeob/3XnYilT7TaQ==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -2039,12 +2039,13 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", - "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.13.1.tgz", + "integrity": "sha512-zfvU2r3TyylQLMj/te+5CnQ0rSqZi8B1oTCBbQkagcLW4Xc6imab6qN+pEJhsuNOLaJqiRyBXp9UhWA1DhVvDw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", + "@codemirror/streamparser": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", @@ -2053,12 +2054,12 @@ } }, "node_modules/@codemirror/legacy-modes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.4.tgz", - "integrity": "sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.5.tgz", + "integrity": "sha512-9ltT214oMb3Y1w5eAZMSigzrjzZnMI2Wa3Feq73rU/i4C56MkwrpfswfQYOr28C5pXr6dWwspNTMyeHXlzWMxg==", "license": "MIT", "dependencies": { - "@codemirror/language": "^6.0.0" + "@codemirror/streamparser": "^6.0.0" } }, "node_modules/@codemirror/lint": { @@ -2081,10 +2082,16 @@ "@marijn/find-cluster-break": "^1.0.0" } }, + "node_modules/@codemirror/streamparser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@codemirror/streamparser/-/streamparser-6.0.0.tgz", + "integrity": "sha512-JTFPF6xrfjt0mnfGPgzcLiMwYmvIyNaoizp8BYzv8FE8KrT6GBGDZ190rtt+O7Wke3gG/MFHyiY9YGNeimof4w==", + "license": "MIT" + }, "node_modules/@codemirror/view": { - "version": "6.43.13", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.13.tgz", - "integrity": "sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==", + "version": "6.43.15", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.15.tgz", + "integrity": "sha512-HHsfpqFeHyXLs983pSRe38Xajs0vFWZQ2BuX0m7Ki8w3jZ5iD8cuR3lBz2/5/X53Dhf32SBHKh6rtSTB6tKeGw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -2094,9 +2101,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-3.0.1.tgz", - "integrity": "sha512-EqmSJE8CcNoGXcgpiOD12PPMeuJZwiGMX69HPoam+GzltcjZjr6THQ0S+8a0NtQuefJtILzoDyQj+fp7+Qiorg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-3.0.2.tgz", + "integrity": "sha512-B731RJ9pfJj3D5GJPp8ccsaaHMdwBmlOb4QWAYQUFpmMxonxJvNeeIoo0E89CjMJaKDvQXy9MKpSXY/i7XgeFA==", "dev": true, "funding": [ { @@ -2113,7 +2120,7 @@ "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.2", "@csstools/css-tokenizer": "^4.0.2" } }, @@ -2138,9 +2145,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.1.tgz", - "integrity": "sha512-EtC7SoN1j6J4E4DCwg5QgbO5TGxgxIA1RXqe+W+qUM+BUcezx9wT+/tiQ/WO2yCX4i5X+Cuf9ciJ22aP4UEwWw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.3.tgz", + "integrity": "sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==", "dev": true, "funding": [ { @@ -2157,14 +2164,14 @@ "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.2", "@csstools/css-tokenizer": "^4.0.2" } }, "node_modules/@csstools/css-color-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.4.tgz", - "integrity": "sha512-DyefytAZ735mX4Dq/WcDAXFtXhaEFvme0ZS9tVEBAc2whxUthXr0R0L2rmEPm59SrMBkGrFzQviBXMs/UtnABQ==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.6.tgz", + "integrity": "sha512-iiPQ3iRWwnJkeEn6RIu6SJPr7hYrLz6XZ9s/QZl+2/LI5KQVjpl2fdmDSZKuD4xP6GMmMPgHFFXg6k1Wkz0Trg==", "dev": true, "funding": [ { @@ -2179,20 +2186,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.1.2", - "@csstools/css-calc": "^3.4.1" + "@csstools/css-calc": "^3.4.3" }, "engines": { "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.2", "@csstools/css-tokenizer": "^4.0.2" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.1.tgz", - "integrity": "sha512-ShL8BqPfbKJrJiKFH0xBbN0i7Nrh9HXYRuF+pzyj93R/BL2YAsUxJeqANErzqM+0JGl7vjHp+3OIgd/DL69YIA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.2.tgz", + "integrity": "sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==", "dev": true, "funding": [ { @@ -2213,9 +2220,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.14.tgz", - "integrity": "sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.15.tgz", + "integrity": "sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==", "dev": true, "funding": [ { @@ -2258,9 +2265,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.1.tgz", - "integrity": "sha512-DR5NpEOOxDOhmMWPJlhYAV9gTmV4XpfYjtE+aXSCurkxS65KzNogI4wqzRIoujieQcmFkeRtK1nRIF8ImUZTDg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.2.tgz", + "integrity": "sha512-qx19O8AbbLLbDSAcI6YOby/Vq8rV51psgIvlF5OZT/L8fQJDCyQifL6k+kYU4a8ySpzJ4RBzZkIs530bAn8y4Q==", "dev": true, "funding": [ { @@ -2277,7 +2284,7 @@ "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.2", "@csstools/css-tokenizer": "^4.0.2" } }, @@ -2304,9 +2311,9 @@ } }, "node_modules/@digitalbazaar/http-client/node_modules/undici": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.29.0.tgz", - "integrity": "sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==", + "version": "6.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.29.1.tgz", + "integrity": "sha512-EvRlUt/QqAEvXdQeRMYUfwOQsfzpDztykrG2owGEE/rBOBoYv9uF39ZzsNDh4lTFHhTr2XOZjKkYgueD12ZmGA==", "license": "MIT", "engines": { "node": ">=18.17" @@ -2648,9 +2655,9 @@ } }, "node_modules/@iconify-json/lucide": { - "version": "1.2.137", - "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.137.tgz", - "integrity": "sha512-uKz1+tFbv1RFX/mJQNksdnyKJijNfRGSNnxfiyKtr+dLNfA3ERph+IgpXClKGOlV/5GsZwLv2jgJXQ/bjF/JAg==", + "version": "1.2.147", + "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.147.tgz", + "integrity": "sha512-7Qqa/joSBeUxihWsQJx5nKcqMWtV3YrH90Jldxcx4J9ciTLavRUlpexQwRTcx9dcb7CJpISfjZTj42zD/30sqA==", "dev": true, "license": "ISC", "dependencies": { @@ -2752,9 +2759,9 @@ "license": "MIT" }, "node_modules/@lezer/css": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.8.tgz", - "integrity": "sha512-EJn1zcL9qoDptief6ipWKZKLiOpXkxSe0+t8CH9oiMVcZlq7NBWrjCqnc/41EIjeo/ITj1gFFiATdTkaJDL+Og==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.9.tgz", + "integrity": "sha512-ZmzgvTOBdJWGIsY/ItAfN7UW8DV802oZG+jeG6E508SwEzz5YhuAajptpWPICvIyqYAD2+VjMdOS40GgGkyEOQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -2783,9 +2790,9 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.5.tgz", - "integrity": "sha512-sWg4yX1J6XW67AaAynVt0iwF0M5c+np36TEu+P2ifAJ8haRYvHnWDV28r1jdwnJehWCwXECutAUy56K4RBZIyg==", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.6.tgz", + "integrity": "sha512-sEvOqpl4vJQca0NugSQK02vQPbc5KrvoojnYGoqqFgFO0MtcYhwGiHKVEB+LuXYJnfyXo4QPA8ztbrEa4Fw5NA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -2805,18 +2812,18 @@ } }, "node_modules/@lezer/lr": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", - "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.11.tgz", + "integrity": "sha512-UwgZcl1R66H2hDzBrA7kWyYmX6s8p5TQ+e/t7CuvgCtBEPxbEPaHYHu+pJBvTvDotEJpuQkJjbXuHiw5Cixxgw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@lezer/markdown": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz", - "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.8.1.tgz", + "integrity": "sha512-M5YmEcKWO4mJ45Y1hECwqyu8cLv25EiXOK554PVOvDOWOP0olwelHHQUWr9sjF+d1bENVhy0nfJ8E57XZUTiXg==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -2992,9 +2999,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/oxc-project" @@ -3052,9 +3059,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", - "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", "cpu": [ "arm" ], @@ -3068,9 +3075,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", - "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", "cpu": [ "arm64" ], @@ -3084,9 +3091,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", - "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", "cpu": [ "arm64" ], @@ -3100,9 +3107,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", - "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", "cpu": [ "x64" ], @@ -3116,9 +3123,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", - "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", "cpu": [ "x64" ], @@ -3132,9 +3139,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", - "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", "cpu": [ "arm" ], @@ -3148,9 +3155,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", - "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", "cpu": [ "arm64" ], @@ -3167,9 +3174,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", - "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", "cpu": [ "arm64" ], @@ -3186,9 +3193,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", - "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", "cpu": [ "ppc64" ], @@ -3205,9 +3212,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", - "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", "cpu": [ "s390x" ], @@ -3224,9 +3231,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", - "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", "cpu": [ "x64" ], @@ -3243,9 +3250,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", - "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", "cpu": [ "x64" ], @@ -3262,9 +3269,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", - "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", "cpu": [ "arm64" ], @@ -3278,9 +3285,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", - "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", "cpu": [ "arm64" ], @@ -3294,9 +3301,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", - "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", "cpu": [ "x64" ], @@ -3347,9 +3354,9 @@ "license": "MIT" }, "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.5.1.tgz", + "integrity": "sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==", "dev": true, "license": "MIT", "dependencies": { @@ -3449,9 +3456,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.4.tgz", - "integrity": "sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==", + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -3464,15 +3471,15 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.0.tgz", - "integrity": "sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.72.0.tgz", + "integrity": "sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.71.0", - "@typescript-eslint/types": "8.71.0", - "@typescript-eslint/typescript-estree": "8.71.0", - "@typescript-eslint/visitor-keys": "8.71.0", + "@typescript-eslint/scope-manager": "8.72.0", + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0", "debug": "^4.4.3" }, "engines": { @@ -3488,13 +3495,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.0.tgz", - "integrity": "sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.72.0.tgz", + "integrity": "sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.71.0", - "@typescript-eslint/types": "^8.71.0", + "@typescript-eslint/tsconfig-utils": "^8.72.0", + "@typescript-eslint/types": "^8.72.0", "debug": "^4.4.3" }, "engines": { @@ -3509,13 +3516,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.0.tgz", - "integrity": "sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.0.tgz", + "integrity": "sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.71.0", - "@typescript-eslint/visitor-keys": "8.71.0" + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3526,9 +3533,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.0.tgz", - "integrity": "sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.72.0.tgz", + "integrity": "sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3542,9 +3549,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.0.tgz", - "integrity": "sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3555,15 +3562,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.0.tgz", - "integrity": "sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.72.0.tgz", + "integrity": "sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.71.0", - "@typescript-eslint/tsconfig-utils": "8.71.0", - "@typescript-eslint/types": "8.71.0", - "@typescript-eslint/visitor-keys": "8.71.0", + "@typescript-eslint/project-service": "8.72.0", + "@typescript-eslint/tsconfig-utils": "8.72.0", + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3582,12 +3589,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.71.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.0.tgz", - "integrity": "sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.0.tgz", + "integrity": "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.71.0", + "@typescript-eslint/types": "8.72.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3641,14 +3648,14 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.11.tgz", - "integrity": "sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.12.tgz", + "integrity": "sha512-6S7/iVknKglLAxMFxQGNppBI0iqJS2NgM6FBxavitj7KaDq/vywOWGf6dGu7F2L1Qy0G6S3uTp7aGshHrzK8JA==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.11", + "@vitest/utils": "4.1.12", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -3662,8 +3669,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.1.11", - "vitest": "4.1.11" + "@vitest/browser": "4.1.12", + "vitest": "4.1.12" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -3672,15 +3679,15 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", - "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.12.tgz", + "integrity": "sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -3689,12 +3696,12 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", - "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.12.tgz", + "integrity": "sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==", "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.11", + "@vitest/spy": "4.1.12", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -3715,9 +3722,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", - "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.12.tgz", + "integrity": "sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==", "license": "MIT", "dependencies": { "tinyrainbow": "^3.1.0" @@ -3727,12 +3734,12 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", - "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.12.tgz", + "integrity": "sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==", "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.11", + "@vitest/utils": "4.1.12", "pathe": "^2.0.3" }, "funding": { @@ -3740,13 +3747,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", - "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.12.tgz", + "integrity": "sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.11", - "@vitest/utils": "4.1.11", + "@vitest/pretty-format": "4.1.12", + "@vitest/utils": "4.1.12", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -3755,21 +3762,21 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", - "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.12.tgz", + "integrity": "sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==", "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", - "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.12.tgz", + "integrity": "sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.11", + "@vitest/pretty-format": "4.1.12", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -3828,9 +3835,9 @@ } }, "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", "dev": true, "license": "MIT", "bin": { @@ -4079,9 +4086,9 @@ } }, "node_modules/axe-core": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", - "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.14.0.tgz", + "integrity": "sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==", "license": "MPL-2.0", "engines": { "node": ">=4" @@ -4169,9 +4176,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.26", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz", - "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==", + "version": "2.11.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.30.tgz", + "integrity": "sha512-YJs6Pz17RMNv8HoyKREtCY38E3BV1nPkWVmIb+XN1uHC1Vqt3KZCH/uJH9ZKRoiKb/icZ6tvehyee6RZNbFfRA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4204,9 +4211,9 @@ } }, "node_modules/browserslist": { - "version": "4.29.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", - "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", + "version": "4.29.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.4.tgz", + "integrity": "sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==", "dev": true, "funding": [ { @@ -4224,11 +4231,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.26", - "caniuse-lite": "^1.0.30001813", - "electron-to-chromium": "^1.5.439", - "node-releases": "^2.0.57", - "update-browserslist-db": "^1.3.3" + "baseline-browser-mapping": "^2.11.29", + "caniuse-lite": "^1.0.30001816", + "electron-to-chromium": "^1.5.459", + "node-releases": "^2.0.59", + "update-browserslist-db": "^1.3.4" }, "bin": { "browserslist": "cli.js" @@ -4322,9 +4329,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001814", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001814.tgz", - "integrity": "sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==", + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", "dev": true, "funding": [ { @@ -4352,9 +4359,9 @@ } }, "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", "license": "MIT", "engines": { "node": ">=18" @@ -4434,13 +4441,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.50.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", - "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "version": "3.51.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.51.0.tgz", + "integrity": "sha512-52r6fkXgxv4GLMjmFcMWRx7X9bw071xTTdrDcdyPGRqU2oE+9pCG0bAOMifSBdLw0JRBZKEF0q3B55qPlLuE8g==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.28.7" + "browserslist": "^4.29.3" }, "engines": { "node": ">=6.4.0" @@ -4698,9 +4705,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.442", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.442.tgz", - "integrity": "sha512-najZYZ3+ZpjN1z3VOsrBiv5ej18vQgfV2lvEmxWzfmKrk4bdm3Owseyud4yGU6DfFn9pyunoAHDDyM4KmP78Ew==", + "version": "1.5.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.463.tgz", + "integrity": "sha512-nVWNU6ltFjopvOdD44J4zoBkgO0M+WZiFKKFV7EjebOH9z0KNphk6bCEjplXtJofL21ARIuuwWOCsFkBVklm6w==", "dev": true, "license": "ISC" }, @@ -5319,9 +5326,9 @@ } }, "node_modules/exsolve": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", - "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.3.tgz", + "integrity": "sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==", "dev": true, "license": "MIT" }, @@ -7084,9 +7091,9 @@ "license": "MIT" }, "node_modules/n3": { - "version": "2.7.12", - "resolved": "https://registry.npmjs.org/n3/-/n3-2.7.12.tgz", - "integrity": "sha512-Hy6dfGg9yniLQpSBirvH2E2yO3EG7dSmA3aefRbtO411oqtzG8roD3h1kTc/N065bivCOPfTFIjf0KlwW7KlnQ==", + "version": "2.13.12", + "resolved": "https://registry.npmjs.org/n3/-/n3-2.13.12.tgz", + "integrity": "sha512-z944NsyJi58WXcYevtNkUL2JhVr0KP6nvED9AgymQq5V35TDaNn1N8kO+OWJk/kj4PR0L/ilWB3d7/bWceg1CQ==", "license": "MIT", "dependencies": { "buffer": "^6.0.3", @@ -7213,9 +7220,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.57", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", - "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", "dev": true, "license": "MIT", "engines": { @@ -7418,9 +7425,9 @@ } }, "node_modules/package-manager-detector": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", - "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.9.0.tgz", + "integrity": "sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==", "dev": true, "license": "MIT" }, @@ -7535,14 +7542,14 @@ } }, "node_modules/pkg-types": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz", - "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.4.0.tgz", + "integrity": "sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==", "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.3.1", - "exsolve": "^1.1.1", + "exsolve": "^1.1.3", "pathe": "^2.0.3" } }, @@ -7557,9 +7564,9 @@ } }, "node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", "funding": [ { "type": "opencollective", @@ -7576,18 +7583,18 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.18", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-custom-media": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-12.0.2.tgz", - "integrity": "sha512-qn+su6Ux/TVzBSPYlRxC3Kq5DZNWBZt7y1wj38mnHT+whYnM21IxuYVKJ2E9qahBo0KGvcv/1rAB/F5iY1UiIA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-12.0.3.tgz", + "integrity": "sha512-pgOICT/unQexoA/Vh4ZvyAUrcwwA/nHh0SJcOwOombpwDEj1x5N6zK+kz97wy9NslhU6UxhE5c5Q/M2gpYfkJA==", "dev": true, "funding": [ { @@ -7601,10 +7608,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^3.0.1", - "@csstools/css-parser-algorithms": "^4.0.1", + "@csstools/cascade-layer-name-parser": "^3.0.2", + "@csstools/css-parser-algorithms": "^4.0.2", "@csstools/css-tokenizer": "^4.0.2", - "@csstools/media-query-list-parser": "^5.0.1" + "@csstools/media-query-list-parser": "^5.0.2" }, "engines": { "node": ">=20.19.0" @@ -7614,9 +7621,9 @@ } }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.19", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", - "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "funding": [ { "type": "github", @@ -7706,9 +7713,9 @@ } }, "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -7758,9 +7765,9 @@ } }, "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.5.0.tgz", + "integrity": "sha512-1s+CxXjJ71i7LNVy8nYwg47XV4y6lAnOEhsMtSKq3WpmPfhl9LuKlTqKIn/3yUpE8lBz+W+TT88Bxyhnr0U4yw==", "dev": true, "license": "MIT" }, @@ -7799,13 +7806,13 @@ } }, "node_modules/regexpu-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.5.2.tgz", - "integrity": "sha512-zkmVH92DlzjSFc4xKGZp/2BXIFrDIdBQBC8gUXKCsMgKYb1bkCkxfSuoW1werDjaTEMTbULkHtKFHe1L+Abnaw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.5.3.tgz", + "integrity": "sha512-E8VgUoSK+LMQrLboDxavm76MTBGrQhx9RiNuomRmYnZ10Uw12HrI8fkxOOncktb2hBpzIZ9SV/347euQHG5z+g==", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", + "regenerate": "^1.5.0", "regenerate-unicode-properties": "^10.3.0", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", @@ -7824,9 +7831,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", - "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.4.tgz", + "integrity": "sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -7881,12 +7888,12 @@ } }, "node_modules/rolldown": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.11.tgz", - "integrity": "sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.151.0", + "@oxc-project/types": "=0.155.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -7896,21 +7903,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.11", - "@rolldown/binding-android-arm64": "1.2.11", - "@rolldown/binding-darwin-arm64": "1.2.11", - "@rolldown/binding-darwin-x64": "1.2.11", - "@rolldown/binding-freebsd-x64": "1.2.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.11", - "@rolldown/binding-linux-arm64-gnu": "1.2.11", - "@rolldown/binding-linux-arm64-musl": "1.2.11", - "@rolldown/binding-linux-ppc64-gnu": "1.2.11", - "@rolldown/binding-linux-s390x-gnu": "1.2.11", - "@rolldown/binding-linux-x64-gnu": "1.2.11", - "@rolldown/binding-linux-x64-musl": "1.2.11", - "@rolldown/binding-openharmony-arm64": "1.2.11", - "@rolldown/binding-win32-arm64-msvc": "1.2.11", - "@rolldown/binding-win32-x64-msvc": "1.2.11" + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" } }, "node_modules/safe-array-concat": { @@ -8174,9 +8181,9 @@ "license": "ISC" }, "node_modules/solid-logic": { - "version": "6.0.1-1", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-1.tgz", - "integrity": "sha512-k0EB26f3whZWfvePl6qHcHhOa4TWfnjPLphAa++s2ZR7+FvruM9Cc9eyvzJqEF6b3HF72jH8V7ENiRseFI51Ow==", + "version": "6.0.1-3", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-3.tgz", + "integrity": "sha512-4g3Hue5NiuGJZxdrFa2Q6OWGog5L6esBwUOIheCPQvIXxn/Cmd8WvykaIdFYWDwpytMmxqdwW034sdVVzY7bdw==", "license": "MIT", "dependencies": { "@dokieli/web-access-control": "^1.1.0", @@ -8196,9 +8203,9 @@ "license": "MIT" }, "node_modules/solid-ui": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.1.tgz", - "integrity": "sha512-kqHYMoMN+FMSu1+1TaPqOfeuoZErS6EicFJh8erxWdRz5aNbLAGQfVlB7HaafcUvnHKDiWFtlZETfD7YqmRy8Q==", + "version": "5.0.2-2", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.2-2.tgz", + "integrity": "sha512-ug0oyLLkY7I0U1HWOHCq0yn+oUm5F6ztjFHpIsDp0GBk7jk/HiXuDw2GWURK7qeZz0YGBsytk/B6Qc9zH30tBQ==", "license": "MIT", "dependencies": { "@awesome.me/webawesome": "^3.9.0", @@ -8221,9 +8228,9 @@ "escape-html": "^1.0.3", "lit": "^3.3.3", "mime-types": "^3.0.2", - "pane-registry": "5.0.1", + "pane-registry": "5.0.2-0", "rdflib": "2.4.1", - "solid-logic": "6.0.0", + "solid-logic": "6.0.1-3", "solid-namespace": "^0.5.4", "uuid": "^14.0.0" }, @@ -8231,35 +8238,10 @@ "fsevents": "*" } }, - "node_modules/solid-ui/node_modules/pane-registry": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.1.tgz", - "integrity": "sha512-3aeLxm6TnRHfIDoEbpZpNe3Tlm7wWT+ipEpiV6h3cRgxyzmEtrUpS9WB8yJa/VJq0RHXEoaYlLu94fcbuOPnbA==", - "license": "MIT", - "dependencies": { - "rdflib": "2.4.1", - "solid-logic": "6.0.0" - } - }, - "node_modules/solid-ui/node_modules/solid-logic": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0.tgz", - "integrity": "sha512-irRWnU28Simo2WBhbCgAz4d+QawGJ4zJuiwuBQyObNwuwr4KbDC9evf0CFdnr/PJD8EhLrYT0Fk3nh1eJmQAbA==", - "license": "MIT", - "dependencies": { - "@uvdsl/solid-oidc-client-browser": "^0.2.3", - "solid-namespace": "^0.5.4", - "vite": "^8.0.16", - "vitest": "^4.1.9" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/solidos-toolkit": { - "version": "1.0.0-dev.c11da40967c5d278451118142650415d688d8d4c", - "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-1.0.0-dev.c11da40967c5d278451118142650415d688d8d4c.tgz", - "integrity": "sha512-i5FOuvpBBbXfYpRKBv4ygdccO5EUUpfo2rp1HoOspG+AOKMVeFqizuPokl+RZX6AVn3AulqRfnlo+NUEWkidEA==", + "version": "1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e", + "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e.tgz", + "integrity": "sha512-EQMddD3jV0YiPdPuEfBTRc1+QynYiIBwxMs8e3+F/gEP0lfIvSUjFSXCYsJxQxY8rqsEb4YXR4JW/5b1JRtdTQ==", "dev": true, "dependencies": { "@babel/core": "^7.29.0", @@ -8281,7 +8263,7 @@ "pane-registry": "^3.1.1 || ^3.1.2-0 || >=5.0.2-0 <6.0.0", "rdflib": "^2.3.6", "solid-logic": "^4.0.7 || ^4.0.8-0 || >=6.0.1-0 <7.0.0", - "solid-ui": "^3.1.2 || ^3.1.3-0 || >=5.0.1-0 <6.0.0", + "solid-ui": "^3.1.2 || ^3.1.3-0 || >=5.0.1-0 <6.0.0 || ^5.0.2-0", "vite": "^8.0.0", "vitest": "^4.0.0" }, @@ -8307,9 +8289,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8538,22 +8520,22 @@ } }, "node_modules/tldts": { - "version": "7.4.16", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.16.tgz", - "integrity": "sha512-QwBER5KMR86IIjpIiO7H/Z3IMJPsZ1A6RKPAqzTTgOyUQUSt9FdnKcqhTaJmkY6HVrgouZHZR0ncK5QxvmnQeg==", + "version": "7.4.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.19.tgz", + "integrity": "sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.16" + "tldts-core": "^7.4.19" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.16", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.16.tgz", - "integrity": "sha512-MDolfaSJtlSK5Y0A1xl3277ekubZwobpBjugknDizI9O5Rm60a1m8k4ICK+MRsCDzPygT81mp3BBf5RKDlFRfA==", + "version": "7.4.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.19.tgz", + "integrity": "sha512-goNXV6Ho9TIOfpJZanTd6CKG5DyYgYAL+k+22T0SLh8l6+KHIfBUPFuePuSZv05UttIaaLmI9tb7TmGIdK5AkQ==", "dev": true, "license": "MIT" }, @@ -8752,9 +8734,9 @@ } }, "node_modules/undici": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz", - "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", "dev": true, "license": "MIT", "engines": { @@ -8828,9 +8810,9 @@ } }, "node_modules/unplugin-dts": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.1.1.tgz", - "integrity": "sha512-Z2VcabC0hjYuzF62oWmZXVoxagkM8bUWgqUy+dotoJTPnooR5mNaxbpv63JCmcaxdGCW2Bb75omK6FOryOYCRg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.1.2.tgz", + "integrity": "sha512-RDqy90XUmFj6rz4U5YoTMdYdaCJe2ZnQZaWIjkWS4952Gv0zBTQyqWtlGgVMPYHa982dURvyoc+sUOFIcDFv+w==", "dev": true, "license": "MIT", "dependencies": { @@ -8920,9 +8902,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", - "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "dev": true, "funding": [ { @@ -8961,9 +8943,9 @@ } }, "node_modules/uuid": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", - "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.3.tgz", + "integrity": "sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -8974,15 +8956,15 @@ } }, "node_modules/vite": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", - "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", - "postcss": "^8.5.28", - "rolldown": "~1.2.9", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", "tinyglobby": "^0.2.17" }, "bin": { @@ -8999,7 +8981,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -9074,18 +9056,18 @@ } }, "node_modules/vitest": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", - "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.11", - "@vitest/mocker": "4.1.11", - "@vitest/pretty-format": "4.1.11", - "@vitest/runner": "4.1.11", - "@vitest/snapshot": "4.1.11", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.12.tgz", + "integrity": "sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.12", + "@vitest/mocker": "4.1.12", + "@vitest/pretty-format": "4.1.12", + "@vitest/runner": "4.1.12", + "@vitest/snapshot": "4.1.12", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -9113,12 +9095,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.11", - "@vitest/browser-preview": "4.1.11", - "@vitest/browser-webdriverio": "4.1.11", - "@vitest/coverage-istanbul": "4.1.11", - "@vitest/coverage-v8": "4.1.11", - "@vitest/ui": "4.1.11", + "@vitest/browser-playwright": "4.1.12", + "@vitest/browser-preview": "4.1.12", + "@vitest/browser-webdriverio": "^4.1.11", + "@vitest/coverage-istanbul": "4.1.12", + "@vitest/coverage-v8": "4.1.12", + "@vitest/ui": "4.1.12", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" diff --git a/package.json b/package.json index cacd45e..745a319 100644 --- a/package.json +++ b/package.json @@ -72,8 +72,8 @@ "lit": "^3.3.3", "pane-registry": "5.0.2-0", "rdflib": "2.4.1", - "solid-ui": "5.0.1", - "solid-logic": "6.0.1-1", + "solid-logic": "6.0.1-3", + "solid-ui": "5.0.2-2", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" From 0ef9095e2e274afc97272fe3b9da20d1605c5eab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 23 Oct 2026 07:05:50 +0000 Subject: [PATCH 5/6] chore: update solidos dependencies (dev: solid-logic@6.0.1-4 pane-registry@5.0.2-1 solid-ui@5.0.2-2) (latest: rdflib@2.4.1) --- package-lock.json | 175 +++++++++++++++++++++++++++++++++++----------- package.json | 4 +- 2 files changed, 135 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd8813c..44178d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "@lit/context": "^1.1.6", "@typescript-eslint/parser": "^8.63.0", "lit": "^3.3.3", - "pane-registry": "5.0.2-0", + "pane-registry": "5.0.2-1", "rdflib": "2.4.1", - "solid-logic": "6.0.1-3", + "solid-logic": "6.0.1-4", "solid-ui": "5.0.2-2", "vite": "^8.0.16", "vitest": "^4.0.18", @@ -2753,9 +2753,9 @@ "license": "MIT" }, "node_modules/@lezer/common": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.3.tgz", - "integrity": "sha512-H0iErY4e43LpXbYDyBci5W4v/RwTgGV3YzYOlJPiGZ8RY8w51kVE+xLn1tg3Z6UmSfyETvtsUK3r7YsgDQEI7Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.4.tgz", + "integrity": "sha512-xt3Q4z64xM+xhg4M7NXqw1N//1O74bUFo5kz6fwMeC4qwxSuRdwkYSmjcqCEEKYkNw5e67f2hcNqBoNERAEU0w==", "license": "MIT" }, "node_modules/@lezer/css": { @@ -3785,32 +3785,62 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.30.tgz", + "integrity": "sha512-73fjwEV8wat6aOZ6U/y/hqtE30ocrIWECg67b0txGczOMNw+MffLmvJ5fnFfN9drVUEYZzLdaNo6VAy6G6avMw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.28" + "@volar/source-map": "2.4.30" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.30.tgz", + "integrity": "sha512-w/xDsASiqC71ggCOm7sTDXDNk/l72XEptodeRC68tgZ0e5QM4hM3zAqBGC7mBctvhrpYwKfMG+t9xcUo2hEFtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.30", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "<7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.30.tgz", + "integrity": "sha512-zym1ob/KwDDyN+0jGVtxwbxJSRRnUvv5HspCtz3yEfVVdCG4/dzxJktMGPAgemqRuVs81O0o/y0q3qOUErR8kg==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.30.tgz", + "integrity": "sha512-/DgA5tgYFPfrLFuSjIMXMGHk1LQv2+P8eny6+BhGNzFJELWIW7UZlc56ZLIRFhLsPpMfIFxM8/HvOPBggrjTZg==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", + "@volar/language-core": "2.4.30", + "@volar/language-service": "2.4.30", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "<7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@xmldom/xmldom": { @@ -4176,9 +4206,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.30", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.30.tgz", - "integrity": "sha512-YJs6Pz17RMNv8HoyKREtCY38E3BV1nPkWVmIb+XN1uHC1Vqt3KZCH/uJH9ZKRoiKb/icZ6tvehyee6RZNbFfRA==", + "version": "2.11.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.31.tgz", + "integrity": "sha512-b0k7wXlWjpuL/Uxb/pYlpjY0ej5BjAmurtPUk3eRGuloI4yjK32m8TiKUQ81l1ptcLjKS/KH2+uqIolZti1x4Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7432,29 +7462,13 @@ "license": "MIT" }, "node_modules/pane-registry": { - "version": "5.0.2-0", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.2-0.tgz", - "integrity": "sha512-6fU9IyEAttMJwFThbGjLvyrXXNYx0+BmNc4InKA7kFJdVq4ozyojMcrpq4lT2g7xzR1o5xt+Ah+urTxEMQdpcQ==", + "version": "5.0.2-1", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.2-1.tgz", + "integrity": "sha512-gDub2yjXejZ0JQSsEvDpUhff4e205+IIKV2iYJCbBBs65QiN/2a4wmpv2/NZJjoF6FADW+ndv8nSc6w3CxuYFg==", "license": "MIT", "dependencies": { "rdflib": "2.4.1", - "solid-logic": "6.0.1-0" - } - }, - "node_modules/pane-registry/node_modules/solid-logic": { - "version": "6.0.1-0", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-0.tgz", - "integrity": "sha512-ZEJ4aRK5Q16sYoNTiH8aJ2ctvpZPwvsPYKawL9pmPC7qvF6wVnOucuNLp1EHHYhdX1Wkp9a25mp/my1IsQgofA==", - "license": "MIT", - "dependencies": { - "@dokieli/web-access-control": "^1.0.0", - "@uvdsl/solid-oidc-client-browser": "^0.2.3", - "solid-namespace": "^0.5.4", - "vite": "^8.0.16", - "vitest": "^4.1.9" - }, - "engines": { - "node": ">=18" + "solid-logic": "6.0.1-4" } }, "node_modules/parent-module": { @@ -8181,9 +8195,9 @@ "license": "ISC" }, "node_modules/solid-logic": { - "version": "6.0.1-3", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-3.tgz", - "integrity": "sha512-4g3Hue5NiuGJZxdrFa2Q6OWGog5L6esBwUOIheCPQvIXxn/Cmd8WvykaIdFYWDwpytMmxqdwW034sdVVzY7bdw==", + "version": "6.0.1-4", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-4.tgz", + "integrity": "sha512-EVvS+5g91aUoONqGtM1vPnMimtwH6c/72td5b4qBRcudDjeRU/hycPg8p5abmx1YWZseLA1EFK76+E/t5bcPFw==", "license": "MIT", "dependencies": { "@dokieli/web-access-control": "^1.1.0", @@ -8238,6 +8252,48 @@ "fsevents": "*" } }, + "node_modules/solid-ui/node_modules/pane-registry": { + "version": "5.0.2-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.2-0.tgz", + "integrity": "sha512-6fU9IyEAttMJwFThbGjLvyrXXNYx0+BmNc4InKA7kFJdVq4ozyojMcrpq4lT2g7xzR1o5xt+Ah+urTxEMQdpcQ==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.1", + "solid-logic": "6.0.1-0" + } + }, + "node_modules/solid-ui/node_modules/pane-registry/node_modules/solid-logic": { + "version": "6.0.1-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-0.tgz", + "integrity": "sha512-ZEJ4aRK5Q16sYoNTiH8aJ2ctvpZPwvsPYKawL9pmPC7qvF6wVnOucuNLp1EHHYhdX1Wkp9a25mp/my1IsQgofA==", + "license": "MIT", + "dependencies": { + "@dokieli/web-access-control": "^1.0.0", + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/solid-ui/node_modules/solid-logic": { + "version": "6.0.1-3", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-3.tgz", + "integrity": "sha512-4g3Hue5NiuGJZxdrFa2Q6OWGog5L6esBwUOIheCPQvIXxn/Cmd8WvykaIdFYWDwpytMmxqdwW034sdVVzY7bdw==", + "license": "MIT", + "dependencies": { + "@dokieli/web-access-control": "^1.1.0", + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/solidos-toolkit": { "version": "1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e", "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e.tgz", @@ -9173,6 +9229,41 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/vscode-jsonrpc": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-10.0.0.tgz", + "integrity": "sha512-USSfxg0vDIpTQqlQBGxF3mBARyoS8cU7LHLpbYNh6dOJt32dlskxPWB0Irrh5TllTmyf7oNLAvqDqzklbwwnpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.5.tgz", + "integrity": "sha512-FW4fBMzZ99N8xeob4py0l050wgCoRgTpEq5Xcsb9lM1bc29UKGR/wSV+4knaqFxssFHajy7OzNiKP/m3U1ZEuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "10.0.0", + "vscode-languageserver-types": "3.18.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.16.tgz", + "integrity": "sha512-qeNEuOi9a3qkqRf7Gfez2WL2VwlBTLCNekHBGO9kxPVUp9XuY15yfTJ9jwvOwKI0I2MhUUfZq95NSp+LK1CLQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.5.tgz", + "integrity": "sha512-kPd6+JQNz3HMJvjKlqUxERSlZHAntl/aGpsk7ImwIh0ewDKDcjgAEyVSYciPiOJD3ftbK9IrfiqUeTZLSbCizw==", + "dev": true, + "license": "MIT" + }, "node_modules/vscode-uri": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", diff --git a/package.json b/package.json index 745a319..447ed68 100644 --- a/package.json +++ b/package.json @@ -70,9 +70,9 @@ "@lit/context": "^1.1.6", "@typescript-eslint/parser": "^8.63.0", "lit": "^3.3.3", - "pane-registry": "5.0.2-0", + "pane-registry": "5.0.2-1", "rdflib": "2.4.1", - "solid-logic": "6.0.1-3", + "solid-logic": "6.0.1-4", "solid-ui": "5.0.2-2", "vite": "^8.0.16", "vitest": "^4.0.18", From af207f7eb135ab0bea3396b4d6be355f9eae3bd4 Mon Sep 17 00:00:00 2001 From: Sharon Stratsianis Date: Fri, 23 Oct 2026 18:12:59 +1100 Subject: [PATCH 6/6] update solid-ui --- package-lock.json | 54 ++++++----------------------------------------- package.json | 2 +- 2 files changed, 7 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44178d7..b706f31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "pane-registry": "5.0.2-1", "rdflib": "2.4.1", "solid-logic": "6.0.1-4", - "solid-ui": "5.0.2-2", + "solid-ui": "5.0.2-3", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" @@ -8217,9 +8217,9 @@ "license": "MIT" }, "node_modules/solid-ui": { - "version": "5.0.2-2", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.2-2.tgz", - "integrity": "sha512-ug0oyLLkY7I0U1HWOHCq0yn+oUm5F6ztjFHpIsDp0GBk7jk/HiXuDw2GWURK7qeZz0YGBsytk/B6Qc9zH30tBQ==", + "version": "5.0.2-3", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.2-3.tgz", + "integrity": "sha512-ERESxhk6dYjoh/PcsKAwQ5UuxJbO2CTfIG2dccQrEn6/vSNpvVzsVkXsU2QCKemrSirzKiBbbB/eZTYdxLczkA==", "license": "MIT", "dependencies": { "@awesome.me/webawesome": "^3.9.0", @@ -8242,9 +8242,9 @@ "escape-html": "^1.0.3", "lit": "^3.3.3", "mime-types": "^3.0.2", - "pane-registry": "5.0.2-0", + "pane-registry": "5.0.2-1", "rdflib": "2.4.1", - "solid-logic": "6.0.1-3", + "solid-logic": "6.0.1-4", "solid-namespace": "^0.5.4", "uuid": "^14.0.0" }, @@ -8252,48 +8252,6 @@ "fsevents": "*" } }, - "node_modules/solid-ui/node_modules/pane-registry": { - "version": "5.0.2-0", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.2-0.tgz", - "integrity": "sha512-6fU9IyEAttMJwFThbGjLvyrXXNYx0+BmNc4InKA7kFJdVq4ozyojMcrpq4lT2g7xzR1o5xt+Ah+urTxEMQdpcQ==", - "license": "MIT", - "dependencies": { - "rdflib": "2.4.1", - "solid-logic": "6.0.1-0" - } - }, - "node_modules/solid-ui/node_modules/pane-registry/node_modules/solid-logic": { - "version": "6.0.1-0", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-0.tgz", - "integrity": "sha512-ZEJ4aRK5Q16sYoNTiH8aJ2ctvpZPwvsPYKawL9pmPC7qvF6wVnOucuNLp1EHHYhdX1Wkp9a25mp/my1IsQgofA==", - "license": "MIT", - "dependencies": { - "@dokieli/web-access-control": "^1.0.0", - "@uvdsl/solid-oidc-client-browser": "^0.2.3", - "solid-namespace": "^0.5.4", - "vite": "^8.0.16", - "vitest": "^4.1.9" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/solid-ui/node_modules/solid-logic": { - "version": "6.0.1-3", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.1-3.tgz", - "integrity": "sha512-4g3Hue5NiuGJZxdrFa2Q6OWGog5L6esBwUOIheCPQvIXxn/Cmd8WvykaIdFYWDwpytMmxqdwW034sdVVzY7bdw==", - "license": "MIT", - "dependencies": { - "@dokieli/web-access-control": "^1.1.0", - "@uvdsl/solid-oidc-client-browser": "^0.2.3", - "solid-namespace": "^0.5.4", - "vite": "^8.0.16", - "vitest": "^4.1.9" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/solidos-toolkit": { "version": "1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e", "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-1.0.0-dev.2fb6be508170f3b28ca79d738aae71cd48f6d87e.tgz", diff --git a/package.json b/package.json index 447ed68..2f5e2b5 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "pane-registry": "5.0.2-1", "rdflib": "2.4.1", "solid-logic": "6.0.1-4", - "solid-ui": "5.0.2-2", + "solid-ui": "5.0.2-3", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0"