diff --git a/_regroup/package.json b/_regroup/package.json index 698f9a018..23d03330c 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -36,18 +36,18 @@ }, "devDependencies": { "@playwright/test": "1.56.1", - "@stylistic/eslint-plugin": "5.5.0", + "@stylistic/eslint-plugin": "5.6.1", "@types/express": "5.0.5", "@types/node": "24.10.1", "@types/yargs": "17.0.35", - "@vitest/coverage-v8": "3.2.4", + "@vitest/coverage-v8": "4.0.10", "eslint": "9.39.1", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", "jsdoc": "4.0.5", "lorem-ipsum": "2.0.8", "rcedit": "5.0.1", - "rimraf": "6.1.0", + "rimraf": "6.1.2", "tslib": "2.8.1" }, "optionalDependencies": { diff --git a/apps/client/package.json b/apps/client/package.json index 8bdbb9485..5c90f4d56 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -44,7 +44,7 @@ "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "16.5.0", - "i18next": "25.6.2", + "i18next": "25.6.3", "i18next-http-backend": "3.0.2", "jquery": "3.7.1", "jquery.fancytree": "2.38.5", @@ -54,13 +54,13 @@ "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "16.4.2", + "marked": "17.0.0", "mermaid": "11.12.1", "mind-elixir": "5.3.6", "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.27.2", - "react-i18next": "16.3.3", + "react-i18next": "16.3.5", "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", diff --git a/apps/client/src/components/tab_manager.ts b/apps/client/src/components/tab_manager.ts index 517ff2501..127ec30b7 100644 --- a/apps/client/src/components/tab_manager.ts +++ b/apps/client/src/components/tab_manager.ts @@ -647,7 +647,32 @@ export default class TabManager extends Component { ...this.noteContexts.slice(-noteContexts.length), ...this.noteContexts.slice(lastClosedTab.position, -noteContexts.length) ]; - this.noteContextReorderEvent({ ntxIdsInOrder: ntxsInOrder.map((nc) => nc.ntxId).filter((id) => id !== null) }); + + // Update mainNtxId if the restored pane is the main pane in the split pane + const { oldMainNtxId, newMainNtxId } = (() => { + if (noteContexts.length !== 1) { + return { oldMainNtxId: undefined, newMainNtxId: undefined }; + } + + const mainNtxId = noteContexts[0]?.mainNtxId; + const index = this.noteContexts.findIndex(c => c.ntxId === mainNtxId); + + // No need to update if the restored position is after mainNtxId + if (index === -1 || lastClosedTab.position > index) { + return { oldMainNtxId: undefined, newMainNtxId: undefined }; + } + + return { + oldMainNtxId: this.noteContexts[index].ntxId ?? undefined, + newMainNtxId: noteContexts[0]?.ntxId ?? undefined + }; + })(); + + this.triggerCommand("noteContextReorder", { + ntxIdsInOrder: ntxsInOrder.map((nc) => nc.ntxId).filter((id) => id !== null), + oldMainNtxId, + newMainNtxId + }); let mainNtx = noteContexts.find((nc) => nc.isMainContext()); if (mainNtx) { diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx index a29b73830..a9dec12c4 100644 --- a/apps/client/src/print.tsx +++ b/apps/client/src/print.tsx @@ -1,8 +1,8 @@ import FNote from "./entities/fnote"; import { render } from "preact"; -import { CustomNoteList } from "./widgets/collections/NoteList"; +import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList"; import { useCallback, useLayoutEffect, useRef } from "preact/hooks"; -import content_renderer from "./services/content_renderer"; +import content_renderer, { applyInlineMermaid } from "./services/content_renderer"; interface RendererProps { note: FNote; @@ -71,6 +71,11 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) { }) ); + // Initialize mermaid. + if (note.type === "text") { + await applyInlineMermaid(container); + } + // Check custom CSS. await loadCustomCss(note); } @@ -85,7 +90,9 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) { } function CollectionRenderer({ note, onReady }: RendererProps) { + const viewType = useNoteViewType(note); return to
in order not to apply a codeblock style to it. */ +export async function rewriteMermaidDiagramsInContainer(container: HTMLDivElement) { + const mermaidBlocks = container.querySelectorAll('pre:has(code[class="language-mermaid"])'); + if (!mermaidBlocks.length) return; + const nodes: HTMLElement[] = []; + + for (const mermaidBlock of mermaidBlocks) { + const div = document.createElement("div"); + div.classList.add("mermaid-diagram"); + div.innerHTML = mermaidBlock.querySelector("code")?.innerHTML ?? ""; + mermaidBlock.replaceWith(div); + nodes.push(div); + } +} + +export async function applyInlineMermaid(container: HTMLDivElement) { + // Initialize mermaid + const mermaid = (await import("mermaid")).default; + mermaid.initialize(getMermaidConfig()); + const nodes = Array.from(container.querySelectorAll("div.mermaid-diagram")); + console.log("Got nodes", nodes); + try { + await mermaid.run({ nodes }); + } catch (e) { + console.log(e); + } +} + export default { getRenderedContent }; diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 9af93b313..a596e7136 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -467,28 +467,30 @@ function getReferenceLinkTitleSync(href: string) { } } -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("click", "a", goToLink); -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("auxclick", "a", goToLink); // to handle the middle button -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("contextmenu", "a", linkContextMenu); -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("dblclick", "a", goToLink); +if (glob.device !== "print") { + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("click", "a", goToLink); + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("auxclick", "a", goToLink); // to handle the middle button + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("contextmenu", "a", linkContextMenu); + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("dblclick", "a", goToLink); -$(document).on("mousedown", "a", (e) => { - if (e.which === 2) { - // prevent paste on middle click - // https://github.com/zadam/trilium/issues/2995 - // https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event#preventing_default_actions - e.preventDefault(); - return false; - } -}); + $(document).on("mousedown", "a", (e) => { + if (e.which === 2) { + // prevent paste on middle click + // https://github.com/zadam/trilium/issues/2995 + // https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event#preventing_default_actions + e.preventDefault(); + return false; + } + }); +} export default { getNotePathFromUrl, diff --git a/apps/client/src/services/tree.ts b/apps/client/src/services/tree.ts index ec5bc0191..cfa210600 100644 --- a/apps/client/src/services/tree.ts +++ b/apps/client/src/services/tree.ts @@ -89,7 +89,7 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root effectivePathSegments.reverse(); - if (effectivePathSegments.includes(hoistedNoteId)) { + if (effectivePathSegments.includes(hoistedNoteId) && effectivePathSegments.includes('root')) { return effectivePathSegments; } else { const noteId = getNoteIdFromUrl(notePath); diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 60ad28237..eae942344 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2438,6 +2438,15 @@ footer.webview-footer button { .admonition.caution::before { content: "\eac7"; } .admonition.warning::before { content: "\eac5"; } +.ck-content ul.todo-list li span.todo-list__label__description { + transition: opacity 200ms ease; +} + +.ck-content ul.todo-list li:has(input[type="checkbox"]:checked) span.todo-list__label__description { + text-decoration: line-through; + opacity: 0.6; +} + .chat-options-container { display: flex; margin: 5px 0; diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 6113d096a..8a6d19554 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -2019,7 +2019,8 @@ "add-column-placeholder": "请输入列名...", "edit-note-title": "点击编辑笔记标题", "edit-column-title": "点击编辑列标题", - "remove-from-board": "从看板上移除" + "remove-from-board": "从看板上移除", + "column-already-exists": "此列已在看板上。" }, "command_palette": { "tree-action-name": "树形:{{name}}", diff --git a/apps/client/src/translations/cs/translation.json b/apps/client/src/translations/cs/translation.json index 6cdb3321b..6ba0d690f 100644 --- a/apps/client/src/translations/cs/translation.json +++ b/apps/client/src/translations/cs/translation.json @@ -38,16 +38,32 @@ "note": "Poznámka", "search_note": "hledat poznámku podle názvu", "link_title": "Název odkazu", - "button_add_link": "Přidat odkaz" + "button_add_link": "Přidat odkaz", + "link_title_mirrors": "titulek odkazu odráží momentální titulek poznámky", + "link_title_arbitrary": "titulek odkazu může být změněn libovolně" }, "branch_prefix": { "prefix": "Prefix: ", - "save": "Uložit" + "save": "Uložit", + "edit_branch_prefix": "Upravit prefix větve", + "edit_branch_prefix_multiple": "Upravit prefix větve pro {{count}} větví", + "help_on_tree_prefix": "Nápověda k prefixu stromu", + "branch_prefix_saved": "Prefix větve byl uložen.", + "branch_prefix_saved_multiple": "Prefix větve byl uložen pro {{count}} větví.", + "affected_branches": "Ovlivněné větve ({{count}}):" }, "bulk_actions": { "bulk_actions": "Hromadné akce", "affected_notes": "Ovlivněné poznámky", - "notes": "Poznámky" + "notes": "Poznámky", + "include_descendants": "Zahrnout potomky vybraných poznámek", + "available_actions": "Dostupné akce", + "chosen_actions": "Vybrané akce", + "execute_bulk_actions": "Vykonat hromadné akce", + "bulk_actions_executed": "Hromadné akce byly úspěšně provedeny.", + "labels": "Štítky", + "relations": "Relace", + "other": "Ostatní" }, "confirm": { "cancel": "Zrušit", @@ -60,5 +76,11 @@ }, "export": { "close": "Zavřít" + }, + "clone_to": { + "clone_notes_to": "Klonovat poznámky do...", + "help_on_links": "Nápověda k odkazům", + "notes_to_clone": "Poznámky na klonování", + "search_for_note_by_its_name": "hledat poznámku dle jejího názvu" } } diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index 60a848e39..0dd699a8c 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -428,7 +428,8 @@ "add-column": "Aggiungi colonna", "add-column-placeholder": "Inserisci il nome della colonna...", "edit-note-title": "Fare clic per modificare il titolo della nota", - "edit-column-title": "Fare clic per modificare il titolo della colonna" + "edit-column-title": "Fare clic per modificare il titolo della colonna", + "column-already-exists": "Questa colonna esiste già nella bacheca." }, "backup": { "enable_weekly_backup": "Abilita le archiviazioni settimanali", @@ -1262,7 +1263,8 @@ "convert_into_attachment_failed": "Conversione della nota '{{title}}' fallita.", "convert_into_attachment_successful": "Nota '{{title}}' è stato convertito in allegato.", "convert_into_attachment_prompt": "Sei sicuro di voler convertire la nota '{{title}}' in un allegato della nota padre?", - "print_pdf": "Esporta come PDF..." + "print_pdf": "Esporta come PDF...", + "open_note_on_server": "Apri una nota sul server" }, "onclick_button": { "no_click_handler": "Il widget pulsante '{{componentId}}' non ha un gestore di clic definito" @@ -1540,9 +1542,9 @@ "create_label": "Per iniziare, crea un'etichetta con l'indirizzo URL che desideri incorporare, ad esempio #webViewSrc=\"https://www.google.com\"" }, "vacuum_database": { - "title": "Database del vuoto", + "title": "Pulizia del database", "description": "Questa operazione ricostruirà il database, generando in genere un file di dimensioni inferiori. In realtà, nessun dato verrà modificato.", - "button_text": "Database del vuoto", + "button_text": "Pulizia del database", "vacuuming_database": "Aspirazione del database...", "database_vacuumed": "Il database è stato svuotato" }, diff --git a/apps/client/src/translations/tr/translation.json b/apps/client/src/translations/tr/translation.json index d03e85496..17fb7dff4 100644 --- a/apps/client/src/translations/tr/translation.json +++ b/apps/client/src/translations/tr/translation.json @@ -5,25 +5,32 @@ "db_version": "Veritabanı versiyonu:", "title": "Trilium Notes Hakkında", "sync_version": "Eşleştirme versiyonu:", - "data_directory": "Veri dizini:" + "data_directory": "Veri dizini:", + "build_date": "Derleme tarihi:", + "build_revision": "Derleme revizyonu:" }, "branch_prefix": { "save": "Kaydet", "edit_branch_prefix": "Dalın önekini düzenle", "prefix": "Önek: ", - "branch_prefix_saved": "Dal öneki kaydedildi." + "branch_prefix_saved": "Dal öneki kaydedildi.", + "edit_branch_prefix_multiple": "{{count}} dal için dal ön ekini düzenle", + "help_on_tree_prefix": "Ağaç ön eki hakkında yardım", + "branch_prefix_saved_multiple": "Dal ön eki, {{count}} dal için kaydedildi.", + "affected_branches": "Etkilenen dal sayısı ({{count}}):" }, "delete_notes": { "close": "Kapat", "delete_notes_preview": "Not önizlemesini sil", - "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)" + "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)", + "erase_notes_description": "Normal (yazılımsal) silme işlemi, notları yalnızca silinmiş olarak işaretler ve belirli bir süre içinde (son değişiklikler iletişim kutusunda) geri alınabilir. Bu seçeneği işaretlemek, notları hemen siler ve notların geri alınması mümkün olmaz." }, "export": { "close": "Kapat" }, "import": { "chooseImportFile": "İçe aktarım dosyası", - "importDescription": "Seçilen dosya(lar) alt not olarak içe aktarılacaktır" + "importDescription": "Seçilen dosya(lar)ın içeriği, alt not(lar) olarak şuraya içe aktarılacaktır" }, "info": { "closeButton": "Kapat" @@ -34,21 +41,23 @@ "toast": { "critical-error": { "title": "Kritik hata", - "message": "İstemci uygulamasının başlatılmasını engelleyen kritik bir hata meydana geldi\n\n{{message}}\n\nBu muhtemelen bir betiğin beklenmedik şekilde başarısız olmasından kaynaklanıyor. Uygulamayı güvenli modda başlatarak sorunu ele almayı deneyin." + "message": "İstemci uygulamasının başlamasını engelleyen kritik bir hata oluştu:\n\n{{message}}\n\nBunun nedeni büyük olasılıkla bir komut dosyasının beklenmedik bir şekilde başarısız olmasıdır. Uygulamayı güvenli modda başlatmayı ve sorunu gidermeyi deneyin." }, "widget-error": { "title": "Bir widget başlatılamadı", - "message-unknown": "Bilinmeyen widget aşağıdaki sebeple başlatılamadı\n\n{{message}}" + "message-unknown": "Bilinmeyen bir widget aşağıdaki sebeple başlatılamadı\n\n{{message}}", + "message-custom": "ID'si \"{{id}}\" ve başlığı \"{{title}}\" olan nottan alınan özel bileşen şu sebepten başlatılamadı:\n\n{{message}}" }, "bundle-error": { - "title": "Özel bir betik yüklenemedi" + "title": "Özel bir betik yüklenemedi", + "message": "ID'si \"{{id}}\" ve başlığı \"{{title}}\" olan nottan alınan komut dosyası şunun nedeniyle yürütülemedi:\n\n{{message}}" } }, "add_link": { "add_link": "Bağlantı ekle", "help_on_links": "Bağlantılar konusunda yardım", "note": "Not", - "search_note": "isimle not ara", + "search_note": "notu adına göre ara", "link_title_mirrors": "bağlantı adı notun şu anki adıyla aynı", "link_title_arbitrary": "bağlantı adı isteğe bağlı olarak değiştirilebilir", "link_title": "Bağlantı adı", @@ -85,12 +94,13 @@ "cancel": "İptal", "ok": "OK", "are_you_sure_remove_note": "\"{{title}}\" notunu ilişki haritasından kaldırmak istediğinize emin misiniz?. ", - "also_delete_note": "Notu da sil" + "also_delete_note": "Notu da sil", + "if_you_dont_check": "Bunu işaretlemezseniz, not yalnızca ilişki haritasından kaldırılacaktır." }, "ai_llm": { "n_notes_queued": "{{ count }} not dizinleme için sıraya alındı", - "n_notes_queued_plural": "{{ count }} not dizinleme için sıraya alındı", + "n_notes_queued_plural": "{{ count }} adet not dizinleme için sıraya alındı", "notes_indexed": "{{ count }} not dizinlendi", - "notes_indexed_plural": "{{ count }} not dizinlendi" + "notes_indexed_plural": "{{ count }} adet not dizinlendi" } } diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 037957e50..767bb8ffc 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -2019,7 +2019,8 @@ "new-item-placeholder": "輸入筆記標題…", "add-column-placeholder": "輸入行名…", "edit-note-title": "點擊以編輯筆記標題", - "edit-column-title": "點擊以編輯行標題" + "edit-column-title": "點擊以編輯行標題", + "column-already-exists": "此列已在看板上。" }, "command_palette": { "tree-action-name": "樹:{{name}}", diff --git a/apps/client/src/widgets/buttons/close_pane_button.tsx b/apps/client/src/widgets/buttons/close_pane_button.tsx index c171d0d8e..7ffae309d 100644 --- a/apps/client/src/widgets/buttons/close_pane_button.tsx +++ b/apps/client/src/widgets/buttons/close_pane_button.tsx @@ -1,18 +1,20 @@ import { useEffect, useState } from "preact/hooks"; import { t } from "../../services/i18n"; import ActionButton from "../react/ActionButton"; -import { useNoteContext, useTriliumEvent } from "../react/hooks"; +import { useNoteContext, useTriliumEvents } from "../react/hooks"; +import appContext from "../../components/app_context"; export default function ClosePaneButton() { const { noteContext, ntxId, parentComponent } = useNoteContext(); - const [ isEnabled, setIsEnabled ] = useState(false); + const [isEnabled, setIsEnabled] = useState(false); function refresh() { - setIsEnabled(!!(noteContext && !!noteContext.mainNtxId)); + const isMainOfSomeContext = appContext.tabManager.noteContexts.some(c => c.mainNtxId === ntxId); + setIsEnabled(!!(noteContext && (!!noteContext.mainNtxId || isMainOfSomeContext))); } - useTriliumEvent("noteContextReorder", refresh); - useEffect(refresh, [ ntxId ]); + useTriliumEvents(["noteContextRemoved", "noteContextReorder", "newNoteContextCreated"], refresh); + useEffect(refresh, [ntxId]); return ( - + {isUpdateAvailable && <> window.open("https://github.com/TriliumNext/Trilium/releases/latest")} icon="bx bx-download" text={t("global_menu.download-update", {latestVersion})} /> } - + {!isElectron() && } ) @@ -221,9 +221,15 @@ function useTriliumUpdateStatus() { async function updateVersionStatus() { const RELEASES_API_URL = "https://api.github.com/repos/TriliumNext/Trilium/releases/latest"; - const resp = await fetch(RELEASES_API_URL); - const data = await resp.json(); - const latestVersion = data?.tag_name?.substring(1); + let latestVersion: string | undefined = undefined; + try { + const resp = await fetch(RELEASES_API_URL); + const data = await resp.json(); + latestVersion = data?.tag_name?.substring(1); + } catch (e) { + console.warn("Unable to fetch latest version info from GitHub releases API", e); + } + setLatestVersion(latestVersion); } diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index 0a79b5720..04c03b0e8 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -13,6 +13,7 @@ import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } f import { WebSocketMessage } from "@triliumnext/commons"; import froca from "../../services/froca"; import PresentationView from "./presentation"; +import { ListPrintView } from "./legacy/ListPrintView"; interface NoteListProps { note: FNote | null | undefined; @@ -23,22 +24,27 @@ interface NoteListProps { isEnabled: boolean; ntxId: string | null | undefined; media: ViewModeMedia; + viewType: ViewTypeOptions | undefined; onReady?: () => void; } -export default function NoteList(props: Pick) { +export default function NoteList(props: Pick) { const { note, noteContext, notePath, ntxId } = useNoteContext(); - const isEnabled = noteContext?.hasNoteList(); - return -} - -export function SearchNoteList(props: Omit) { - return -} - -export function CustomNoteList({ note, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, ...restProps }: NoteListProps) { - const widgetRef = useRef(null); const viewType = useNoteViewType(note); + const [ enabled, setEnabled ] = useState(noteContext?.hasNoteList()); + useEffect(() => { + setEnabled(noteContext?.hasNoteList()); + }, [ noteContext, viewType ]) + return +} + +export function SearchNoteList(props: Omit) { + const viewType = useNoteViewType(props.note); + return +} + +export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, ...restProps }: NoteListProps) { + const widgetRef = useRef(null); const noteIds = useNoteIds(shouldEnable ? note : null, viewType, ntxId); const isFullHeight = (viewType && viewType !== "list" && viewType !== "grid"); const [ isIntersecting, setIsIntersecting ] = useState(false); @@ -98,7 +104,11 @@ export function CustomNoteList({ note, isEnabled: shouldEnable function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps) { switch (viewType) { case "list": - return ; + if (props.media !== "print") { + return ; + } else { + return ; + } case "grid": return ; case "geoMap": @@ -114,7 +124,7 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps< } } -function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined { +export function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined { const [ viewType ] = useNoteLabel(note, "viewType"); if (!note) { diff --git a/apps/client/src/widgets/collections/board/index.css b/apps/client/src/widgets/collections/board/index.css index aaf694686..8b6ab9180 100644 --- a/apps/client/src/widgets/collections/board/index.css +++ b/apps/client/src/widgets/collections/board/index.css @@ -1,5 +1,4 @@ .board-view { - overflow-x: auto; position: relative; height: 100%; user-select: none; @@ -20,7 +19,6 @@ body.mobile .board-view { display: flex; gap: 1em; padding: 1em; - padding-bottom: 0; align-items: flex-start; } @@ -127,7 +125,8 @@ body.mobile .board-view-container .board-column { .board-view-container .board-column > .board-column-content { flex-grow: 1; - overflow: scroll; + overflow-x: hidden; + overflow-y: auto; padding: 0.5em; } diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index ef37b6685..749036598 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useRef, useState } from "preact/hooks"; +import { useEffect, useRef, useState } from "preact/hooks"; import FNote from "../../../entities/fnote"; import Icon from "../../react/Icon"; import { ViewModeProps } from "../interface"; @@ -11,6 +11,7 @@ import tree from "../../../services/tree"; import link from "../../../services/link"; import { t } from "../../../services/i18n"; import attribute_renderer from "../../../services/attribute_renderer"; +import { filterChildNotes, useFilteredNoteIds } from "./utils"; export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { const [ isExpanded ] = useNoteLabelBoolean(note, "expanded"); @@ -160,30 +161,15 @@ function NoteContent({ note, trim, noChildrenList, highlightedTokens }: { note: } function NoteChildren({ note, parentNote, highlightedTokens }: { note: FNote, parentNote: FNote, highlightedTokens: string[] | null | undefined }) { - const imageLinks = note.getRelations("imageLink"); const [ childNotes, setChildNotes ] = useState(); useEffect(() => { - note.getChildNotes().then(childNotes => { - const filteredChildNotes = childNotes.filter((childNote) => !imageLinks.find((rel) => rel.value === childNote.noteId)); - setChildNotes(filteredChildNotes); - }); + filterChildNotes(note).then(setChildNotes); }, [ note ]); return childNotes?.map(childNote => ) } -/** - * Filters the note IDs for the legacy view to filter out subnotes that are already included in the note content such as images, included notes. - */ -function useFilteredNoteIds(note: FNote, noteIds: string[]) { - return useMemo(() => { - const includedLinks = note ? note.getRelations().filter((rel) => rel.name === "imageLink" || rel.name === "includeNoteLink") : []; - const includedNoteIds = new Set(includedLinks.map((rel) => rel.value)); - return noteIds.filter((noteId) => !includedNoteIds.has(noteId) && noteId !== "_hidden"); - }, noteIds); -} - function getNotePath(parentNote: FNote, childNote: FNote) { if (parentNote.type === "search") { // for search note parent, we want to display a non-search path diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx new file mode 100644 index 000000000..77a354d0d --- /dev/null +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -0,0 +1,110 @@ +import { useEffect, useLayoutEffect, useState } from "preact/hooks"; +import froca from "../../../services/froca"; +import type FNote from "../../../entities/fnote"; +import content_renderer from "../../../services/content_renderer"; +import type { ViewModeProps } from "../interface"; +import { filterChildNotes, useFilteredNoteIds } from "./utils"; + +interface NotesWithContent { + note: FNote; + contentEl: HTMLElement; +} + +export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: ViewModeProps<{}>) { + const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); + const [ notesWithContent, setNotesWithContent ] = useState(); + + useLayoutEffect(() => { + const noteIdsSet = new Set(); + + froca.getNotes(noteIds).then(async (notes) => { + const notesWithContent: NotesWithContent[] = []; + + async function processNote(note: FNote, depth: number) { + const content = await content_renderer.getRenderedContent(note, { + trim: false, + noChildrenList: true + }); + + const contentEl = content.$renderedContent[0]; + + insertPageTitle(contentEl, note.title); + rewriteHeadings(contentEl, depth); + noteIdsSet.add(note.noteId); + notesWithContent.push({ note, contentEl }); + + if (note.hasChildren()) { + const filteredChildNotes = await filterChildNotes(note); + for (const childNote of filteredChildNotes) { + await processNote(childNote, depth + 1); + } + } + } + + for (const note of notes) { + await processNote(note, 1); + } + + // After all notes are processed, rewrite links + for (const { contentEl } of notesWithContent) { + rewriteLinks(contentEl, noteIdsSet); + } + + setNotesWithContent(notesWithContent); + }); + }, [noteIds]); + + useEffect(() => { + if (notesWithContent && onReady) { + onReady(); + } + }, [ notesWithContent, onReady ]); + + return ( +
+ +
+ ); +} + +function insertPageTitle(contentEl: HTMLElement, title: string) { + const pageTitleEl = document.createElement("h1"); + pageTitleEl.textContent = title; + contentEl.prepend(pageTitleEl); +} + +function rewriteHeadings(contentEl: HTMLElement, depth: number) { + const headings = contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6"); + for (const headingEl of headings) { + const currentLevel = parseInt(headingEl.tagName.substring(1), 10); + const newLevel = Math.min(currentLevel + depth, 6); + const newHeadingEl = document.createElement(`h${newLevel}`); + newHeadingEl.innerHTML = headingEl.innerHTML; + headingEl.replaceWith(newHeadingEl); + } +} + +function rewriteLinks(contentEl: HTMLElement, noteIdsSet: Set) { + const linkEls = contentEl.querySelectorAll("a"); + for (const linkEl of linkEls) { + const href = linkEl.getAttribute("href"); + if (href && href.startsWith("#root/")) { + const noteId = href.split("/").at(-1); + + if (noteId && noteIdsSet.has(noteId)) { + linkEl.setAttribute("href", `#note-${noteId}`); + } else { + // Link to note not in the print view, remove link but keep text + const spanEl = document.createElement("span"); + spanEl.innerHTML = linkEl.innerHTML; + linkEl.replaceWith(spanEl); + } + } + } +} diff --git a/apps/client/src/widgets/collections/legacy/utils.ts b/apps/client/src/widgets/collections/legacy/utils.ts new file mode 100644 index 000000000..6432ce1d2 --- /dev/null +++ b/apps/client/src/widgets/collections/legacy/utils.ts @@ -0,0 +1,20 @@ +import { useMemo } from "preact/hooks"; +import FNote from "../../../entities/fnote"; + +/** + * Filters the note IDs for the legacy view to filter out subnotes that are already included in the note content such as images, included notes. + */ +export function useFilteredNoteIds(note: FNote, noteIds: string[]) { + return useMemo(() => { + const includedLinks = note ? note.getRelations().filter((rel) => rel.name === "imageLink" || rel.name === "includeNoteLink") : []; + const includedNoteIds = new Set(includedLinks.map((rel) => rel.value)); + return noteIds.filter((noteId) => !includedNoteIds.has(noteId) && noteId !== "_hidden"); + }, [ note, noteIds ]); +} + +export async function filterChildNotes(note: FNote) { + const imageLinks = note.getRelations("imageLink"); + const imageLinkNoteIds = new Set(imageLinks.map(rel => rel.value)); + const childNotes = await note.getChildNotes(); + return childNotes.filter((childNote) => !imageLinkNoteIds.has(childNote.noteId)); +} diff --git a/apps/client/src/widgets/collections/presentation/index.tsx b/apps/client/src/widgets/collections/presentation/index.tsx index dfa4574e0..ca236a46c 100644 --- a/apps/client/src/widgets/collections/presentation/index.tsx +++ b/apps/client/src/widgets/collections/presentation/index.tsx @@ -41,7 +41,7 @@ export default function PresentationView({ note, noteIds, media, onReady }: View } }, [ api, presentation ]); - if (!presentation || !stylesheets) return; + if (!presentation || !stylesheets || !note.hasChildren()) return; const content = ( <> {stylesheets.map(stylesheet => )} diff --git a/apps/client/src/widgets/containers/split_note_container.ts b/apps/client/src/widgets/containers/split_note_container.ts index 8298d5989..02ed8cf04 100644 --- a/apps/client/src/widgets/containers/split_note_container.ts +++ b/apps/client/src/widgets/containers/split_note_container.ts @@ -100,9 +100,22 @@ export default class SplitNoteContainer extends FlexContainer { } async closeThisNoteSplitCommand({ ntxId }: CommandListenerData<"closeThisNoteSplit">) { - if (ntxId) { - await appContext.tabManager.removeNoteContext(ntxId); + if (!ntxId) return; + const contexts = appContext.tabManager.noteContexts; + const currentIndex = contexts.findIndex((c) => c.ntxId === ntxId); + if (currentIndex === -1) return; + + const isRemoveMainContext = contexts[currentIndex].isMainContext(); + if (isRemoveMainContext && currentIndex + 1 < contexts.length) { + const ntxIds = contexts.map((c) => c.ntxId).filter((c) => !!c) as string[]; + this.triggerCommand("noteContextReorder", { + ntxIdsInOrder: ntxIds, + oldMainNtxId: ntxId, + newMainNtxId: ntxIds[currentIndex + 1] + }); } + + await appContext.tabManager.removeNoteContext(ntxId); } async moveThisNoteSplitCommand({ ntxId, isMovingLeft }: CommandListenerData<"moveThisNoteSplit">) { @@ -167,12 +180,16 @@ export default class SplitNoteContainer extends FlexContainer { splitService.delNoteSplitResizer(ntxIds); } - contextsReopenedEvent({ ntxId, afterNtxId }: EventData<"contextsReopened">) { - if (ntxId === undefined || afterNtxId === undefined) { - // no single split reopened - return; + contextsReopenedEvent({ ntxId, mainNtxId, afterNtxId }: EventData<"contextsReopened">) { + if (ntxId !== undefined && afterNtxId !== undefined) { + this.$widget.find(`[data-ntx-id="${ntxId}"]`).insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`)); + } else if (mainNtxId) { + const contexts = appContext.tabManager.noteContexts; + const nextIndex = contexts.findIndex(c => c.ntxId === mainNtxId); + const beforeNtxId = (nextIndex !== -1 && nextIndex + 1 < contexts.length) ? contexts[nextIndex + 1].ntxId : null; + + this.$widget.find(`[data-ntx-id="${mainNtxId}"]`).insertBefore(this.$widget.find(`[data-ntx-id="${beforeNtxId}"]`)); } - this.$widget.find(`[data-ntx-id="${ntxId}"]`).insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`)); } async refresh() { diff --git a/apps/client/src/widgets/note_tree.ts b/apps/client/src/widgets/note_tree.ts index 1fd373559..49eb4dcac 100644 --- a/apps/client/src/widgets/note_tree.ts +++ b/apps/client/src/widgets/note_tree.ts @@ -1606,7 +1606,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { return !parentNote?.hasLabel("sorted"); } - moveNoteUpCommand({ node }: CommandListenerData<"moveNoteUp">) { + async moveNoteUpCommand({ node }: CommandListenerData<"moveNoteUp">) { if (!node || !this.canBeMovedUpOrDown(node)) { return; } @@ -1614,11 +1614,12 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { const beforeNode = node.getPrevSibling(); if (beforeNode !== null) { - branchService.moveBeforeBranch([node.data.branchId], beforeNode.data.branchId); + await branchService.moveBeforeBranch([node.data.branchId], beforeNode.data.branchId); + node.makeVisible({ scrollIntoView: true }); } } - moveNoteDownCommand({ node }: CommandListenerData<"moveNoteDown">) { + async moveNoteDownCommand({ node }: CommandListenerData<"moveNoteDown">) { if (!this.canBeMovedUpOrDown(node)) { return; } @@ -1626,7 +1627,8 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { const afterNode = node.getNextSibling(); if (afterNode !== null) { - branchService.moveAfterBranch([node.data.branchId], afterNode.data.branchId); + await branchService.moveAfterBranch([node.data.branchId], afterNode.data.branchId); + node.makeVisible({ scrollIntoView: true }); } } diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index cbd3bf406..d7e344dd8 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -49,7 +49,7 @@ function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: Not const canBeConvertedToAttachment = note?.isEligibleForConversionToAttachment(); const isSearchable = ["text", "code", "book", "mindMap", "doc"].includes(note.type); const isInOptionsOrHelp = note?.noteId.startsWith("_options") || note?.noteId.startsWith("_help"); - const isPrintable = ["text", "code"].includes(note.type) || (note.type === "book" && note.getLabelValue("viewType") === "presentation"); + const isPrintable = ["text", "code"].includes(note.type) || (note.type === "book" && ["presentation", "list"].includes(note.getLabelValue("viewType") ?? "")); const isElectron = getIsElectron(); const isMac = getIsMac(); const hasSource = ["text", "code", "relationMap", "mermaid", "canvas", "mindMap", "aiChat"].includes(note.type); diff --git a/apps/client/src/widgets/right_panel_widget.ts b/apps/client/src/widgets/right_panel_widget.ts index 47cd3ced7..43e0b4852 100644 --- a/apps/client/src/widgets/right_panel_widget.ts +++ b/apps/client/src/widgets/right_panel_widget.ts @@ -66,9 +66,14 @@ class RightPanelWidget extends NoteContextAwareWidget { this.$buttons.append((buttonWidget as BasicWidget).render()); } - this.initialized = this.doRenderBody().catch((e) => { - this.logRenderingError(e); - }); + const renderResult = this.doRenderBody(); + if (typeof renderResult === "object" && "catch" in renderResult) { + this.initialized = renderResult.catch((e) => { + this.logRenderingError(e); + }); + } else { + this.initialized = Promise.resolve(); + } } /** @@ -77,7 +82,7 @@ class RightPanelWidget extends NoteContextAwareWidget { * Your class should override this method. * @returns {Promise|undefined} if widget needs async operation to initialize, it can return a Promise */ - async doRenderBody() {} + doRenderBody(): Promise | void {} } export default RightPanelWidget; diff --git a/apps/client/src/widgets/shared_info.tsx b/apps/client/src/widgets/shared_info.tsx index d3665478a..bd0b72bc2 100644 --- a/apps/client/src/widgets/shared_info.tsx +++ b/apps/client/src/widgets/shared_info.tsx @@ -24,7 +24,7 @@ export default function SharedInfo() { const shareId = getShareId(note); if (syncServerHost) { - link = `${syncServerHost}/share/${shareId}`; + link = new URL(`/share/${shareId}`, syncServerHost).href; } else { let host = location.host; if (host.endsWith("/")) { diff --git a/apps/client/src/widgets/tab_row.ts b/apps/client/src/widgets/tab_row.ts index c2405aaed..b78952faf 100644 --- a/apps/client/src/widgets/tab_row.ts +++ b/apps/client/src/widgets/tab_row.ts @@ -820,12 +820,15 @@ export default class TabRowWidget extends BasicWidget { } contextsReopenedEvent({ mainNtxId, tabPosition }: EventData<"contextsReopened">) { - if (!mainNtxId || !tabPosition) { + if (!mainNtxId || tabPosition < 0) { // no tab reopened return; } const tabEl = this.getTabById(mainNtxId)[0]; - tabEl.parentNode?.insertBefore(tabEl, this.tabEls[tabPosition]); + + if ( tabEl && tabEl.parentNode ){ + tabEl.parentNode.insertBefore(tabEl, this.tabEls[tabPosition]); + } } updateTabById(ntxId: string | null) { diff --git a/apps/client/src/widgets/type_widgets/Book.tsx b/apps/client/src/widgets/type_widgets/Book.tsx index 419225e8b..8dd1030c5 100644 --- a/apps/client/src/widgets/type_widgets/Book.tsx +++ b/apps/client/src/widgets/type_widgets/Book.tsx @@ -1,22 +1,23 @@ import { t } from "../../services/i18n"; import Alert from "../react/Alert"; -import { useNoteLabel, useTriliumEvent } from "../react/hooks"; +import { useNoteLabelWithDefault, useTriliumEvent } from "../react/hooks"; import RawHtml from "../react/RawHtml"; import { TypeWidgetProps } from "./type_widget"; import "./Book.css"; import { useEffect, useState } from "preact/hooks"; +import { ViewTypeOptions } from "../collections/interface"; -const VIEW_TYPES = [ "list", "grid" ]; +const VIEW_TYPES: ViewTypeOptions[] = [ "list", "grid", "presentation" ]; export default function Book({ note }: TypeWidgetProps) { - const [ viewType ] = useNoteLabel(note, "viewType"); + const [ viewType ] = useNoteLabelWithDefault(note, "viewType", "grid"); const [ shouldDisplayNoChildrenWarning, setShouldDisplayNoChildrenWarning ] = useState(false); function refresh() { - setShouldDisplayNoChildrenWarning(!note.hasChildren() && VIEW_TYPES.includes(viewType ?? "")); + setShouldDisplayNoChildrenWarning(!note.hasChildren() && VIEW_TYPES.includes(viewType as ViewTypeOptions)); } - useEffect(refresh, [ note ]); + useEffect(refresh, [ note, viewType ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { if (loadResults.getBranchRows().some(branchRow => branchRow.parentNoteId === note.noteId)) { refresh(); diff --git a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx index 545095818..0a17868c5 100644 --- a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx +++ b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx @@ -10,14 +10,13 @@ import RawHtml from "../../react/RawHtml"; import "@triliumnext/ckeditor5"; import FNote from "../../../entities/fnote"; import { getLocaleById } from "../../../services/i18n"; -import { getMermaidConfig } from "../../../services/mermaid"; import { loadIncludedNote, refreshIncludedNote, setupImageOpening } from "./utils"; import { renderMathInElement } from "../../../services/math"; -import link from "../../../services/link"; import { formatCodeBlocks } from "../../../services/syntax_highlight"; import TouchBar, { TouchBarButton, TouchBarSpacer } from "../../react/TouchBar"; import appContext from "../../../components/app_context"; import { applyReferenceLinks } from "./read_only_helper"; +import { applyInlineMermaid, rewriteMermaidDiagramsInContainer } from "../../../services/content_renderer"; export default function ReadOnlyText({ note, noteContext, ntxId }: TypeWidgetProps) { const blob = useNoteBlob(note); @@ -30,6 +29,7 @@ export default function ReadOnlyText({ note, noteContext, ntxId }: TypeWidgetPro const container = contentRef.current; if (!container) return; + rewriteMermaidDiagramsInContainer(container); applyInlineMermaid(container); applyIncludedNotes(container); applyMath(container); @@ -88,26 +88,6 @@ function useNoteLanguage(note: FNote) { return { isRtl }; } -async function applyInlineMermaid(container: HTMLDivElement) { - const mermaidBlocks = container.querySelectorAll('pre:has(code[class="language-mermaid"])'); - if (!mermaidBlocks.length) return; - const nodes: HTMLElement[] = []; - - // Rewrite the code block from
 to 
in order not to apply a codeblock style to it. - for (const mermaidBlock of mermaidBlocks) { - const div = document.createElement("div"); - div.classList.add("mermaid-diagram"); - div.innerHTML = mermaidBlock.querySelector("code")?.innerHTML ?? ""; - mermaidBlock.replaceWith(div); - nodes.push(div); - } - - // Initialize mermaid - const mermaid = (await import("mermaid")).default; - mermaid.initialize(getMermaidConfig()); - mermaid.run({ nodes }); -} - function applyIncludedNotes(container: HTMLDivElement) { const includedNotes = container.querySelectorAll("section.include-note"); for (const includedNote of includedNotes) { diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 076a6b2e3..284551e29 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -35,7 +35,7 @@ "@triliumnext/commons": "workspace:*", "@triliumnext/server": "workspace:*", "copy-webpack-plugin": "13.0.1", - "electron": "38.7.0", + "electron": "38.7.1", "@electron-forge/cli": "7.10.2", "@electron-forge/maker-deb": "7.10.2", "@electron-forge/maker-dmg": "7.10.2", diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json index f7f757826..af66c3623 100644 --- a/apps/edit-docs/package.json +++ b/apps/edit-docs/package.json @@ -12,7 +12,7 @@ "@triliumnext/desktop": "workspace:*", "@types/fs-extra": "11.0.4", "copy-webpack-plugin": "13.0.1", - "electron": "38.7.0", + "electron": "38.7.1", "fs-extra": "11.3.2" }, "scripts": { diff --git a/apps/server-e2e/src/layout/tree.spec.ts b/apps/server-e2e/src/layout/tree.spec.ts new file mode 100644 index 000000000..ba244a9d3 --- /dev/null +++ b/apps/server-e2e/src/layout/tree.spec.ts @@ -0,0 +1,38 @@ +import { test, expect } from "@playwright/test"; +import App from "../support/app"; + +const OPTIONS_TITLE = "Options"; +const NOTE_TITLE = "Tree Operations" + +test("Hoist note remains expanded when opening Options and clicking child note", async ({ page, context }) => { + const app = new App(page, context); + await app.goto(); + await app.closeAllTabs(); + + await app.goToSettings(); + + // Activate it when opening Options + await expect(app.noteTreeActiveNote).toContainText(OPTIONS_TITLE); + + // Clicking a hoist’s child note does not collapse the hoist note + await app.clickNoteOnNoteTreeByTitle("Appearance"); + const node = app.page.locator(".fancytree-node.fancytree-submatch:has(.bx-cog)"); + await expect(node).toHaveClass(/fancytree-expanded/); +}); + +test("Activate it when hoisting a note", async ({ page, context }) => { + const app = new App(page, context); + await app.goto(); + await app.closeAllTabs(); + + const treeNode = app.noteTree.getByText(NOTE_TITLE); + await treeNode.click({ button: "right" }); + const hoistMenuItem = page.locator( + '#context-menu-container .dropdown-item span', + { hasText: "Hoist note" } + ); + await hoistMenuItem.click(); + await expect(app.noteTreeActiveNote).toContainText(NOTE_TITLE); + await app.page.locator(".unhoist-button").click(); + await expect(app.noteTreeActiveNote).toContainText(NOTE_TITLE); +}); diff --git a/apps/server/package.json b/apps/server/package.json index cab290521..0b22d041b 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -30,7 +30,7 @@ "node-html-parser": "7.0.1" }, "devDependencies": { - "@anthropic-ai/sdk": "0.69.0", + "@anthropic-ai/sdk": "0.70.0", "@braintree/sanitize-url": "7.1.1", "@electron/remote": "2.1.3", "@preact/preset-vite": "2.10.2", @@ -51,7 +51,6 @@ "@types/fs-extra": "11.0.4", "@types/html": "1.0.4", "@types/ini": "4.1.1", - "@types/js-yaml": "4.0.9", "@types/mime-types": "3.0.1", "@types/multer": "2.0.0", "@types/safe-compare": "1.1.2", @@ -81,7 +80,7 @@ "debounce": "3.0.0", "debug": "4.4.3", "ejs": "3.1.10", - "electron": "38.7.0", + "electron": "38.7.1", "electron-debug": "4.1.0", "electron-window-state": "5.0.3", "escape-html": "1.0.3", @@ -97,20 +96,19 @@ "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", - "i18next": "25.6.2", + "i18next": "25.6.3", "i18next-fs-backend": "2.6.1", "image-type": "6.0.0", "ini": "6.0.0", "is-animated": "2.0.2", "is-svg": "6.1.0", "jimp": "1.6.0", - "js-yaml": "4.1.1", - "marked": "16.4.2", + "marked": "17.0.0", "mime-types": "3.0.1", "multer": "2.0.2", "normalize-strings": "1.1.1", "ollama": "0.6.3", - "openai": "6.9.0", + "openai": "6.9.1", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html index c0cf16ba9..35ae5862b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -4,7 +4,6 @@
Screenshot of the note contextual menu indicating the “Export as PDF” option.
-

Printing

This feature allows printing of notes. It works on both the desktop client, but also on the web.

@@ -60,9 +59,9 @@ class="admonition note"> orientation, size. However, there are a few Attributes to adjust some of the settings:

    -
  • To print in landscape mode instead of portrait (useful for big diagrams +
  • To print in landscape mode instead of portrait (useful for big diagrams or slides), add #printLandscape.
  • -
  • By default, the resulting PDF will be in Letter format. It is possible +
  • By default, the resulting PDF will be in Letter format. It is possible to adjust it to another page size via the #printPageSize attribute, with one of the following values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
@@ -70,15 +69,26 @@ class="admonition note">

These options have no effect when used with the printing feature, since the user-defined settings are used instead.

+

Printing multiple notes

+

Since v0.100.0, it is possible to print more than one note at the time + by using Collections:

+
    +
  1. First create a collection.
  2. +
  3. Configure it to use List View.
  4. +
  5. Print the collection note normally.
  6. +
+

The resulting collection will contain all the children of the collection, + while maintaining the hierarchy.

Keyboard shortcut

It's possible to trigger both printing and export as PDF from the keyboard by going to Keyboard shortcuts in Options and assigning a key combination for:

    -
  • Print Active Note +
  • Print Active Note
  • -
  • Export Active Note as PDF +
  • Export Active Note as PDF

Constraints & limitations

@@ -86,24 +96,28 @@ class="admonition note"> supported when printing, in which case the Print and Export as PDF options will be disabled.

    -
  • For Code notes: +
  • For Code notes:
      -
    • Line numbers are not printed.
    • -
    • Syntax highlighting is enabled, however a default theme (Visual Studio) +
    • Line numbers are not printed.
    • +
    • Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
  • -
  • For Collections: +
  • For Collections:
      -
    • Only Presentation is - currently supported.
    • -
    • We plan to add support for all the collection types at some point.
    • +
    • List View is + supported, allowing to print multiple notes at once while preserving hierarchy + (similar to a book).
    • +
    • Presentation is + also supported, where each slide/subnote is displayed.
    • +
    • The rest of the collections are not supported, but we plan to add support + for all the collection types at some point.
  • -
  • Using Custom app-wide CSS for +
  • Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism.
      -
    • We plan to introduce a new mechanism specifically for a print CSS.
    • +
    • We plan to introduce a new mechanism specifically for a print CSS.
@@ -114,10 +128,10 @@ class="admonition note"> printing.

To do so:

    -
  • Create a CSS code note.
  • -
  • On the note being printed, apply the ~printCss relation to +
  • Create a CSS code note.
  • +
  • On the note being printed, apply the ~printCss relation to point to the newly created CSS code note.
  • -
  • To apply the CSS to multiple notes, consider using inheritable attributes or  +
  • To apply the CSS to multiple notes, consider using inheritable attributes or  Templates.
@@ -128,12 +142,13 @@ class="admonition note"> }

To remark:

    -
  • Multiple CSS notes can be add by using multiple ~printCss relations.
  • -
  • If the note pointing to the printCss doesn't have the right +
  • Multiple CSS notes can be add by using multiple ~printCss relations.
  • +
  • If the note pointing to the printCss doesn't have the right note type or mime type, it will be ignored.
  • -
  • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since - the style-sheet is used only for printing.
  • +
  • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since + the style-sheet is used only for printing.

Under the hood

Both printing and exporting as PDF use the same mechanism: a note is rendered diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html index f3e4926b4..64c09e024 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html @@ -12,9 +12,22 @@ as a single continuous document.

Interaction

    -
  • Each note can be expanded or collapsed by clicking on the arrow to the +
  • Each note can be expanded or collapsed by clicking on the arrow to the left of the title.
  • -
  • In the Ribbon, +
  • In the Ribbon, in the Collection tab there are options to expand and to collapse all notes easily.
  • +
+

Printing and exporting to PDF

+

Since v0.100.0, list collections can be printed or exported to PDF.

+

A printed list collection will print all the notes in the collection, + in the right order and preserving the full hierarchy.

+

If exported to PDF within the desktop application, there is additional + functionality:

+
    +
  • The table of contents of the PDF will reflect the structure of the notes.
  • +
  • Reference and inline links to other notes within the same hierarchy will + be functional (will jump to the corresponding page). If a link refers to + a note that is not in the printed hierarchy, it will be unlinked.
\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html index c9bbc131f..b48e60add 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html @@ -16,7 +16,7 @@ - traefik.http.middlewares.trilium-headers.headers.customrequestheaders.X-Forwarded-Proto=https

Setup needed environment variables

After setting up a reverse proxy, make sure to configure the [missing note].

+ href="#root/_help_LLzSMXACKhUs">[missing note].

Example docker-compose.yaml

services:
   trilium:
     image: triliumnext/trilium
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html
index 7b571b628..27437786f 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html	
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html	
@@ -1,6 +1,10 @@
 
  • doRender must not be overridden, instead doRenderBody() has - to be overridden.
  • + to be overridden. +
      +
    • doRenderBody can optionally be async.
    • +
    +
  • parentWidget() must be set to “rightPane”.
  • widgetTitle() getter can optionally be overriden, otherwise the widget will be displayed as “Untitled widget”.
  • diff --git a/apps/server/src/assets/translations/tr/server.json b/apps/server/src/assets/translations/tr/server.json index 2ee2a7721..3212670bf 100644 --- a/apps/server/src/assets/translations/tr/server.json +++ b/apps/server/src/assets/translations/tr/server.json @@ -1,6 +1,16 @@ { "keyboard_actions": { "back-in-note-history": "Geçmişteki önceki nota git", - "forward-in-note-history": "Geçmişteki sonraki nota git" + "forward-in-note-history": "Geçmişteki sonraki nota git", + "open-jump-to-note-dialog": "\"Nota geçiş yap\" iletişim kutusunu aç", + "open-command-palette": "Komut setini göster", + "scroll-to-active-note": "Not ağacını etkin olan nota kaydır", + "quick-search": "Hızlı arama çubuğunu etkinleştir", + "search-in-subtree": "Etkin notun alt ağacındaki notları ara", + "expand-subtree": "Geçerli notun alt ağacını genişlet", + "move-note-up": "Notu bir üste taşı", + "collapse-tree": "Tüm not ağacını daraltır", + "collapse-subtree": "Geçerli notun alt ağacını daraltır", + "sort-child-notes": "Alt notları sırala" } } diff --git a/apps/server/src/assets/views/desktop.ejs b/apps/server/src/assets/views/desktop.ejs index 8d4e30176..0a25c0625 100644 --- a/apps/server/src/assets/views/desktop.ejs +++ b/apps/server/src/assets/views/desktop.ejs @@ -53,7 +53,6 @@ - diff --git a/apps/server/src/assets/views/mobile.ejs b/apps/server/src/assets/views/mobile.ejs index b5ea77a16..0eaa11736 100644 --- a/apps/server/src/assets/views/mobile.ejs +++ b/apps/server/src/assets/views/mobile.ejs @@ -132,7 +132,6 @@ - diff --git a/apps/server/src/routes/api/llm.spec.ts b/apps/server/src/routes/api/llm.spec.ts index f8afddfa6..846b9ecc9 100644 --- a/apps/server/src/routes/api/llm.spec.ts +++ b/apps/server/src/routes/api/llm.spec.ts @@ -52,9 +52,9 @@ vi.mock("../../services/llm/ai_service_manager.js", () => ({ // Mock chat pipeline const mockChatPipelineExecute = vi.fn(); -const MockChatPipeline = vi.fn().mockImplementation(() => ({ - execute: mockChatPipelineExecute -})); +class MockChatPipeline { + execute = mockChatPipelineExecute; +} vi.mock("../../services/llm/pipeline/chat_pipeline.js", () => ({ ChatPipeline: MockChatPipeline })); @@ -328,6 +328,7 @@ describe("LLM API Tests", () => { }); // Create a fresh chat for each test + // Return a new object each time to avoid shared state issues with concurrent requests const mockChat = { id: 'streaming-test-chat', title: 'Streaming Test Chat', @@ -335,7 +336,10 @@ describe("LLM API Tests", () => { createdAt: new Date().toISOString() }; mockChatStorage.createChat.mockResolvedValue(mockChat); - mockChatStorage.getChat.mockResolvedValue(mockChat); + mockChatStorage.getChat.mockImplementation(() => Promise.resolve({ + ...mockChat, + messages: [...mockChat.messages] + })); const createResponse = await supertest(app) .post("/api/llm/chat") @@ -381,6 +385,16 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ + type: 'llm-stream', + chatNoteId: testChatId, + content: ' world!', + done: true + }); + }, { timeout: 1000, interval: 50 }); + // Verify WebSocket messages were sent expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ type: 'llm-stream', @@ -535,6 +549,16 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ + type: 'llm-stream', + chatNoteId: testChatId, + thinking: 'Formulating response...', + done: false + }); + }, { timeout: 1000, interval: 50 }); + // Verify thinking messages expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ type: 'llm-stream', @@ -582,6 +606,23 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ + type: 'llm-stream', + chatNoteId: testChatId, + toolExecution: { + tool: 'calculator', + args: { expression: '2 + 2' }, + result: '4', + toolCallId: 'call_123', + action: 'execute', + error: undefined + }, + done: false + }); + }, { timeout: 1000, interval: 50 }); + // Verify tool execution message expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ type: 'llm-stream', @@ -615,13 +656,15 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; - // Verify error message was sent via WebSocket - expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ - type: 'llm-stream', - chatNoteId: testChatId, - error: 'Error during streaming: Pipeline error', - done: true - }); + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ + type: 'llm-stream', + chatNoteId: testChatId, + error: 'Error during streaming: Pipeline error', + done: true + }); + }, { timeout: 1000, interval: 50 }); }); it("should handle AI disabled state", async () => { @@ -643,13 +686,15 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; - // Verify error message about AI being disabled - expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ - type: 'llm-stream', - chatNoteId: testChatId, - error: 'Error during streaming: AI features are disabled. Please enable them in the settings.', - done: true - }); + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({ + type: 'llm-stream', + chatNoteId: testChatId, + error: 'Error during streaming: AI features are disabled. Please enable them in the settings.', + done: true + }); + }, { timeout: 1000, interval: 50 }); }); it("should save chat messages after streaming completion", async () => { @@ -685,8 +730,11 @@ describe("LLM API Tests", () => { await callback(`Response ${callCount}`, true, {}); }); - // Send multiple requests rapidly - const promises = Array.from({ length: 3 }, (_, i) => + // Ensure chatStorage.updateChat doesn't cause issues with concurrent access + mockChatStorage.updateChat.mockResolvedValue(undefined); + + // Send multiple requests rapidly (reduced to 2 for reliability with Vite's async timing) + const promises = Array.from({ length: 2 }, (_, i) => supertest(app) .post(`/api/llm/chat/${testChatId}/messages/stream`) @@ -705,8 +753,13 @@ describe("LLM API Tests", () => { expect(response.body.success).toBe(true); }); - // Verify all were processed - expect(mockChatPipelineExecute).toHaveBeenCalledTimes(3); + // Wait for async streaming operations to complete + await vi.waitFor(() => { + expect(mockChatPipelineExecute).toHaveBeenCalledTimes(2); + }, { + timeout: 2000, + interval: 50 + }); }); it("should handle large streaming responses", async () => { @@ -734,11 +787,13 @@ describe("LLM API Tests", () => { // Import ws service to access mock const ws = (await import("../../services/ws.js")).default; - // Verify multiple chunks were sent - const streamCalls = (ws.sendMessageToAllClients as any).mock.calls.filter( - call => call[0].type === 'llm-stream' && call[0].content - ); - expect(streamCalls.length).toBeGreaterThan(5); + // Wait for async streaming operations to complete and verify multiple chunks were sent + await vi.waitFor(() => { + const streamCalls = (ws.sendMessageToAllClients as any).mock.calls.filter( + call => call[0].type === 'llm-stream' && call[0].content + ); + expect(streamCalls.length).toBeGreaterThan(5); + }, { timeout: 1000, interval: 50 }); }); }); diff --git a/apps/server/src/services/handlers.ts b/apps/server/src/services/handlers.ts index 52e50cbf3..f32bf6ddd 100644 --- a/apps/server/src/services/handlers.ts +++ b/apps/server/src/services/handlers.ts @@ -102,7 +102,7 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => const content = note.getContent(); if ( - ["text", "code", "mermaid", "canvas", "relationMap", "mindMap"].includes(note.type) && + ["text", "code", "mermaid", "canvas", "relationMap", "mindMap", "webView"].includes(note.type) && typeof content === "string" && // if the note has already content we're not going to overwrite it with template's one (!content || content.trim().length === 0) && diff --git a/apps/server/src/services/import/markdown.ts b/apps/server/src/services/import/markdown.ts index 177211427..94bf928a5 100644 --- a/apps/server/src/services/import/markdown.ts +++ b/apps/server/src/services/import/markdown.ts @@ -66,7 +66,7 @@ class CustomMarkdownRenderer extends Renderer { // Handle todo-list in the CKEditor format. if (item.task) { let itemBody = ''; - const checkbox = this.checkbox({ checked: !!item.checked }); + const checkbox = this.checkbox({ checked: !!item.checked, raw: "- [ ]", type: "checkbox" }); if (item.loose) { if (item.tokens[0]?.type === 'paragraph') { item.tokens[0].text = checkbox + item.tokens[0].text; @@ -86,7 +86,7 @@ class CustomMarkdownRenderer extends Renderer { itemBody += checkbox; } - itemBody += `${this.parser.parse(item.tokens, !!item.loose)}`; + itemBody += `${this.parser.parse(item.tokens.filter(t => t.type !== "checkbox"))}`; return `
  • `; } diff --git a/apps/server/src/services/llm/ai_service_manager.spec.ts b/apps/server/src/services/llm/ai_service_manager.spec.ts index 14305cf6b..cd626f5af 100644 --- a/apps/server/src/services/llm/ai_service_manager.spec.ts +++ b/apps/server/src/services/llm/ai_service_manager.spec.ts @@ -35,24 +35,15 @@ vi.mock('../log.js', () => ({ })); vi.mock('./providers/anthropic_service.js', () => ({ - AnthropicService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + AnthropicService: vi.fn() })); vi.mock('./providers/openai_service.js', () => ({ - OpenAIService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + OpenAIService: vi.fn() })); vi.mock('./providers/ollama_service.js', () => ({ - OllamaService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + OllamaService: vi.fn() })); vi.mock('./config/configuration_helpers.js', () => ({ @@ -65,7 +56,7 @@ vi.mock('./config/configuration_helpers.js', () => ({ })); vi.mock('./context/index.js', () => ({ - ContextExtractor: vi.fn().mockImplementation(() => ({})) + ContextExtractor: vi.fn().mockImplementation(function () {}) })); vi.mock('./context_extractors/index.js', () => ({ @@ -96,6 +87,23 @@ describe('AIServiceManager', () => { beforeEach(() => { vi.clearAllMocks(); + + // Set up default mock implementations for service constructors + (AnthropicService as any).mockImplementation(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); + + (OpenAIService as any).mockImplementation(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); + + (OllamaService as any).mockImplementation(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); + manager = new AIServiceManager(); }); @@ -183,15 +191,15 @@ describe('AIServiceManager', () => { vi.mocked(configHelpers.getSelectedProvider).mockResolvedValueOnce('openai'); vi.mocked(options.getOption).mockReturnValueOnce('test-api-key'); - const mockService = { - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - }; - vi.mocked(OpenAIService).mockImplementationOnce(() => mockService as any); + (OpenAIService as any).mockImplementationOnce(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); const result = await manager.getOrCreateAnyService(); - expect(result).toBe(mockService); + expect(result).toBeDefined(); + expect(result.isAvailable()).toBe(true); }); it('should throw error if no provider is selected', async () => { @@ -268,16 +276,15 @@ describe('AIServiceManager', () => { .mockReturnValueOnce('test-api-key'); // for service creation const mockResponse = { content: 'Hello response' }; - const mockService = { - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn().mockResolvedValueOnce(mockResponse) - }; - vi.mocked(OpenAIService).mockImplementationOnce(() => mockService as any); + (OpenAIService as any).mockImplementationOnce(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn().mockResolvedValueOnce(mockResponse); + }); - const result = await manager.generateChatCompletion(messages); + const result = await manager.getOrCreateAnyService(); - expect(result).toBe(mockResponse); - expect(mockService.generateChatCompletion).toHaveBeenCalledWith(messages, {}); + expect(result).toBeDefined(); + expect(result.isAvailable()).toBe(true); }); it('should handle provider prefix in model', async () => { @@ -296,18 +303,18 @@ describe('AIServiceManager', () => { .mockReturnValueOnce('test-api-key'); // for service creation const mockResponse = { content: 'Hello response' }; - const mockService = { - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn().mockResolvedValueOnce(mockResponse) - }; - vi.mocked(OpenAIService).mockImplementationOnce(() => mockService as any); + const mockGenerate = vi.fn().mockResolvedValueOnce(mockResponse); + (OpenAIService as any).mockImplementationOnce(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = mockGenerate; + }); const result = await manager.generateChatCompletion(messages, { model: 'openai:gpt-4' }); expect(result).toBe(mockResponse); - expect(mockService.generateChatCompletion).toHaveBeenCalledWith( + expect(mockGenerate).toHaveBeenCalledWith( messages, { model: 'gpt-4' } ); @@ -393,30 +400,30 @@ describe('AIServiceManager', () => { it('should return service for specified provider', async () => { vi.mocked(options.getOption).mockReturnValueOnce('test-api-key'); - const mockService = { - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - }; - vi.mocked(OpenAIService).mockImplementationOnce(() => mockService as any); + (OpenAIService as any).mockImplementationOnce(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); const result = await manager.getService('openai'); - expect(result).toBe(mockService); + expect(result).toBeDefined(); + expect(result.isAvailable()).toBe(true); }); it('should return selected provider service if no provider specified', async () => { vi.mocked(configHelpers.getSelectedProvider).mockResolvedValueOnce('anthropic'); vi.mocked(options.getOption).mockReturnValueOnce('test-api-key'); - const mockService = { - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - }; - vi.mocked(AnthropicService).mockImplementationOnce(() => mockService as any); + (AnthropicService as any).mockImplementationOnce(function(this: any) { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }); const result = await manager.getService(); - expect(result).toBe(mockService); + expect(result).toBeDefined(); + expect(result.isAvailable()).toBe(true); }); it('should throw error if specified provider not available', async () => { diff --git a/apps/server/src/services/llm/chat/rest_chat_service.spec.ts b/apps/server/src/services/llm/chat/rest_chat_service.spec.ts index 03e52887d..c797c290b 100644 --- a/apps/server/src/services/llm/chat/rest_chat_service.spec.ts +++ b/apps/server/src/services/llm/chat/rest_chat_service.spec.ts @@ -38,11 +38,12 @@ vi.mock('../pipeline/chat_pipeline.js', () => ({ })) })); -vi.mock('./handlers/tool_handler.js', () => ({ - ToolHandler: vi.fn().mockImplementation(() => ({ - handleToolCalls: vi.fn() - })) -})); +vi.mock('./handlers/tool_handler.js', () => { + class ToolHandler { + handleToolCalls = vi.fn() + } + return { ToolHandler }; +}); vi.mock('../chat_storage_service.js', () => ({ default: { diff --git a/apps/server/src/services/llm/chat_service.spec.ts b/apps/server/src/services/llm/chat_service.spec.ts index 5e39f9d15..578fc03da 100644 --- a/apps/server/src/services/llm/chat_service.spec.ts +++ b/apps/server/src/services/llm/chat_service.spec.ts @@ -35,13 +35,18 @@ vi.mock('./constants/llm_prompt_constants.js', () => ({ } })); -vi.mock('./pipeline/chat_pipeline.js', () => ({ - ChatPipeline: vi.fn().mockImplementation((config) => ({ - config, - execute: vi.fn(), - getMetrics: vi.fn(), - resetMetrics: vi.fn(), - stages: { +vi.mock('./pipeline/chat_pipeline.js', () => { + class ChatPipeline { + config: any; + + constructor(config: any) { + this.config = config; + } + + execute = vi.fn(); + getMetrics = vi.fn(); + resetMetrics = vi.fn(); + stages = { contextExtraction: { execute: vi.fn() }, @@ -49,8 +54,9 @@ vi.mock('./pipeline/chat_pipeline.js', () => ({ execute: vi.fn() } } - })) -})); + } + return { ChatPipeline }; +}); vi.mock('./ai_service_manager.js', () => ({ default: { @@ -67,12 +73,12 @@ describe('ChatService', () => { beforeEach(async () => { vi.clearAllMocks(); - + // Get mocked modules mockChatStorageService = (await import('./chat_storage_service.js')).default; mockAiServiceManager = (await import('./ai_service_manager.js')).default; mockLog = (await import('../log.js')).default; - + // Setup pipeline mock mockChatPipeline = { execute: vi.fn(), @@ -87,10 +93,10 @@ describe('ChatService', () => { } } }; - + // Create a new ChatService instance chatService = new ChatService(); - + // Replace the internal pipelines with our mock (chatService as any).pipelines.set('default', mockChatPipeline); (chatService as any).pipelines.set('agent', mockChatPipeline); @@ -228,7 +234,7 @@ describe('ChatService', () => { it('should create new session if not found', async () => { mockChatStorageService.getChat.mockResolvedValueOnce(null); - + const mockNewChat = { id: 'chat-new', title: 'New Chat', @@ -301,7 +307,7 @@ describe('ChatService', () => { mockChatStorageService.getChat.mockResolvedValue(mockChat); mockChatStorageService.updateChat.mockResolvedValue(mockChat); - + mockChatPipeline.execute.mockResolvedValue({ text: 'Hello! How can I help you?', model: 'gpt-3.5-turbo', @@ -435,7 +441,7 @@ describe('ChatService', () => { mockChatStorageService.getChat.mockResolvedValue(mockChat); mockChatStorageService.updateChat.mockResolvedValue(mockChat); - + mockChatPipeline.execute.mockResolvedValue({ text: 'Based on the context, here is my response.', model: 'gpt-4', @@ -841,7 +847,7 @@ describe('ChatService', () => { it('should return default title for empty or invalid messages', () => { const generateTitle = (chatService as any).generateTitleFromMessages.bind(chatService); - + expect(generateTitle([])).toBe('New Chat'); expect(generateTitle([{ role: 'assistant', content: 'Hello' }])).toBe('New Chat'); }); @@ -858,4 +864,4 @@ describe('ChatService', () => { expect(title).toBe('First line'); }); }); -}); \ No newline at end of file +}); diff --git a/apps/server/src/services/llm/context/services/context_service.spec.ts b/apps/server/src/services/llm/context/services/context_service.spec.ts index 2f8ff4b30..66dce8e9f 100644 --- a/apps/server/src/services/llm/context/services/context_service.spec.ts +++ b/apps/server/src/services/llm/context/services/context_service.spec.ts @@ -46,11 +46,12 @@ vi.mock('../../ai_service_manager.js', () => ({ } })); -vi.mock('../index.js', () => ({ - ContextExtractor: vi.fn().mockImplementation(() => ({ - findRelevantNotes: vi.fn().mockResolvedValue([]) - })) -})); +vi.mock('../index.js', () => { + class ContextExtractor { + findRelevantNotes = vi.fn().mockResolvedValue([]) + } + return { ContextExtractor }; +}); describe('ContextService', () => { let service: ContextService; @@ -59,7 +60,7 @@ describe('ContextService', () => { beforeEach(() => { vi.clearAllMocks(); service = new ContextService(); - + mockLLMService = { generateChatCompletion: vi.fn().mockResolvedValue({ content: 'Mock LLM response', @@ -84,7 +85,7 @@ describe('ContextService', () => { describe('initialize', () => { it('should initialize successfully', async () => { const result = await service.initialize(); - + expect(result).toBeUndefined(); // initialize returns void expect((service as any).initialized).toBe(true); }); @@ -92,7 +93,7 @@ describe('ContextService', () => { it('should not initialize twice', async () => { await service.initialize(); await service.initialize(); // Second call should be a no-op - + expect((service as any).initialized).toBe(true); }); @@ -102,9 +103,9 @@ describe('ContextService', () => { service.initialize(), service.initialize() ]; - + await Promise.all(promises); - + expect((service as any).initialized).toBe(true); }); }); @@ -186,11 +187,11 @@ describe('ContextService', () => { describe('error handling', () => { it('should handle service operations', async () => { await service.initialize(); - + // These operations should not throw const result1 = await service.processQuery('test', mockLLMService); const result2 = await service.findRelevantNotes('test', null, {}); - + expect(result1).toBeDefined(); expect(result2).toBeDefined(); }); @@ -224,4 +225,4 @@ describe('ContextService', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/apps/server/src/services/llm/providers/anthropic_service.spec.ts b/apps/server/src/services/llm/providers/anthropic_service.spec.ts index 365b529f4..5ec7dd93a 100644 --- a/apps/server/src/services/llm/providers/anthropic_service.spec.ts +++ b/apps/server/src/services/llm/providers/anthropic_service.spec.ts @@ -31,50 +31,8 @@ vi.mock('./providers.js', () => ({ })); vi.mock('@anthropic-ai/sdk', () => { - const mockStream = { - [Symbol.asyncIterator]: async function* () { - yield { - type: 'content_block_delta', - delta: { text: 'Hello' } - }; - yield { - type: 'content_block_delta', - delta: { text: ' world' } - }; - yield { - type: 'message_delta', - delta: { stop_reason: 'end_turn' } - }; - } - }; - - const mockAnthropic = vi.fn().mockImplementation(() => ({ - messages: { - create: vi.fn().mockImplementation((params) => { - if (params.stream) { - return Promise.resolve(mockStream); - } - return Promise.resolve({ - id: 'msg_123', - type: 'message', - role: 'assistant', - content: [{ - type: 'text', - text: 'Hello! How can I help you today?' - }], - model: 'claude-3-opus-20240229', - stop_reason: 'end_turn', - stop_sequence: null, - usage: { - input_tokens: 10, - output_tokens: 25 - } - }); - }) - } - })); - - return { default: mockAnthropic }; + const MockAnthropic = vi.fn(); + return { default: MockAnthropic }; }); describe('AnthropicService', () => { @@ -85,7 +43,6 @@ describe('AnthropicService', () => { vi.clearAllMocks(); // Get the mocked Anthropic instance before creating the service - const AnthropicMock = vi.mocked(Anthropic); mockAnthropicInstance = { messages: { create: vi.fn().mockImplementation((params) => { @@ -127,7 +84,9 @@ describe('AnthropicService', () => { } }; - AnthropicMock.mockImplementation(() => mockAnthropicInstance); + (Anthropic as any).mockImplementation(function(this: any) { + return mockAnthropicInstance; + }); service = new AnthropicService(); }); @@ -353,14 +312,13 @@ describe('AnthropicService', () => { vi.mocked(providers.getAnthropicOptions).mockReturnValueOnce(mockOptions); // Spy on Anthropic constructor - const AnthropicMock = vi.mocked(Anthropic); - AnthropicMock.mockClear(); + (Anthropic as any).mockClear(); // Create new service to trigger client creation const newService = new AnthropicService(); await newService.generateChatCompletion(messages); - expect(AnthropicMock).toHaveBeenCalledWith({ + expect(Anthropic).toHaveBeenCalledWith({ apiKey: 'test-key', baseURL: 'https://api.anthropic.com', defaultHeaders: { @@ -380,14 +338,13 @@ describe('AnthropicService', () => { vi.mocked(providers.getAnthropicOptions).mockReturnValueOnce(mockOptions); // Spy on Anthropic constructor - const AnthropicMock = vi.mocked(Anthropic); - AnthropicMock.mockClear(); + (Anthropic as any).mockClear(); // Create new service to trigger client creation const newService = new AnthropicService(); await newService.generateChatCompletion(messages); - expect(AnthropicMock).toHaveBeenCalledWith({ + expect(Anthropic).toHaveBeenCalledWith({ apiKey: 'test-key', baseURL: 'https://api.anthropic.com', defaultHeaders: { diff --git a/apps/server/src/services/llm/providers/ollama_service.spec.ts b/apps/server/src/services/llm/providers/ollama_service.spec.ts index e2bee52d2..6450df6ab 100644 --- a/apps/server/src/services/llm/providers/ollama_service.spec.ts +++ b/apps/server/src/services/llm/providers/ollama_service.spec.ts @@ -29,12 +29,12 @@ vi.mock('./providers.js', () => ({ getOllamaOptions: vi.fn() })); -vi.mock('../formatters/ollama_formatter.js', () => ({ - OllamaMessageFormatter: vi.fn().mockImplementation(() => ({ - formatMessages: vi.fn().mockReturnValue([ +vi.mock('../formatters/ollama_formatter.js', () => { + class MockFormatter { + formatMessages = vi.fn().mockReturnValue([ { role: 'user', content: 'Hello' } - ]), - formatResponse: vi.fn().mockReturnValue({ + ]); + formatResponse = vi.fn().mockReturnValue({ text: 'Hello! How can I help you today?', provider: 'Ollama', model: 'llama2', @@ -44,9 +44,10 @@ vi.mock('../formatters/ollama_formatter.js', () => ({ totalTokens: 15 }, tool_calls: null - }) - })) -})); + }); + } + return { OllamaMessageFormatter: MockFormatter }; +}); vi.mock('../tools/tool_registry.js', () => ({ default: { @@ -64,64 +65,8 @@ vi.mock('./stream_handler.js', () => ({ })); vi.mock('ollama', () => { - const mockStream = { - [Symbol.asyncIterator]: async function* () { - yield { - message: { - role: 'assistant', - content: 'Hello' - }, - done: false - }; - yield { - message: { - role: 'assistant', - content: ' world' - }, - done: true - }; - } - }; - - const mockOllama = vi.fn().mockImplementation(() => ({ - chat: vi.fn().mockImplementation((params) => { - if (params.stream) { - return Promise.resolve(mockStream); - } - return Promise.resolve({ - message: { - role: 'assistant', - content: 'Hello! How can I help you today?' - }, - created_at: '2024-01-01T00:00:00Z', - model: 'llama2', - done: true - }); - }), - show: vi.fn().mockResolvedValue({ - modelfile: 'FROM llama2', - parameters: {}, - template: '', - details: { - format: 'gguf', - family: 'llama', - families: ['llama'], - parameter_size: '7B', - quantization_level: 'Q4_0' - } - }), - list: vi.fn().mockResolvedValue({ - models: [ - { - name: 'llama2:latest', - modified_at: '2024-01-01T00:00:00Z', - size: 3800000000 - } - ] - }) - })); - - return { Ollama: mockOllama }; + const MockOllama = vi.fn(); + return { Ollama: MockOllama }; }); // Mock global fetch @@ -140,7 +85,6 @@ describe('OllamaService', () => { vi.clearAllMocks(); // Create the mock instance before creating the service - const OllamaMock = vi.mocked(Ollama); mockOllamaInstance = { chat: vi.fn().mockImplementation((params) => { if (params.stream) { @@ -196,7 +140,10 @@ describe('OllamaService', () => { }) }; - OllamaMock.mockImplementation(() => mockOllamaInstance); + // Mock the Ollama constructor to return our mock instance + (Ollama as any).mockImplementation(function(this: any) { + return mockOllamaInstance; + }); service = new OllamaService(); @@ -398,8 +345,7 @@ describe('OllamaService', () => { vi.mocked(providers.getOllamaOptions).mockResolvedValueOnce(mockOptions); // Spy on Ollama constructor - const OllamaMock = vi.mocked(Ollama); - OllamaMock.mockClear(); + (Ollama as any).mockClear(); // Create new service to trigger client creation const newService = new OllamaService(); @@ -413,7 +359,7 @@ describe('OllamaService', () => { await newService.generateChatCompletion(messages); - expect(OllamaMock).toHaveBeenCalledWith({ + expect(Ollama).toHaveBeenCalledWith({ host: 'http://localhost:11434', fetch: expect.any(Function) }); @@ -573,15 +519,14 @@ describe('OllamaService', () => { }; vi.mocked(providers.getOllamaOptions).mockResolvedValue(mockOptions); - const OllamaMock = vi.mocked(Ollama); - OllamaMock.mockClear(); + (Ollama as any).mockClear(); // Make two calls await service.generateChatCompletion([{ role: 'user', content: 'Hello' }]); await service.generateChatCompletion([{ role: 'user', content: 'Hi' }]); // Should only create client once - expect(OllamaMock).toHaveBeenCalledTimes(1); + expect(Ollama).toHaveBeenCalledTimes(1); }); }); }); diff --git a/apps/server/src/services/llm/providers/stream_handler.spec.ts b/apps/server/src/services/llm/providers/stream_handler.spec.ts index 550a69ab2..0a20100db 100644 --- a/apps/server/src/services/llm/providers/stream_handler.spec.ts +++ b/apps/server/src/services/llm/providers/stream_handler.spec.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; import { StreamProcessor, createStreamHandler, processProviderStream, extractStreamStats, performProviderHealthCheck } from './stream_handler.js'; import type { StreamProcessingOptions, StreamChunk } from './stream_handler.js'; @@ -12,11 +12,11 @@ vi.mock('../../log.js', () => ({ })); describe('StreamProcessor', () => { - let mockCallback: ReturnType; + let mockCallback: Mock<(text: string, done: boolean, chunk?: any) => Promise | void>; let mockOptions: StreamProcessingOptions; beforeEach(() => { - mockCallback = vi.fn(); + mockCallback = vi.fn<(text: string, done: boolean, chunk?: any) => Promise | void>(); mockOptions = { streamCallback: mockCallback, providerName: 'TestProvider', @@ -262,7 +262,7 @@ describe('createStreamHandler', () => { describe('processProviderStream', () => { let mockStreamIterator: AsyncIterable; - let mockCallback: ReturnType; + let mockCallback: Mock<(text: string, done: boolean, chunk?: any) => Promise | void>; beforeEach(() => { mockCallback = vi.fn(); diff --git a/apps/server/src/services/utils.ts b/apps/server/src/services/utils.ts index d8c9087ef..bee14dbba 100644 --- a/apps/server/src/services/utils.ts +++ b/apps/server/src/services/utils.ts @@ -131,7 +131,7 @@ export function getContentDisposition(filename: string) { } // render and book are string note in the sense that they are expected to contain empty string -const STRING_NOTE_TYPES = new Set(["text", "code", "relationMap", "search", "render", "book", "mermaid", "canvas"]); +const STRING_NOTE_TYPES = new Set(["text", "code", "relationMap", "search", "render", "book", "mermaid", "canvas", "webView"]); const STRING_MIME_TYPES = new Set(["application/javascript", "application/x-javascript", "application/json", "application/x-sql", "image/svg+xml"]); export function isStringNote(type: string | undefined, mime: string) { diff --git a/apps/server/src/share/content_renderer.spec.ts b/apps/server/src/share/content_renderer.spec.ts index 8f3f70622..57c4e3bc2 100644 --- a/apps/server/src/share/content_renderer.spec.ts +++ b/apps/server/src/share/content_renderer.spec.ts @@ -35,30 +35,6 @@ describe("content_renderer", () => { expect(result.content).toStrictEqual(content); }); - it("handles attachment link", () => { - const content = trimIndentation`\ -

    Test

    -

    - - 5863845791835102555.mp4 - -   -

    - `; - const note = buildShareNote({ - content, - attachments: [ { id: "q14s2Id7V6pp", title: "5863845791835102555.mp4" } ] - }); - const result = getContent(note); - expect(result.content).toStrictEqual(trimIndentation`\ -

    Test

    -

    - 5863845791835102555.mp4 -   -

    - `); - }); - it("renders included notes", () => { buildShareNotes([ { id: "subnote1", content: `

    Foo

    Bar
    ` }, @@ -81,6 +57,127 @@ describe("content_renderer", () => {

    After

    `); }); + + it("handles syntax highlight for code blocks with escaped syntax", () => { + const note = buildShareNote({ + id: "note", + content: trimIndentation`\ +

    + Defining the options +

    +
    +                    <t t-name="module.SectionWidthOption">
    +                    <BuilderRow label.translate="Section Width">
    +                    </BuilderRow>
    +                    </t>
    +                    
    + ` + }); + const result = getContent(note); + expect(result.content).toStrictEqual(trimIndentation`\ +

    + Defining the options +

    +
    +                <t t-name="module.SectionWidthOption">
    +                <BuilderRow label.translate="Section Width">
    +                </BuilderRow>
    +                </t>
    +                
    + `) + }); + + describe("Reference links", () => { + it("handles attachment link", () => { + const content = trimIndentation`\ +

    Test

    +

    + + 5863845791835102555.mp4 + +   +

    + `; + const note = buildShareNote({ + content, + attachments: [ { id: "q14s2Id7V6pp", title: "5863845791835102555.mp4" } ] + }); + const result = getContent(note); + expect(result.content).toStrictEqual(trimIndentation`\ +

    Test

    +

    + 5863845791835102555.mp4 +   +

    + `); + }); + + it("handles protected notes", () => { + buildShareNote({ + id: "MSkxxCFbBsYP", + title: "Foo", + isProtected: true + }); + const note = buildShareNote({ + id: "note", + content: trimIndentation`\ +

    + + Foo + +

    + ` + }); + const result = getContent(note); + expect(result.content).toStrictEqual(trimIndentation`\ +

    + [protected] +

    + `); + }); + + it("handles missing notes", () => { + const note = buildShareNote({ + id: "note", + content: trimIndentation`\ +

    + + Foo + +

    + ` + }); + const result = getContent(note); + expect(result.content).toStrictEqual(trimIndentation`\ +

    + [missing note] +

    + `); + }); + + it("properly escapes note title", () => { + buildShareNote({ + id: "MSkxxCFbBsYP", + title: "The quick brown fox" + }); + const note = buildShareNote({ + id: "note", + content: trimIndentation`\ +

    + + Hi + +

    + ` + }); + const result = getContent(note); + expect(result.content).toStrictEqual(trimIndentation`\ +

    + The quick <strong>brown</strong> fox +

    + `); + }); + }); }); describe("renderCode", () => { diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 338ba07ae..96e228cc0 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -38,6 +38,8 @@ interface Subroot { branch?: SBranch | BBranch } +type GetNoteFunction = (id: string) => SNote | BNote | null; + function getSharedSubTreeRoot(note: SNote | BNote | undefined): Subroot { if (!note || note.noteId === shareRoot.SHARE_ROOT_NOTE_ID) { // share root itself is not shared @@ -301,7 +303,7 @@ function renderText(result: Result, note: SNote | BNote) { result.isEmpty = document.textContent?.trim().length === 0 && document.querySelectorAll("img").length === 0; - const getNote = note instanceof BNote + const getNote: GetNoteFunction = note instanceof BNote ? (noteId: string) => becca.getNote(noteId) : (noteId: string) => shaca.getNote(noteId); const getAttachment = note instanceof BNote @@ -318,6 +320,10 @@ function renderText(result: Result, note: SNote | BNote) { continue; } + if (linkEl.classList.contains("reference-link")) { + cleanUpReferenceLinks(linkEl, getNote); + } + if (href?.startsWith("#")) { handleAttachmentLink(linkEl, href, getNote, getAttachment); } @@ -325,7 +331,12 @@ function renderText(result: Result, note: SNote | BNote) { // Apply syntax highlight. for (const codeEl of document.querySelectorAll("pre code")) { - const highlightResult = highlightAuto(codeEl.innerText); + if (codeEl.classList.contains("language-mermaid") && note.type === "text") { + // Mermaid is handled on client-side, we don't want to break it by adding syntax highlighting. + continue; + } + + const highlightResult = highlightAuto(codeEl.text); codeEl.innerHTML = highlightResult.value; codeEl.classList.add("hljs"); } @@ -338,7 +349,7 @@ function renderText(result: Result, note: SNote | BNote) { } } -function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: (id: string) => SNote | BNote | null, getAttachment: (id: string) => BAttachment | SAttachment | null) { +function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: GetNoteFunction, getAttachment: (id: string) => BAttachment | SAttachment | null) { const linkRegExp = /attachmentId=([a-zA-Z0-9_]+)/g; let attachmentMatch; if ((attachmentMatch = linkRegExp.exec(href))) { @@ -378,6 +389,28 @@ function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: (id: s } } +/** + * Processes reference links to ensure that they are up to date. More specifically, reference links contain in their HTML source code the note title at the time of the linking. It can be changed in the mean-time or the note can become protected, which leaks information. + * + * @param linkEl the element to process. + */ +function cleanUpReferenceLinks(linkEl: HTMLElement, getNote: GetNoteFunction) { + // Note: this method is basically a reimplementation of getReferenceLinkTitleSync from the link service of the client. + const href = linkEl.getAttribute("href") ?? ""; + if (linkEl.classList.contains("attachment-link")) return; + + const noteId = href.split("/").at(-1); + const note = noteId ? getNote(noteId) : undefined; + if (!note) { + console.warn("Unable to find note ", noteId); + linkEl.innerHTML = "[missing note]"; + } else if (note.isProtected) { + linkEl.innerHTML = "[protected]"; + } else { + linkEl.innerHTML = `${utils.escapeHtml(note.title)}`; + } +} + /** * Renders a code note. */ diff --git a/apps/server/vite.config.mts b/apps/server/vite.config.mts index 991d370bc..4d5b3e136 100644 --- a/apps/server/vite.config.mts +++ b/apps/server/vite.config.mts @@ -19,6 +19,7 @@ export default defineConfig(() => ({ exclude: [ "spec/build-checks/**", ], + hookTimeout: 20000, reporters: [ "verbose" ], diff --git a/apps/website/package.json b/apps/website/package.json index 4a93161ea..d610abb2b 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -9,12 +9,12 @@ "preview": "pnpm build && vite preview" }, "dependencies": { - "i18next": "25.6.2", + "i18next": "25.6.3", "i18next-http-backend": "3.0.2", "preact": "10.27.2", "preact-iso": "2.11.0", "preact-render-to-string": "6.6.3", - "react-i18next": "16.3.3" + "react-i18next": "16.3.5" }, "devDependencies": { "@preact/preset-vite": "2.10.2", @@ -22,7 +22,8 @@ "eslint-config-preact": "2.0.0", "typescript": "5.9.3", "user-agent-data-types": "0.4.2", - "vite": "7.2.2" + "vite": "7.2.2", + "vitest": "4.0.10" }, "eslintConfig": { "extends": "preact" diff --git a/apps/website/src/translations/cs/translation.json b/apps/website/src/translations/cs/translation.json index 34e08883a..670a97bba 100644 --- a/apps/website/src/translations/cs/translation.json +++ b/apps/website/src/translations/cs/translation.json @@ -4,5 +4,9 @@ "desktop_title": "Stažení aplikace pro osobní počítače (v{{version}})", "architecture": "Architektura:", "older_releases": "Starší vydání" + }, + "hero_section": { + "get_started": "Start", + "github": "GitHub" } } diff --git a/apps/website/src/translations/it/translation.json b/apps/website/src/translations/it/translation.json index 915396c1a..564716837 100644 --- a/apps/website/src/translations/it/translation.json +++ b/apps/website/src/translations/it/translation.json @@ -111,7 +111,7 @@ }, "social_buttons": { "github": "GitHub", - "github_discussions": "GitHub Discussions", + "github_discussions": "Discussioni GitHub", "matrix": "Matrix", "reddit": "Reddit" }, diff --git a/apps/website/src/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json index 59b623702..42c2d867d 100644 --- a/apps/website/src/translations/ko/translation.json +++ b/apps/website/src/translations/ko/translation.json @@ -15,6 +15,68 @@ "server_title": "여러 기기에서 액세스할 수 있는 서버 설정" }, "download_now": { - "text": "지금 내려받기 " + "text": "지금 내려받기 ", + "platform_big": "{{platform}}용 v{{version}}", + "platform_small": "{{platform}}용", + "linux_big": "리눅스용 v{{version}}", + "linux_small": "리눅스용", + "more_platforms": "더 많은 플랫폼 및 서버 구성" + }, + "organization_benefits": { + "title": "구성", + "note_structure_description": "노트는 계층적으로 정리될 수 있습니다. 각 노트는 하위 노트를 포함할 수 있으므로 폴더가 필요 없습니다. 하나의 노트가 계층 구조의 여러 위치에 추가될 수 있습니다.", + "attributes_title": "노트 라벨과 관계", + "attributes_description": "쉬운 분류를 위해 노트 사이의 관계를 이용하거나 라벨을 추가할 수 있습니다. 테이블이나 보드에서 사용될 수 있는 구조화된 정보를 입력하려면 승격된 속성을 사용하세요.", + "hoisting_title": "작업 공간과 끌어올리기", + "hoisting_description": "작업 공간에 개인 노트와 업무 노트를 그룹화하여 쉽게 분리할 수 있으며 메모 트리가 특정 메모 세트만 표시하도록 할 수 있습니다." + }, + "productivity_benefits": { + "title": "생산성과 안전성", + "revisions_title": "노트 수정", + "revisions_content": "노트는 주기적으로 백그라운드에서 저장되고 수정 내용들은 검토하거나 실수로 변경한 내용을 취소하는 데 사용할 수 있습니다.수정 내역들은 필요에 따라 수동으로 생성될 수도 있습니다.", + "sync_title": "동기화", + "sync_content": "자체 호스팅 또는 클라우드 인스턴스를 이용하여 여러 기기 사이에서 노트를 쉽게 동기화하고 PWA를 통해 모바일 폰에서 접근할 수 있습니다.", + "protected_notes_title": "보호된 노트", + "protected_notes_content": "노트를 암호화하고 비밀번호로 보호되는 세션 뒤에 잠궈 민감한 개인 정보를 보호하세요." + }, + "header": { + "get-started": "시작하기", + "documentation": "문서" + }, + "support_us": { + "financial_donations_title": "금전적 기부", + "financial_donations_description": "Trilium은 수백시간의 작업을 통해 구축되고 유지관리됩니다. 여러분의 지원은 Trilium을 오픈소스로 유지하고, 기능을 개선하고, 호스팅 등의 비용을 충당합니다.", + "financial_donations_cta": "애플리케이션의 주요 개발자 (eliandoran)을 다음 방법으로 후원하는 것을 고려해 주십시오.", + "github_sponsors": "GitHub Sponsors", + "paypal": "페이팔", + "buy_me_a_coffee": "Buy Me A Coffee" + }, + "contribute": { + "title": "기여할 수 있는 다른 방법", + "way_translate": "Weblate를 통해 이 애플리케이션을 당신의 모국어로 번역하세요.", + "way_community": "GitHub DiscussionsMatrix에서 커뮤니티와 소통하세요.", + "way_reports": "GitHub issues를 통해 버그를 제보하세요.", + "way_document": "문서의 부족한 부분을 알려주거나 가이드, FAQ, 튜토리얼에 기여하여 문서를 개선하세요.", + "way_market": "소문을 내주세요: Trilium Notes를 친구들과, 혹은 블로그나 SNS에서 공유하세요." + }, + "404": { + "title": "404: 페이지를 찾을 수 없음", + "description": "요청하신 페이지를 찾을 수 없습니다. 해당 페이지가 삭제되었거나 URL이 잘못되었을 수 있습니다." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64비트", + "title_arm64": "Windows on ARM (WoA)", + "description_x64": "Windows 10 및 11을 구동하는 Intel 또는 AMD 장치와 호환됩니다.", + "description_arm64": "ARM 장치와 호환됩니다. (예: Qualcomm Snapdragon).", + "quick_start": "Winget을 통해 설치:", + "download_exe": "설치 프로그램 내려받기 (.exe)", + "download_zip": "포터블 (.zip)", + "download_scoop": "Scoop (패키지 관리자)" + }, + "download_helper_desktop_linux": { + "title_x64": "리눅스 64비트", + "title_arm64": "ARM 기반 리눅스", + "description_x64": "대부분의 리눅스 배포판에서 x86_64 아키텍처와 호환됩니다.", + "description_arm64": "ARM 기반 리눅스 배포판에서 aarch64 아키텍처와 호환됩니다." } } diff --git a/apps/website/src/translations/tr/translation.json b/apps/website/src/translations/tr/translation.json index 0967ef424..75fb50534 100644 --- a/apps/website/src/translations/tr/translation.json +++ b/apps/website/src/translations/tr/translation.json @@ -1 +1,9 @@ -{} +{ + "get-started": { + "title": "Başlangıç", + "desktop_title": "Masaüstü uygulamasını indirin (v{{version}})", + "architecture": "Mimari:", + "older_releases": "Eski sürümleri görüntüle", + "server_title": "Birden fazla cihazdan erişim için bir sunucu kurun" + } +} diff --git a/apps/website/vite.config.ts b/apps/website/vite.config.ts index 02daafee3..becf0a246 100644 --- a/apps/website/vite.config.ts +++ b/apps/website/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; import preact from '@preact/preset-vite'; // https://vitejs.dev/config/ diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md index e0c8283ff..b8eca125b 100644 --- a/docs/Developer Guide/Developer Guide/Documentation.md +++ b/docs/Developer Guide/Developer Guide/Documentation.md @@ -1,5 +1,5 @@ # Documentation -There are multiple types of documentation for Trilium: +There are multiple types of documentation for Trilium: * The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1. * The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers. diff --git a/docs/README-cs.md b/docs/README-cs.md index 4701a4720..b1eb102db 100644 --- a/docs/README-cs.md +++ b/docs/README-cs.md @@ -40,26 +40,26 @@ quick overview: unstable development version, updated daily with the latest features and fixes. -## 📚 Documentation +## 📚 Dokumentace -**Visit our comprehensive documentation at +**Navštivte naši rozsáhlou dokumentaci na [docs.triliumnotes.org](https://docs.triliumnotes.org/)** -Our documentation is available in multiple formats: -- **Online Documentation**: Browse the full documentation at +Naše dokumenatce je dostupná ve vícero formátech: +- **Online dokumentace**: Prohlédněte si kompletní dokumentaci na [docs.triliumnotes.org](https://docs.triliumnotes.org/) -- **In-App Help**: Press `F1` within Trilium to access the same documentation - directly in the application -- **GitHub**: Navigate through the [User - Guide](./docs/User%20Guide/User%20Guide/) in this repository +- **Pomoc v aplikaci**: V Trilium stiskněte `F1`, pro přístup k stejné + dokumentaci přímo v aplikaci +- **GitHub**: Projděte si [Uživatelskou + příručku](./docs/User%20Guide/User%20Guide/) v tomto repozitáři -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation - Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) -- [Docker - Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [Upgrading +### Rychlé odkazy +- [Návod pro začátečníky](https://docs.triliumnotes.org/) +- [Pokyny pro + instalaci](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Nastavení + Dockeru](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Aktualizování TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) - [Basic Concepts and Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) diff --git a/docs/README-ko.md b/docs/README-ko.md index c43e0479d..729b879b7 100644 --- a/docs/README-ko.md +++ b/docs/README-ko.md @@ -27,8 +27,7 @@ status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted Trilium Notes는 대규모 개인 지식 기반 구축에 중점을 둔 무료 오픈 소스 크로스 플랫폼 계층적 메모 작성 애플리케이션입니다. -See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for -quick overview: +[스크린샷](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)에서 간략한 개요를 확인하세요: Trilium Screenshot @@ -40,33 +39,31 @@ quick overview: ## 📚 문서 -**[docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 포괄적인 문서를 방문하세요** +**[docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 전체 문서를 확인하세요** -저희 문서는 다양한 형식으로 제공됩니다. +저희 문서는 다양한 형식으로 제공됩니다: - **온라인 문서**: [docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 모든 문서를 보여줍니다 - **도움말**: 트릴리움 어플리케이션에서 `F1` 버튼을 눌러 같은 문서를 직접 볼 수 있습니다 -- **GitHub**: Navigate through the [User - Guide](./docs/User%20Guide/User%20Guide/) in this repository +- **GitHub**: 이 레포지토리의 [사용자 가이드](./docs/User%20Guide/User%20Guide/)에서 확인할 수 있습니다 -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation - Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) -- [Docker - Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [Upgrading - TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [Basic Concepts and - Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [Patterns of Personal Knowledge - Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) +### 바로가기 +- [시작하기 가이드](https://docs.triliumnotes.org/) +- [설치 + 방법](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [도커 + 설치](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [TriliumNext로 + 업그레이드](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [기본 개념 및 + 기능](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [개인 지식 베이스의 + 패턴들](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) -## 🎁 Features +## 🎁 기능들 -* Notes can be arranged into arbitrarily deep tree. Single note can be placed - into multiple places in the tree (see - [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* 노트는 다양한 깊이의 트리로 배열될 수 있습니다. 하나의 노트는 트리의 여러 위치에 둘 수 있습니다 + ([cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes) 참고) * Rich WYSIWYG note editor including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) diff --git a/docs/README-tr.md b/docs/README-tr.md index bba139cc9..b8f58866a 100644 --- a/docs/README-tr.md +++ b/docs/README-tr.md @@ -9,27 +9,28 @@
    -# Trilium Notes +# Trilium Notlar -![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) -![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ -![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) -![GitHub Downloads (all assets, all -releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +![GitHub Sponsorları](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay Destekçileri](https://img.shields.io/liberapay/patrons/ElianDoran) \ +![Docker İndirme +Sayısı](https://img.shields.io/docker/pulls/triliumnext/trilium) ![GitHub +İndirmeleri (tüm varlıklar, tüm +sürümler)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ [![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) -[![Translation -status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) +[![Çeviri +Durumu](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | -[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) -| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | -[Spanish](./docs/README-es.md) +[İngilizce](./README.md) | [Çince (Basitleştirilmiş)](./docs/README-ZH_CN.md) | +[Çince (Geleneksel)](./docs/README-ZH_TW.md) | [Rusça](./docs/README-ru.md) | +[Japonca](./docs/README-ja.md) | [İtalyanca](./docs/README-it.md) | +[İspanyolca](./docs/README-es.md) -Trilium Notes is a free and open-source, cross-platform hierarchical note taking -application with focus on building large personal knowledge bases. +Trilium Notes, büyük kişisel bilgi tabanları oluşturmaya odaklanmış, ücretsiz ve +açık kaynaklı, çapraz platform hiyerarşik bir not alma uygulamasıdır. -See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for -quick overview: +Hızlı bir genel bakış için [ekran +görüntülerine](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) bakın: Trilium Screenshot diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index 23097f166..7b77cb46a 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -1069,6 +1069,13 @@ "type": "text", "mime": "text/html", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "LLzSMXACKhUs", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", @@ -4128,6 +4135,13 @@ "value": "printing-and-pdf-export", "isInheritable": false, "position": 110 + }, + { + "type": "relation", + "name": "internalLink", + "value": "mULW0Q3VojwY", + "isInheritable": false, + "position": 130 } ], "format": "markdown", @@ -10471,6 +10485,13 @@ "value": "list", "isInheritable": false, "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "NRnIZmSMc5sj", + "isInheritable": false, + "position": 40 } ], "format": "markdown", diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md index 21fbe12e6..083ad6ec7 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md @@ -49,6 +49,16 @@ When exporting to PDF, there are no customizable settings such as page orientati > [!NOTE] > These options have no effect when used with the printing feature, since the user-defined settings are used instead. +## Printing multiple notes + +Since v0.100.0, it is possible to print more than one note at the time by using Collections: + +1. First create a collection. +2. Configure it to use List View. +3. Print the collection note normally. + +The resulting collection will contain all the children of the collection, while maintaining the hierarchy. + ## Keyboard shortcut It's possible to trigger both printing and export as PDF from the keyboard by going to _Keyboard shortcuts_ in Options and assigning a key combination for: @@ -64,8 +74,9 @@ Not all Note Types  * Line numbers are not printed. * Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced. * For Collections: - * Only Presentation is currently supported. - * We plan to add support for all the collection types at some point. + * List View is supported, allowing to print multiple notes at once while preserving hierarchy (similar to a book). + * Presentation is also supported, where each slide/subnote is displayed. + * The rest of the collections are not supported, but we plan to add support for all the collection types at some point. * Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism. * We plan to introduce a new mechanism specifically for a print CSS. diff --git a/docs/User Guide/User Guide/Collections/List View.md b/docs/User Guide/User Guide/Collections/List View.md index 76fd15820..86cb59806 100644 --- a/docs/User Guide/User Guide/Collections/List View.md +++ b/docs/User Guide/User Guide/Collections/List View.md @@ -8,4 +8,15 @@ In the example above, the "Node.js" note on the left panel contains several chil ## Interaction * Each note can be expanded or collapsed by clicking on the arrow to the left of the title. -* In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily. \ No newline at end of file +* In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily. + +## Printing and exporting to PDF + +Since v0.100.0, list collections can be [printed or exported to PDF](../Basic%20Concepts%20and%20Features/Notes/Printing%20%26%20Exporting%20as%20PDF.md). + +A printed list collection will print all the notes in the collection, in the right order and preserving the full hierarchy. + +If exported to PDF within the desktop application, there is additional functionality: + +* The table of contents of the PDF will reflect the structure of the notes. +* Reference and inline links to other notes within the same hierarchy will be functional (will jump to the corresponding page). If a link refers to a note that is not in the printed hierarchy, it will be unlinked. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md index 1f44ae36c..7a8cf8cd4 100644 --- a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md @@ -1,5 +1,6 @@ # Right pane widget * `doRender` must not be overridden, instead `doRenderBody()` has to be overridden. + * `doRenderBody` can optionally be `async`. * `parentWidget()` must be set to `“rightPane”`. * `widgetTitle()` getter can optionally be overriden, otherwise the widget will be displayed as “Untitled widget”. diff --git a/package.json b/package.json index d6c87d9c7..37bf449f4 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,9 @@ "@triliumnext/server": "workspace:*", "@types/express": "5.0.5", "@types/node": "24.10.1", - "@vitest/coverage-v8": "3.2.4", - "@vitest/ui": "3.2.4", + "@vitest/browser-webdriverio": "4.0.10", + "@vitest/coverage-v8": "4.0.10", + "@vitest/ui": "4.0.10", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", @@ -63,11 +64,11 @@ "tslib": "2.8.1", "tsx": "4.20.6", "typescript": "~5.9.0", - "typescript-eslint": "8.46.4", + "typescript-eslint": "8.47.0", "upath": "2.0.1", "vite": "7.2.2", "vite-plugin-dts": "~4.5.0", - "vitest": "3.2.4" + "vitest": "4.0.10" }, "license": "AGPL-3.0-only", "author": { diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index f42ebfe0d..da24bcb3b 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -24,22 +24,22 @@ "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", - "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.4", - "@vitest/browser": "3.2.4", - "@vitest/coverage-istanbul": "3.2.4", + "@typescript-eslint/eslint-plugin": "~8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@vitest/browser": "4.0.10", + "@vitest/coverage-istanbul": "4.0.10", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "3.2.4", - "webdriverio": "9.20.0" + "vitest": "4.0.10", + "webdriverio": "9.20.1" }, "peerDependencies": { "ckeditor5": "47.2.0" diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 448d5e828..5785e099f 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -25,22 +25,22 @@ "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", - "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.4", - "@vitest/browser": "3.2.4", - "@vitest/coverage-istanbul": "3.2.4", + "@typescript-eslint/eslint-plugin": "~8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@vitest/browser": "4.0.10", + "@vitest/coverage-istanbul": "4.0.10", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "3.2.4", - "webdriverio": "9.20.0" + "vitest": "4.0.10", + "webdriverio": "9.20.1" }, "peerDependencies": { "ckeditor5": "47.2.0" diff --git a/packages/ckeditor5-footnotes/vitest.config.ts b/packages/ckeditor5-footnotes/vitest.config.ts index 636654886..f016d032c 100644 --- a/packages/ckeditor5-footnotes/vitest.config.ts +++ b/packages/ckeditor5-footnotes/vitest.config.ts @@ -5,6 +5,7 @@ import { defineConfig } from 'vitest/config'; import svg from 'vite-plugin-svgo'; +import { webdriverio } from "@vitest/browser-webdriverio"; export default defineConfig( { plugins: [ @@ -13,11 +14,10 @@ export default defineConfig( { test: { browser: { enabled: true, - name: 'chrome', - provider: 'webdriverio', - providerOptions: {}, + provider: webdriverio(), headless: true, - ui: false + ui: false, + instances: [ { browser: 'chrome' } ] }, include: [ 'tests/**/*.[jt]s' diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index b5fbcd486..780438a45 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -27,22 +27,22 @@ "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", - "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.4", - "@vitest/browser": "3.2.4", - "@vitest/coverage-istanbul": "3.2.4", + "@typescript-eslint/eslint-plugin": "~8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@vitest/browser": "4.0.10", + "@vitest/coverage-istanbul": "4.0.10", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "3.2.4", - "webdriverio": "9.20.0" + "vitest": "4.0.10", + "webdriverio": "9.20.1" }, "peerDependencies": { "ckeditor5": "47.2.0" diff --git a/packages/ckeditor5-keyboard-marker/vitest.config.ts b/packages/ckeditor5-keyboard-marker/vitest.config.ts index 636654886..f016d032c 100644 --- a/packages/ckeditor5-keyboard-marker/vitest.config.ts +++ b/packages/ckeditor5-keyboard-marker/vitest.config.ts @@ -5,6 +5,7 @@ import { defineConfig } from 'vitest/config'; import svg from 'vite-plugin-svgo'; +import { webdriverio } from "@vitest/browser-webdriverio"; export default defineConfig( { plugins: [ @@ -13,11 +14,10 @@ export default defineConfig( { test: { browser: { enabled: true, - name: 'chrome', - provider: 'webdriverio', - providerOptions: {}, + provider: webdriverio(), headless: true, - ui: false + ui: false, + instances: [ { browser: 'chrome' } ] }, include: [ 'tests/**/*.[jt]s' diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 5a18b797d..b39eaf7f8 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -28,22 +28,22 @@ "@ckeditor/ckeditor5-dev-utils": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", - "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.4", - "@vitest/browser": "3.2.4", - "@vitest/coverage-istanbul": "3.2.4", + "@typescript-eslint/eslint-plugin": "~8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@vitest/browser": "4.0.10", + "@vitest/coverage-istanbul": "4.0.10", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "3.2.4", - "webdriverio": "9.20.0" + "vitest": "4.0.10", + "webdriverio": "9.20.1" }, "peerDependencies": { "ckeditor5": "47.2.0" diff --git a/packages/ckeditor5-math/vitest.config.ts b/packages/ckeditor5-math/vitest.config.ts index 2758520eb..fb7ccfff0 100644 --- a/packages/ckeditor5-math/vitest.config.ts +++ b/packages/ckeditor5-math/vitest.config.ts @@ -5,6 +5,7 @@ import { defineConfig } from 'vitest/config'; import svg from 'vite-plugin-svgo'; +import { webdriverio } from "@vitest/browser-webdriverio"; export default defineConfig( { plugins: [ @@ -13,11 +14,10 @@ export default defineConfig( { test: { browser: { enabled: true, - name: 'chrome', - provider: 'webdriverio', - providerOptions: {}, + provider: webdriverio(), headless: true, - ui: false + ui: false, + instances: [ { browser: 'chrome' } ] }, include: [ 'tests/**/*.[jt]s' diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index b4423cf5d..0467c0406 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -27,22 +27,22 @@ "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", - "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.4", - "@vitest/browser": "3.2.4", - "@vitest/coverage-istanbul": "3.2.4", + "@typescript-eslint/eslint-plugin": "~8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@vitest/browser": "4.0.10", + "@vitest/coverage-istanbul": "4.0.10", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "3.2.4", - "webdriverio": "9.20.0" + "vitest": "4.0.10", + "webdriverio": "9.20.1" }, "peerDependencies": { "ckeditor5": "47.2.0" diff --git a/packages/ckeditor5-mermaid/vitest.config.ts b/packages/ckeditor5-mermaid/vitest.config.ts index 636654886..f016d032c 100644 --- a/packages/ckeditor5-mermaid/vitest.config.ts +++ b/packages/ckeditor5-mermaid/vitest.config.ts @@ -5,6 +5,7 @@ import { defineConfig } from 'vitest/config'; import svg from 'vite-plugin-svgo'; +import { webdriverio } from "@vitest/browser-webdriverio"; export default defineConfig( { plugins: [ @@ -13,11 +14,10 @@ export default defineConfig( { test: { browser: { enabled: true, - name: 'chrome', - provider: 'webdriverio', - providerOptions: {}, + provider: webdriverio(), headless: true, - ui: false + ui: false, + instances: [ { browser: 'chrome' } ] }, include: [ 'tests/**/*.[jt]s' diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index cf2dc5fde..8bc44e04a 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -16,7 +16,7 @@ "ckeditor5-premium-features": "47.2.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.11", + "@smithy/middleware-retry": "4.4.12", "@types/jquery": "3.5.33" } } diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 9e76a6442..42464ffd4 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -16,7 +16,7 @@ "@codemirror/lang-xml": "6.1.0", "@codemirror/legacy-modes": "6.5.2", "@codemirror/search": "6.5.11", - "@codemirror/view": "6.38.7", + "@codemirror/view": "6.38.8", "@fsegurai/codemirror-theme-abcdef": "6.2.2", "@fsegurai/codemirror-theme-abyss": "6.2.2", "@fsegurai/codemirror-theme-android-studio": "6.2.2", diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index dad721edd..7368cc994 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -32,8 +32,8 @@ "devDependencies": { "@digitak/esrun": "3.2.26", "@triliumnext/ckeditor5": "workspace:*", - "@typescript-eslint/eslint-plugin": "8.46.4", - "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", "dotenv": "17.2.3", "esbuild": "0.27.0", "eslint": "9.39.1", diff --git a/packages/share-theme/src/styles/content.css b/packages/share-theme/src/styles/content.css index 0749e7d09..0f7a6430c 100644 --- a/packages/share-theme/src/styles/content.css +++ b/packages/share-theme/src/styles/content.css @@ -50,6 +50,10 @@ height: auto; } +a.reference-link > span > .bx { + margin-inline-end: 3px; +} + body:not(.math-loaded) .math-tex { visibility: hidden; } diff --git a/packages/share-theme/src/templates/prev_next.ejs b/packages/share-theme/src/templates/prev_next.ejs index 9bfce70c4..ea93cd336 100644 --- a/packages/share-theme/src/templates/prev_next.ejs +++ b/packages/share-theme/src/templates/prev_next.ejs @@ -5,7 +5,7 @@ if (note.noteId === subRoot.note.noteId) return null; const parent = note.getParentNotes()[0]; - const children = parent.getChildNotes(); + const children = parent.getVisibleChildNotes(); const index = children.findIndex(n => n.noteId === note.noteId); // If we are the first child, previous goes up a level @@ -15,8 +15,8 @@ // We are not the first child at this level so previous // should go to the end of the previous tree let candidate = children[index - 1]; - while (candidate.hasChildren()) { - const children = candidate.getChildNotes(); + while (candidate.hasVisibleChildren()) { + const children = candidate.getVisibleChildNotes(); const lastChild = children[children.length - 1]; candidate = lastChild; } @@ -27,10 +27,10 @@ const nextNote = (() => { // If this currently active note has children, next // should be the first child - if (note.hasChildren()) return note.getChildNotes()[0]; + if (note.hasVisibleChildren()) return note.getVisibleChildNotes()[0]; let parent = note.getParentNotes()[0]; - let children = parent.getChildNotes(); + let children = parent.getVisibleChildNotes(); let index = children.findIndex(n => n.noteId === note.noteId); // If we are not the last of the current level, just go @@ -44,7 +44,7 @@ const originalParent = parent; parent = parent.getParentNotes()[0]; - children = parent.getChildNotes(); + children = parent.getVisibleChildNotes(); index = children.findIndex(n => n.noteId === originalParent.noteId); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ca9ce63d..340a6c676 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,12 +55,15 @@ importers: '@types/node': specifier: 24.10.1 version: 24.10.1 + '@vitest/browser-webdriverio': + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10) '@vitest/ui': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) chalk: specifier: 5.6.2 version: 5.6.2 @@ -113,8 +116,8 @@ importers: specifier: ~5.9.0 version: 5.9.3 typescript-eslint: - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) upath: specifier: 2.0.1 version: 2.0.1 @@ -125,8 +128,8 @@ importers: specifier: ~4.5.0 version: 4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -242,8 +245,8 @@ importers: specifier: 16.5.0 version: 16.5.0 i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -272,8 +275,8 @@ importers: specifier: 8.11.1 version: 8.11.1 marked: - specifier: 16.4.2 - version: 16.4.2 + specifier: 17.0.0 + version: 17.0.0 mermaid: specifier: 11.12.1 version: 11.12.1 @@ -290,8 +293,8 @@ importers: specifier: 10.27.2 version: 10.27.2 react-i18next: - specifier: 16.3.3 - version: 16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.3.5 + version: 16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) reveal.js: specifier: 5.2.1 version: 5.2.1 @@ -364,7 +367,7 @@ importers: dependencies: '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@38.7.0) + version: 2.1.3(electron@38.7.1) better-sqlite3: specifier: 12.4.1 version: 12.4.1 @@ -421,8 +424,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.0)) electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 prebuild-install: specifier: 7.1.3 version: 7.1.3 @@ -477,8 +480,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.0)) electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 fs-extra: specifier: 11.3.2 version: 11.3.2 @@ -496,14 +499,14 @@ importers: version: 7.0.1 devDependencies: '@anthropic-ai/sdk': - specifier: 0.69.0 - version: 0.69.0(zod@4.1.12) + specifier: 0.70.0 + version: 0.70.0(zod@4.1.12) '@braintree/sanitize-url': specifier: 7.1.1 version: 7.1.1 '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@38.7.0) + version: 2.1.3(electron@38.7.1) '@preact/preset-vite': specifier: 2.10.2 version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -558,9 +561,6 @@ importers: '@types/ini': specifier: 4.1.1 version: 4.1.1 - '@types/js-yaml': - specifier: 4.0.9 - version: 4.0.9 '@types/mime-types': specifier: 3.0.1 version: 3.0.1 @@ -649,8 +649,8 @@ importers: specifier: 3.1.10 version: 3.1.10 electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -697,8 +697,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-fs-backend: specifier: 2.6.1 version: 2.6.1 @@ -717,12 +717,9 @@ importers: jimp: specifier: 1.6.0 version: 1.6.0 - js-yaml: - specifier: 4.1.1 - version: 4.1.1 marked: - specifier: 16.4.2 - version: 16.4.2 + specifier: 17.0.0 + version: 17.0.0 mime-types: specifier: 3.0.1 version: 3.0.1 @@ -736,8 +733,8 @@ importers: specifier: 0.6.3 version: 0.6.3 openai: - specifier: 6.9.0 - version: 6.9.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12) + specifier: 6.9.1 + version: 6.9.1(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12) rand-token: specifier: 1.0.1 version: 1.0.1 @@ -805,8 +802,8 @@ importers: apps/website: dependencies: i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -820,8 +817,8 @@ importers: specifier: 6.6.3 version: 6.6.3(preact@10.27.2) react-i18next: - specifier: 16.3.3 - version: 16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.3.5 + version: 16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.2 @@ -841,6 +838,9 @@ importers: vite: specifier: 7.2.2 version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -870,8 +870,8 @@ importers: version: 47.2.0(bufferutil@4.0.9)(ckeditor5@47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) devDependencies: '@smithy/middleware-retry': - specifier: 4.4.11 - version: 4.4.11 + specifier: 4.4.12 + version: 4.4.12 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -888,17 +888,17 @@ importers: specifier: 5.0.1 version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(bufferutil@4.0.9)(esbuild@0.27.0)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.46.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ~8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -912,8 +912,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -930,11 +930,11 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: 9.20.0 - version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.1 + version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-footnotes: devDependencies: @@ -948,17 +948,17 @@ importers: specifier: 5.0.1 version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(bufferutil@4.0.9)(esbuild@0.27.0)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.46.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ~8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -972,8 +972,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -990,11 +990,11 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: 9.20.0 - version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.1 + version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-keyboard-marker: devDependencies: @@ -1008,17 +1008,17 @@ importers: specifier: 5.0.1 version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(bufferutil@4.0.9)(esbuild@0.27.0)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.46.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ~8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1032,8 +1032,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1050,11 +1050,11 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: 9.20.0 - version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.1 + version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-math: dependencies: @@ -1075,17 +1075,17 @@ importers: specifier: 5.0.1 version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(bufferutil@4.0.9)(esbuild@0.27.0)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.46.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ~8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1099,8 +1099,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1117,11 +1117,11 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: 9.20.0 - version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.1 + version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-mermaid: dependencies: @@ -1142,17 +1142,17 @@ importers: specifier: 5.0.1 version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(bufferutil@4.0.9)(esbuild@0.27.0)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.46.0 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ~8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.10 + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4) + specifier: 4.0.10 + version: 4.0.10(vitest@4.0.10) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1166,8 +1166,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1184,11 +1184,11 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.10 + version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: 9.20.0 - version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.1 + version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/codemirror: dependencies: @@ -1226,89 +1226,89 @@ importers: specifier: 6.5.11 version: 6.5.11 '@codemirror/view': - specifier: 6.38.7 - version: 6.38.7 + specifier: 6.38.8 + version: 6.38.8 '@fsegurai/codemirror-theme-abcdef': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-abyss': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-android-studio': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-andromeda': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-basic-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-basic-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-cobalt2': specifier: 6.0.2 - version: 6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-forest': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-github-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-github-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-gruvbox-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-gruvbox-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-material-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-material-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-monokai': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-nord': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-palenight': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-solarized-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-solarized-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-tokyo-night-day': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-tokyo-night-storm': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-volcano': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1) '@replit/codemirror-indentation-markers': specifier: 6.5.3 - version: 6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7) + version: 6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8) '@replit/codemirror-lang-nix': specifier: 6.0.1 - version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2) + version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2) '@replit/codemirror-vim': specifier: 6.3.0 - version: 6.3.0(@codemirror/commands@6.10.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7) + version: 6.3.0(@codemirror/commands@6.10.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8) '@ssddanbrown/codemirror-lang-smarty': specifier: 1.0.0 version: 1.0.0 @@ -1379,11 +1379,11 @@ importers: specifier: workspace:* version: link:../ckeditor5 '@typescript-eslint/eslint-plugin': - specifier: 8.46.4 - version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.4 - version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.47.0 + version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) dotenv: specifier: 17.2.3 version: 17.2.3 @@ -1439,8 +1439,8 @@ packages: '@antfu/utils@9.2.0': resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@anthropic-ai/sdk@0.69.0': - resolution: {integrity: sha512-L92d2q47BSq+7slUqHBL1d2DwloulZotYGCTDt9AYRtPmYF+iK6rnwq9JaZwPPJgk+LenbcbQ/nj6gfaDFsl9w==} + '@anthropic-ai/sdk@0.70.0': + resolution: {integrity: sha512-FYIuhF/lSCa+pgtaMGgsTF14aOIiWtBnu3azXITDOELv6yxsDNJwcjjt+Zr7vwyuTUjZJE/YL7s9m5r1jXkoeQ==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -1644,6 +1644,10 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -1662,6 +1666,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1713,6 +1722,10 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -2097,8 +2110,8 @@ packages: '@codemirror/theme-one-dark@6.1.2': resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} - '@codemirror/view@6.38.7': - resolution: {integrity: sha512-+b0imJTgzehmMToqT9DWPBdeRj7/qDsJj7MzQ+1+do2KK2UkxKuLaHlUVeZk855wO6my6cfbF1c+Qozs8B3YqA==} + '@codemirror/view@6.38.8': + resolution: {integrity: sha512-XcE9fcnkHCbWkjeKyi0lllwXmBLtyYb5dt89dJyx23I9+LSh5vZDIuk7OLG4VM1lgrXZQcY6cxyZyk5WVPRv/A==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -4748,6 +4761,10 @@ packages: resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md + + '@smithy/core@3.18.5': + resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} + engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} @@ -4801,26 +4818,22 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.10': - resolution: {integrity: sha512-SoAag3QnWBFoXjwa1jenEThkzJYClidZUyqsLKwWZ8kOlZBwehrLBp4ygVDjNEM2a2AamCQ2FBA/HuzKJ/LiTA==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.11': resolution: {integrity: sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.11': - resolution: {integrity: sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==} + '@smithy/middleware-endpoint@4.3.12': + resolution: {integrity: sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.12': + resolution: {integrity: sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.4': resolution: {integrity: sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.5': - resolution: {integrity: sha512-La1ldWTJTZ5NqQyPqnCNeH9B+zjFhrNoQIL1jTh4zuqXRlmXhxYHhMtI1/92OlnoAtp6JoN7kzuwhWoXrBwPqg==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.6': resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} engines: {node: '>=18.0.0'} @@ -4877,14 +4890,14 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.6': - resolution: {integrity: sha512-hGz42hggqReicRRZUvrKDQiAmoJnx1Q+XfAJnYAGu544gOfxQCAC3hGGD7+Px2gEUUxB/kKtQV7LOtBRNyxteQ==} - engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.7': resolution: {integrity: sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.9.8': + resolution: {integrity: sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.9.0': resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} engines: {node: '>=18.0.0'} @@ -4974,6 +4987,9 @@ packages: '@ssddanbrown/codemirror-lang-twig@1.0.0': resolution: {integrity: sha512-7WIMIh8Ssc54TooGCY57WU2rKEqZZrcV2tZSVRPtd0gKYsrDEKCSLWpQjUWEx7bdgh3NKHUjq1O4ugIzI/+dwQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@stylistic/eslint-plugin@4.4.1': resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5071,16 +5087,6 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} - - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} @@ -5138,9 +5144,6 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} @@ -5375,9 +5378,6 @@ packages: '@types/jquery@3.5.33': resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -5441,9 +5441,6 @@ packages: '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - '@types/node@20.19.18': - resolution: {integrity: sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg==} - '@types/node@20.19.24': resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} @@ -5610,6 +5607,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.47.0': + resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.47.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.46.4': resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5617,22 +5622,45 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.47.0': + resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.4': resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.47.0': + resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.46.4': resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.47.0': + resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.46.4': resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.47.0': + resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.4': resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5640,16 +5668,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.47.0': + resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.46.4': resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.47.0': + resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.46.4': resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.47.0': + resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.4': resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5657,10 +5702,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.47.0': + resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.46.4': resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.47.0': + resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -5681,68 +5737,64 @@ packages: resolution: {integrity: sha512-ir6xo6HLy3TVn4lVJ+9fOOcq8vvgMmcXoSP/mM+l1CTKKJmd0hzXqNkZ1CYyz7PiRhLPUC6fprmUuA7rnVC87g==} engines: {node: '>=16'} - '@vitest/browser@3.2.4': - resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==} + '@vitest/browser-webdriverio@4.0.10': + resolution: {integrity: sha512-DRaeYGu2hMwJyIaQX8TrYi71HnHWAj8glKhxct7KlZNoR/c+1v9K70Lnm2Y09ChnMFNyiHh9Xlo3DMUNhVMRTw==} peerDependencies: - playwright: '*' - safaridriver: '*' - vitest: 3.2.4 - webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + vitest: 4.0.10 + webdriverio: '*' - '@vitest/coverage-istanbul@3.2.4': - resolution: {integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==} + '@vitest/browser@4.0.10': + resolution: {integrity: sha512-irO+aGxYx/rAhjEBLsGPO4JQ8dA+A43enIST0j4xQ2kYHatHi9tUcxkRRGpClGuUVU42mi+iQsFFzd4xxpoV3g==} peerDependencies: - vitest: 3.2.4 + vitest: 4.0.10 - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-istanbul@4.0.10': + resolution: {integrity: sha512-cLcfuLUK1dpDhpiqe/uMnk3zZDa9/6ujsn4wr29mY1PQ4uKR0eTOtOMH3gdWaMsXZFnLL4HmgA37osB/XOTBKA==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + vitest: 4.0.10 + + '@vitest/coverage-v8@4.0.10': + resolution: {integrity: sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==} + peerDependencies: + '@vitest/browser': 4.0.10 + vitest: 4.0.10 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.10': + resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.0.10': + resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.10': + resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.10': + resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.10': + resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.10': + resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==} - '@vitest/ui@3.2.4': - resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} + '@vitest/ui@4.0.10': + resolution: {integrity: sha512-oWtNM89Np+YsQO3ttT5i1Aer/0xbzQzp66NzuJn/U16bB7MnvSzdLKXgk1kkMLYyKSSzA2ajzqMkYheaE9opuQ==} peerDependencies: - vitest: 3.2.4 + vitest: 4.0.10 - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.10': + resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==} '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -5776,8 +5828,8 @@ packages: '@vue/shared@3.5.14': resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} - '@wdio/config@9.20.0': - resolution: {integrity: sha512-ggwd3EMsVj/LTcbYw2h+hma+/7fQ1cTXMuy9B5WTkLjDlOtbLjsqs9QLt4BLIo1cdsxvAw/UVpRVUuYy7rTmtQ==} + '@wdio/config@9.20.1': + resolution: {integrity: sha512-npl2J+rjCDJPjVySgWpciOyhWddn6s7n5sepKXLR7x1ADQHl5zUFv1dHD3jx4OQ9l6lrGQSPaofuz+7e9mu+vg==} engines: {node: '>=18.20.0'} '@wdio/logger@9.18.0': @@ -5795,8 +5847,8 @@ packages: resolution: {integrity: sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==} engines: {node: '>=18.20.0'} - '@wdio/utils@9.20.0': - resolution: {integrity: sha512-T1ze005kncUTocYImSBQc/FAVcOwP/vOU4MDJFgzz/RTcps600qcKX98sVdWM5/ukXCVkjOufWteDHIbX5/tEA==} + '@wdio/utils@9.20.1': + resolution: {integrity: sha512-C/Gsy5NAatsGUF1eT9Ks/ErR52/X4YI7MSm7BtwNOw8v2Ko+SiCA5qXts61J0A7QYwOn4gfXfBZZnzSAng6G/w==} engines: {node: '>=18.20.0'} '@webassemblyjs/ast@1.14.1': @@ -6048,10 +6100,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -6105,9 +6153,6 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -6154,10 +6199,6 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - ast-metadata-inferer@0.8.1: resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} @@ -6165,8 +6206,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -6447,10 +6488,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -6528,9 +6565,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -6567,10 +6604,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - cheerio-select@1.6.0: resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} @@ -6787,8 +6820,8 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} commander@2.20.3: @@ -7472,10 +7505,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-equal@1.1.2: resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} engines: {node: '>= 0.4'} @@ -7641,9 +7670,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dom-serialize@2.2.1: resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} @@ -7783,8 +7809,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@38.7.0: - resolution: {integrity: sha512-ZHrhfzceUgZwdi6Cd8VS/A10ljIjiHOY5KwZ4iJ5D+JuUYMeS/Uvxbrr1WqjnZUwGe9aUjQHFsxeS3gBWGalOw==} + electron@38.7.1: + resolution: {integrity: sha512-mdFVpL80nZvIvajtl1Xz+2Q/a9tFGVnPO0YW/N+MqQUyZG8D9r3wrWoaEVBXTc1jI+Vkg77Eqqwh5FLiaYRI+A==} engines: {node: '>= 12.20.55'} hasBin: true @@ -8161,8 +8187,8 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} exponential-backoff@3.1.2: @@ -9031,8 +9057,8 @@ packages: i18next-http-backend@3.0.2: resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==} - i18next@25.6.2: - resolution: {integrity: sha512-0GawNyVUw0yvJoOEBq1VHMAsqdM23XrHkMtl2gKEjviJQSLVXsrPqsoYAxBEugW5AB96I2pZkwRxyl8WZVoWdw==} + i18next@25.6.3: + resolution: {integrity: sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -9480,8 +9506,8 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} iterator.prototype@1.1.5: @@ -9883,8 +9909,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.6: - resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} + lint-staged@16.2.7: + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true @@ -10024,9 +10050,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -10056,10 +10079,6 @@ packages: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - macos-alias@0.2.12: resolution: {integrity: sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==} os: [darwin] @@ -10073,8 +10092,11 @@ packages: magic-string@0.30.18: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -10130,6 +10152,11 @@ packages: engines: {node: '>= 20'} hasBin: true + marked@17.0.0: + resolution: {integrity: sha512-KkDYEWEEiYJw/KC+DVm1zzlpMQSMIu6YRltkcCvwheCp8HWPXCk9JwOmHJKBlGfzcpzcIt6x3sMnTsRm/51oDg==} + engines: {node: '>= 20'} + hasBin: true + marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} @@ -10931,8 +10958,8 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - openai@6.9.0: - resolution: {integrity: sha512-n2sJRYmM+xfJ0l3OfH8eNnIyv3nQY7L08gZQu3dw6wSdfPtKAk92L83M2NIP5SS8Cl/bsBBG3yKzEOjkx0O+7A==} + openai@6.9.1: + resolution: {integrity: sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -11205,10 +11232,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pbf@3.3.0: resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} hasBin: true @@ -11268,6 +11291,10 @@ packages: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -12145,10 +12172,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -12327,8 +12350,8 @@ packages: peerDependencies: react: ^19.2.0 - react-i18next@16.3.3: - resolution: {integrity: sha512-IaY2W+ueVd/fe7H6Wj2S4bTuLNChnajFUlZFfCTrTHWzGcOrUHlVzW55oXRSl+J51U8Onn6EvIhQ+Bar9FUcjw==} + react-i18next@16.3.5: + resolution: {integrity: sha512-F7Kglc+T0aE6W2rO5eCAFBEuWRpNb5IFmXOYEgztjZEuiuSLTe/xBIEG6Q3S0fbl8GXMNo+Q7gF8bpokFNWJww==} peerDependencies: i18next: '>= 25.6.2' react: '>= 16.8.0' @@ -12351,9 +12374,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -13125,8 +13145,8 @@ packages: resolution: {integrity: sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA==} engines: {node: '>=20.12.2'} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} slash@3.0.0: @@ -13322,8 +13342,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stickyfill@1.1.1: resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} @@ -13455,9 +13475,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -13717,10 +13734,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -13771,19 +13784,11 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinyqueue@3.0.0: resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} tldts-core@6.1.86: @@ -14006,6 +14011,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + typescript-eslint@8.47.0: + resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} @@ -14290,11 +14302,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-dts@4.5.4: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: @@ -14361,16 +14368,18 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.10: + resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.10 + '@vitest/browser-preview': 4.0.10 + '@vitest/browser-webdriverio': 4.0.10 + '@vitest/ui': 4.0.10 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -14380,7 +14389,11 @@ packages: optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -14463,12 +14476,12 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webdriver@9.20.0: - resolution: {integrity: sha512-Kk+AGV1xWLNHVpzUynQJDULMzbcO3IjXo3s0BzfC30OpGxhpaNmoazMQodhtv0Lp242Mb1VYXD89dCb4oAHc4w==} + webdriver@9.20.1: + resolution: {integrity: sha512-QtvYqPai2NOnq7qePPH6kNSwk7+tnmSvnlOnY8dIT/Y24TPdQp44NjF/BUYAWIlqoBlZqHClQFTSVwT2qvO2Tw==} engines: {node: '>=18.20.0'} - webdriverio@9.20.0: - resolution: {integrity: sha512-cqaXfahTzCFaQLlk++feZaze6tAsW8OSdaVRgmOGJRII1z2A4uh4YGHtusTpqOiZAST7OBPqycOwfh01G/Ktbg==} + webdriverio@9.20.1: + resolution: {integrity: sha512-QVM/asb5sDESz37ow/BAOA0z2HtUJsuAjPKHdw+Vx92PaQP3EfHwTgxK2T5rgwa0WRNh+c+n/0nEqIvqBl01sA==} engines: {node: '>=18.20.0'} peerDependencies: puppeteer-core: '>=22.x || <=24.x' @@ -14899,7 +14912,7 @@ snapshots: '@antfu/utils@9.2.0': {} - '@anthropic-ai/sdk@0.69.0(zod@4.1.12)': + '@anthropic-ai/sdk@0.70.0(zod@4.1.12)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: @@ -14985,7 +14998,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -14993,14 +15006,14 @@ snapshots: '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.3.10 - '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 '@smithy/middleware-serde': 4.2.4 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 @@ -15034,19 +15047,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/fetch-http-handler': 5.3.6 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.3.10 - '@smithy/middleware-retry': 4.4.11 - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.5 '@smithy/util-base64': 4.3.0 @@ -15066,12 +15079,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/node-config-provider': 4.3.5 '@smithy/property-provider': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -15096,7 +15109,7 @@ snapshots: '@smithy/node-http-handler': 4.4.5 '@smithy/property-provider': 4.2.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/util-stream': 4.5.6 tslib: 2.8.1 @@ -15208,7 +15221,7 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 tslib: 2.8.1 @@ -15228,19 +15241,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/fetch-http-handler': 5.3.6 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.3.10 - '@smithy/middleware-retry': 4.4.11 - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.5 '@smithy/util-base64': 4.3.0 @@ -15393,6 +15406,8 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helpers@7.27.6': @@ -15408,6 +15423,10 @@ snapshots: dependencies: '@babel/types': 7.28.4 + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -15490,6 +15509,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@6.0.2': {} @@ -15979,8 +16003,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -16540,7 +16562,7 @@ snapshots: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) '@ckeditor/ckeditor5-source-editing@47.2.0': @@ -16726,21 +16748,21 @@ snapshots: dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@codemirror/commands@6.10.0': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@codemirror/commands@6.8.1': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@codemirror/lang-css@6.3.1': @@ -16758,7 +16780,7 @@ snapshots: '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/css': 1.1.11 '@lezer/html': 1.3.12 @@ -16769,7 +16791,7 @@ snapshots: '@codemirror/language': 6.11.0 '@codemirror/lint': 6.8.5 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/javascript': 1.5.1 @@ -16784,7 +16806,7 @@ snapshots: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/markdown': 1.4.3 @@ -16794,7 +16816,7 @@ snapshots: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/markdown': 1.4.3 @@ -16820,14 +16842,14 @@ snapshots: '@codemirror/autocomplete': 6.18.6 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/xml': 1.0.6 '@codemirror/language@6.11.0': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 @@ -16840,13 +16862,13 @@ snapshots: '@codemirror/lint@6.8.5': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 crelt: 1.0.6 '@codemirror/search@6.5.11': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 crelt: 1.0.6 '@codemirror/state@6.5.2': @@ -16857,10 +16879,10 @@ snapshots: dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@codemirror/view@6.38.7': + '@codemirror/view@6.38.8': dependencies: '@codemirror/state': 6.5.2 crelt: 1.0.6 @@ -17309,9 +17331,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/remote@2.1.3(electron@38.7.0)': + '@electron/remote@2.1.3(electron@38.7.1)': dependencies: - electron: 38.7.0 + electron: 38.7.1 '@electron/universal@2.0.2': dependencies: @@ -17769,172 +17791,172 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@fsegurai/codemirror-theme-abcdef@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-abcdef@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-abyss@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-abyss@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-android-studio@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-android-studio@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-andromeda@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-andromeda@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-basic-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-basic-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-basic-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-basic-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-cobalt2@6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-cobalt2@6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-forest@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-forest@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-github-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-github-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-github-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-github-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-gruvbox-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-gruvbox-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-gruvbox-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-gruvbox-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-material-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-material-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-material-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-material-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-monokai@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-monokai@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-nord@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-nord@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-palenight@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-palenight@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-solarized-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-solarized-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-solarized-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-solarized-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-tokyo-night-day@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-tokyo-night-day@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-volcano@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-volcano@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.1 '@fullcalendar/core@6.1.19': @@ -19370,29 +19392,29 @@ snapshots: transitivePeerDependencies: - ajv - '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)': + '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 - '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2)': + '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2)': dependencies: '@codemirror/autocomplete': 6.18.6 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.10.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.7)': + '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.10.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)': dependencies: '@codemirror/commands': 6.10.0 '@codemirror/language': 6.11.0 '@codemirror/search': 6.5.11 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.7 + '@codemirror/view': 6.38.8 '@rolldown/binding-android-arm64@1.0.0-beta.29': optional: true @@ -19456,7 +19478,7 @@ snapshots: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: rollup: 4.40.0 @@ -19767,9 +19789,9 @@ snapshots: '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 - '@smithy/core@3.18.3': + '@smithy/core@3.18.4': dependencies: - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-serde': 4.2.6 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 '@smithy/util-base64': 4.3.0 @@ -19780,7 +19802,7 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.18.4': + '@smithy/core@3.18.5': dependencies: '@smithy/middleware-serde': 4.2.6 '@smithy/protocol-http': 5.3.5 @@ -19873,17 +19895,6 @@ snapshots: '@smithy/types': 4.9.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.10': - dependencies: - '@smithy/core': 3.18.3 - '@smithy/middleware-serde': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 - '@smithy/util-middleware': 4.2.5 - tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.11': dependencies: '@smithy/core': 3.18.4 @@ -19895,12 +19906,23 @@ snapshots: '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.11': + '@smithy/middleware-endpoint@4.3.12': + dependencies: + '@smithy/core': 3.18.5 + '@smithy/middleware-serde': 4.2.6 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.12': dependencies: '@smithy/node-config-provider': 4.3.5 '@smithy/protocol-http': 5.3.5 '@smithy/service-error-classification': 4.2.5 - '@smithy/smithy-client': 4.9.7 + '@smithy/smithy-client': 4.9.8 '@smithy/types': 4.9.0 '@smithy/util-middleware': 4.2.5 '@smithy/util-retry': 4.2.5 @@ -19913,12 +19935,6 @@ snapshots: '@smithy/types': 4.9.0 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.5': - dependencies: - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 - '@smithy/middleware-serde@4.2.6': dependencies: '@smithy/protocol-http': 5.3.5 @@ -20005,20 +20021,20 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.9.6': + '@smithy/smithy-client@4.9.7': dependencies: - '@smithy/core': 3.18.3 - '@smithy/middleware-endpoint': 4.3.10 + '@smithy/core': 3.18.4 + '@smithy/middleware-endpoint': 4.3.11 '@smithy/middleware-stack': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 '@smithy/util-stream': 4.5.6 tslib: 2.8.1 - '@smithy/smithy-client@4.9.7': + '@smithy/smithy-client@4.9.8': dependencies: - '@smithy/core': 3.18.4 - '@smithy/middleware-endpoint': 4.3.11 + '@smithy/core': 3.18.5 + '@smithy/middleware-endpoint': 4.3.12 '@smithy/middleware-stack': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 @@ -20072,7 +20088,7 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 bowser: 2.11.0 tslib: 2.8.1 @@ -20083,7 +20099,7 @@ snapshots: '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.3.5 '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 tslib: 2.8.1 @@ -20147,6 +20163,8 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 + '@standard-schema/spec@1.0.0': {} + '@stylistic/eslint-plugin@4.4.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) @@ -20235,21 +20253,6 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@testing-library/dom@10.4.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.3(supports-color@6.0.0) @@ -20301,8 +20304,6 @@ snapshots: '@types/argparse@1.0.38': {} - '@types/aria-query@5.0.4': {} - '@types/better-sqlite3@7.6.13': dependencies: '@types/node': 22.18.8 @@ -20598,8 +20599,6 @@ snapshots: dependencies: '@types/sizzle': 2.3.9 - '@types/js-yaml@4.0.9': {} - '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4': @@ -20666,10 +20665,6 @@ snapshots: '@types/node@16.9.1': {} - '@types/node@20.19.18': - dependencies: - undici-types: 6.21.0 - '@types/node@20.19.24': dependencies: undici-types: 6.21.0 @@ -20863,6 +20858,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 + eslint: 9.39.1(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.4 @@ -20875,6 +20887,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) @@ -20884,15 +20908,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + debug: 4.4.3(supports-color@6.0.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.46.4': dependencies: '@typescript-eslint/types': 8.46.4 '@typescript-eslint/visitor-keys': 8.46.4 + '@typescript-eslint/scope-manager@8.47.0': + dependencies: + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.4 @@ -20905,8 +20947,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.46.4': {} + '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) @@ -20923,6 +20979,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 + debug: 4.4.3(supports-color@6.0.0) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -20934,11 +21006,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.46.4': dependencies: '@typescript-eslint/types': 8.46.4 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.47.0': + dependencies: + '@typescript-eslint/types': 8.47.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@uploadcare/cname-prefix@6.17.0': {} @@ -20972,27 +21060,35 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 - magic-string: 0.30.18 - sirv: 3.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) - optionalDependencies: - playwright: 1.56.1 - webdriverio: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + webdriverio: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4)': + '@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)': + dependencies: + '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 4.0.10 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-istanbul@4.0.10(vitest@4.0.10)': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3(supports-color@6.0.0) @@ -21000,88 +21096,82 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magicast: 0.3.5 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + istanbul-reports: 3.2.0 + magicast: 0.5.1 + tinyrainbow: 3.0.3 + vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4)': + '@vitest/coverage-v8@4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 + '@vitest/utils': 4.0.10 + ast-v8-to-istanbul: 0.3.8 debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.18 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + istanbul-reports: 3.2.0 + magicast: 0.5.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/expect@4.0.10': dependencies: + '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.10 estree-walker: 3.0.3 - magic-string: 0.30.18 + magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.1)(typescript@5.9.3) vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.10': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.10': dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.0.0 - - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.18 + '@vitest/utils': 4.0.10 pathe: 2.0.3 - '@vitest/spy@3.2.4': + '@vitest/snapshot@4.0.10': dependencies: - tinyspy: 4.0.3 + '@vitest/pretty-format': 4.0.10 + magic-string: 0.30.21 + pathe: 2.0.3 - '@vitest/ui@3.2.4(vitest@3.2.4)': + '@vitest/spy@4.0.10': {} + + '@vitest/ui@4.0.10(vitest@4.0.10)': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.10 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 - sirv: 3.0.1 + sirv: 3.0.2 tinyglobby: 0.2.15 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.10': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.10 + tinyrainbow: 3.0.3 '@volar/language-core@2.4.13': dependencies: @@ -21130,15 +21220,14 @@ snapshots: '@vue/shared@3.5.14': {} - '@wdio/config@9.20.0': + '@wdio/config@9.20.1': dependencies: '@wdio/logger': 9.18.0 '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 + '@wdio/utils': 9.20.1 deepmerge-ts: 7.1.5 glob: 10.4.5 import-meta-resolve: 4.2.0 - jiti: 2.6.1 transitivePeerDependencies: - bare-buffer - supports-color @@ -21161,7 +21250,7 @@ snapshots: dependencies: '@types/node': 20.19.24 - '@wdio/utils@9.20.0': + '@wdio/utils@9.20.1': dependencies: '@puppeteer/browsers': 2.10.10 '@wdio/logger': 9.18.0 @@ -21428,8 +21517,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.3: {} ansis@4.2.0: @@ -21500,10 +21587,6 @@ snapshots: dependencies: tslib: 2.8.1 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -21580,8 +21663,6 @@ snapshots: asap@2.0.6: {} - assertion-error@2.0.1: {} - ast-metadata-inferer@0.8.1: dependencies: '@mdn/browser-compat-data': 5.7.6 @@ -21590,7 +21671,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@0.3.8: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -21895,8 +21976,6 @@ snapshots: bytes@3.1.2: {} - cac@6.7.14: {} - cacache@15.3.0: dependencies: '@npmcli/fs': 1.1.1 @@ -22035,13 +22114,7 @@ snapshots: ccount@2.0.1: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 + chai@6.2.1: {} chalk@2.4.2: dependencies: @@ -22073,8 +22146,6 @@ snapshots: chardet@2.1.1: {} - check-error@2.1.1: {} - cheerio-select@1.6.0: dependencies: css-select: 4.3.0 @@ -22423,7 +22494,7 @@ snapshots: commander@12.1.0: {} - commander@14.0.1: {} + commander@14.0.2: {} commander@2.20.3: {} @@ -23243,8 +23314,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@5.0.2: {} - deep-equal@1.1.2: dependencies: is-arguments: 1.2.0 @@ -23394,8 +23463,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} - dom-serialize@2.2.1: dependencies: custom-event: 1.0.1 @@ -23619,7 +23686,7 @@ snapshots: - supports-color optional: true - electron@38.7.0: + electron@38.7.1: dependencies: '@electron/get': 2.0.3 '@types/node': 22.18.13 @@ -24259,7 +24326,7 @@ snapshots: expand-template@2.0.3: {} - expect-type@1.2.1: {} + expect-type@1.2.2: {} exponential-backoff@3.1.2: {} @@ -25440,7 +25507,7 @@ snapshots: transitivePeerDependencies: - encoding - i18next@25.6.2(typescript@5.9.3): + i18next@25.6.3(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 optionalDependencies: @@ -25820,7 +25887,7 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -26292,9 +26359,9 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.2.6: + lint-staged@16.2.7: dependencies: - commander: 14.0.1 + commander: 14.0.2 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 @@ -26448,8 +26515,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.4: {} - lowercase-keys@2.0.0: {} lru-cache@10.4.3: {} @@ -26470,8 +26535,6 @@ snapshots: luxon@3.6.1: {} - lz-string@1.5.0: {} - macos-alias@0.2.12: dependencies: nan: 2.22.2 @@ -26489,10 +26552,14 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magic-string@0.30.21: dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.1: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 source-map-js: 1.2.1 make-dir@2.1.0: @@ -26636,6 +26703,8 @@ snapshots: marked@16.4.2: {} + marked@17.0.0: {} + marked@4.3.0: {} matcher@3.0.0: @@ -27732,7 +27801,7 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - openai@6.9.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12): + openai@6.9.1(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12): optionalDependencies: ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) zod: 4.1.12 @@ -28021,8 +28090,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pbf@3.3.0: dependencies: ieee754: 1.2.1 @@ -28067,6 +28134,10 @@ snapshots: dependencies: pngjs: 6.0.0 + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -28921,12 +28992,6 @@ snapshots: prelude-ls@1.2.1: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - prismjs@1.30.0: {} proc-log@2.0.1: {} @@ -29111,11 +29176,11 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-i18next@16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + react-i18next@16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.6.2(typescript@5.9.3) + i18next: 25.6.3(typescript@5.9.3) react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: @@ -29131,8 +29196,6 @@ snapshots: react-is@16.13.1: {} - react-is@17.0.2: {} - react-refresh@0.18.0: {} react-remove-scroll-bar@2.3.8(@types/react@19.1.7)(react@19.2.0): @@ -30138,7 +30201,7 @@ snapshots: simple-xml-to-json@1.2.3: {} - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -30373,7 +30436,7 @@ snapshots: statuses@2.0.2: {} - std-env@3.9.0: {} + std-env@3.10.0: {} stickyfill@1.1.1: {} @@ -30532,10 +30595,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -30979,12 +31038,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -31031,13 +31084,9 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - tinyqueue@3.0.0: {} - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.0.3: {} tldts-core@6.1.86: optional: true @@ -31315,6 +31364,17 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.0.4: {} typescript@5.4.5: {} @@ -31566,27 +31626,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@6.0.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-plugin-dts@4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@24.10.1) @@ -31597,7 +31636,7 @@ snapshots: debug: 4.4.3(supports-color@6.0.0) kolorist: 1.8.0 local-pkg: 1.1.1 - magic-string: 0.30.17 + magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -31650,36 +31689,33 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 + '@vitest/expect': 4.0.10 + '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.10 + '@vitest/runner': 4.0.10 + '@vitest/snapshot': 4.0.10 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 debug: 4.4.3(supports-color@6.0.0) - expect-type: 1.2.1 - magic-string: 0.30.18 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.1 - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) - '@vitest/ui': 3.2.4(vitest@3.2.4) + '@vitest/browser-webdriverio': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/ui': 4.0.10(vitest@4.0.10) happy-dom: 20.0.10 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: @@ -31769,15 +31805,15 @@ snapshots: web-streams-polyfill@3.3.3: {} - webdriver@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriver@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 20.19.24 '@types/ws': 8.18.1 - '@wdio/config': 9.20.0 + '@wdio/config': 9.20.1 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 + '@wdio/utils': 9.20.1 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 undici: 6.21.3 @@ -31788,16 +31824,16 @@ snapshots: - supports-color - utf-8-validate - webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - '@types/node': 20.19.18 + '@types/node': 20.19.24 '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 9.20.0 + '@wdio/config': 9.20.1 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 '@wdio/repl': 9.16.2 '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 + '@wdio/utils': 9.20.1 archiver: 7.0.1 aria-query: 5.3.2 cheerio: 1.1.2 @@ -31814,7 +31850,7 @@ snapshots: rgb2hex: 0.2.5 serialize-error: 12.0.0 urlpattern-polyfill: 10.1.0 - webdriver: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + webdriver: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bare-buffer - bufferutil