diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index 5c99c305..f0c943ba 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -94,7 +94,7 @@ "@tauri-apps/plugin-shell": "~2.3.4", "@tauri-apps/plugin-updater": "^2.9.0", "@tauri-apps/plugin-websocket": "~2.4.2", - "@zip.js/zip.js": "^2.7.53", + "@zip.js/zip.js": "^2.8.16", "abortcontroller-polyfill": "^1.7.8", "ai": "^6.0.47", "ai-sdk-ollama": "^3.2.0", diff --git a/apps/readest-app/src/app/reader/components/BooksGrid.tsx b/apps/readest-app/src/app/reader/components/BooksGrid.tsx index 924adde8..6ead4d83 100644 --- a/apps/readest-app/src/app/reader/components/BooksGrid.tsx +++ b/apps/readest-app/src/app/reader/components/BooksGrid.tsx @@ -210,7 +210,7 @@ const BooksGrid: React.FC = ({ bookKeys, onCloseBook }) => { {showFooter && ( = ({ bookKey, - toc, + sections, horizontalGap, contentInsets, gridInsets, @@ -53,18 +53,18 @@ const ProgressInfoView: React.FC = ({ const progressInfo = formatProgress(pageInfo?.current, pageInfo?.total, template, localize, lang); const activeHref = useMemo(() => progress?.sectionHref || null, [progress?.sectionHref]); - const activeTOCItem = useMemo(() => { + const activeSection = useMemo(() => { if (!activeHref) return null; - for (const item of toc) { - if (item.href === activeHref) return item; - const subitem = item.subitems?.find((sub) => sub.href === activeHref); - if (subitem) return subitem; + for (const section of sections) { + if (section.id === activeHref) return section; + const subitem = section.subitems?.find((sub) => sub.id === activeHref); + if (subitem) return section; } return null; - }, [activeHref, toc]); + }, [activeHref, sections]); const current = pageInfo?.current || 0; - const total = activeTOCItem?.location ? activeTOCItem.location.next : pageInfo?.total || 0; + const total = activeSection?.location ? activeSection.location.next : pageInfo?.total || 0; const pages = Math.max(total - current, 0); const timeLeft = total - 1 >= current diff --git a/apps/readest-app/src/app/reader/components/sidebar/TOCItem.tsx b/apps/readest-app/src/app/reader/components/sidebar/TOCItem.tsx index ee939e8a..83b65d14 100644 --- a/apps/readest-app/src/app/reader/components/sidebar/TOCItem.tsx +++ b/apps/readest-app/src/app/reader/components/sidebar/TOCItem.tsx @@ -101,9 +101,9 @@ const TOCItemView = React.memo<{ > {item.label} - {item.location && ( + {(item.location || item.index !== undefined) && (
- {item.location.current + 1} + {item.location ? item.location.current + 1 : item.index + 1}
)} diff --git a/apps/readest-app/src/components/command-palette/CommandPalette.tsx b/apps/readest-app/src/components/command-palette/CommandPalette.tsx index cebeac72..b47c041b 100644 --- a/apps/readest-app/src/components/command-palette/CommandPalette.tsx +++ b/apps/readest-app/src/components/command-palette/CommandPalette.tsx @@ -131,7 +131,7 @@ const CommandPalette: React.FC = () => { > {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
{ return findTocItemBS(item.subitems, cfi); }; +// Helper: Calculate cumulative sizes for sections +const calculateCumulativeSizes = (sections: SectionItem[]): number[] => { + const sizes = sections.map((s) => (s.linear !== 'no' && s.size > 0 ? s.size : 0)); + let cumulative = 0; + return sizes.reduce((acc: number[], size) => { + acc.push(cumulative); + cumulative += size; + return acc; + }, []); +}; + +// Helper: Process subitems recursively to assign locations +const processSubitemLocations = ( + subitems: SectionItem[], + parentByteOffset: number, + parentLocation: { current: number; next: number; total: number }, + totalLocations: number, +) => { + let currentByteOffset = parentByteOffset; + + subitems.forEach((subitem, index) => { + const nextSubitem = index < subitems.length - 1 ? subitems[index + 1] : null; + + currentByteOffset += subitem.size || 0; + const nextByteOffset = nextSubitem + ? currentByteOffset + (nextSubitem.size || 0) + : parentLocation.next * SIZE_PER_LOC; + + subitem.location = { + current: Math.floor(currentByteOffset / SIZE_PER_LOC), + next: Math.floor(nextByteOffset / SIZE_PER_LOC), + total: totalLocations, + }; + + if (subitem.subitems?.length) { + processSubitemLocations( + subitem.subitems, + currentByteOffset, + subitem.location, + totalLocations, + ); + } + }); +}; + +const updateSectionLocations = ( + sections: SectionItem[], + cumulativeSizes: number[], + sizes: number[], + totalLocations: number, +) => { + sections.forEach((section, index) => { + const baseOffset = cumulativeSizes[index]!; + const sectionSize = sizes[index]!; + + section.location = { + current: Math.floor(baseOffset / SIZE_PER_LOC), + next: Math.floor((baseOffset + sectionSize) / SIZE_PER_LOC), + total: totalLocations, + }; + + if (section.subitems?.length) { + processSubitemLocations(section.subitems, baseOffset, section.location, totalLocations); + } + }); +}; + +// Helper: Recursively add subitems to sections map +const addSubitemsToMap = (subitems: SectionItem[], map: Record) => { + for (const subitem of subitems) { + if (subitem.href) map[subitem.href] = subitem; + if (subitem.subitems?.length) addSubitemsToMap(subitem.subitems, map); + } +}; + +// Helper: Create sections lookup map including all subitems +type Href = string; +type SectionsMap = Record; +const createSectionsMap = (sections: SectionItem[]) => { + const map: SectionsMap = {}; + + for (const section of sections) { + map[section.id] = section; + if (section.subitems?.length) addSubitemsToMap(section.subitems, map); + } + + return map; +}; + +// Main: Update TOC with section locations and metadata export const updateToc = async ( bookDoc: BookDoc, sortedTOC: boolean, convertChineseVariant: ConvertChineseVariant, ) => { - const items = bookDoc?.toc || []; - if (!items.length) return; + if (bookDoc.rendition?.layout === 'pre-paginated') return; + const items = bookDoc?.toc || []; + const sections = bookDoc?.sections || []; + if (!items.length || !sections.length) return; + + // Step 1: Apply Chinese variant conversion if needed if (convertChineseVariant && convertChineseVariant !== 'none') { await initSimpleCC(); convertTocLabels(items, convertChineseVariant); } - const sections = bookDoc?.sections || []; - if (!sections.length) return; - - const sizes = sections.map((s) => (s.linear != 'no' && s.size > 0 ? s.size : 0)); - let cumulativeSize = 0; - const cumulativeSizes = sizes.reduce((acc: number[], size) => { - acc.push(cumulativeSize); - cumulativeSize += size; - return acc; - }, []); - const totalSize = cumulativeSizes[cumulativeSizes.length - 1] || 0; + // Step 2: Calculate section sizes and locations + const sizes = sections.map((s) => (s.linear !== 'no' && s.size > 0 ? s.size : 0)); + const cumulativeSizes = calculateCumulativeSizes(sections); + const totalSize = cumulativeSizes[cumulativeSizes.length - 1]! + sizes[sizes.length - 1]!; const totalLocations = Math.floor(totalSize / SIZE_PER_LOC); - sections.forEach((section, index) => { - section.location = { - current: Math.floor(cumulativeSizes[index]! / SIZE_PER_LOC), - next: Math.floor((cumulativeSizes[index]! + sizes[index]!) / SIZE_PER_LOC), - total: totalLocations, - }; - const subitems = section.subitems || []; - subitems.forEach((subitem, subitemIndex) => { - subitem.location = { - current: Math.floor( - (cumulativeSizes[index]! + - subitems.slice(0, subitemIndex).reduce((sum, t) => sum + (t.size || 0), 0)) / - SIZE_PER_LOC, - ), - next: Math.floor( - (cumulativeSizes[index]! + - subitems.slice(0, subitemIndex + 1).reduce((sum, t) => sum + (t.size || 0), 0)) / - SIZE_PER_LOC, - ), - total: totalLocations, - }; - }); - }); - const sectionsMap = sections.reduce((map: Record, section) => { - map[section.id] = section; - section.subitems?.forEach((subitem) => { - if (subitem.href) { - map[subitem.href] = subitem; - } - }); - return map; - }, {}); + // Step 3: Update locations to sections and subitems + updateSectionLocations(sections, cumulativeSizes, sizes, totalLocations); - updateTocData(bookDoc, items, sections, sectionsMap); + // Step 4: Create sections map and update TOC locations + const sectionsMap = createSectionsMap(sections); + updateTocLocation(bookDoc, items, sections, sectionsMap); - if (sortedTOC) { - sortTocItems(items); - } + // Step 5: Sort TOC if requested + if (sortedTOC) sortTocItems(items); }; const convertTocLabels = (items: TOCItem[], convertChineseVariant: ConvertChineseVariant) => { @@ -123,11 +181,11 @@ const convertTocLabels = (items: TOCItem[], convertChineseVariant: ConvertChines }); }; -const updateTocData = ( +const updateTocLocation = ( bookDoc: BookDoc, items: TOCItem[], sections: SectionItem[], - sectionsMap: { [id: string]: SectionItem }, + sectionsMap: SectionsMap, index = 0, ): number => { items.forEach((item) => { @@ -137,13 +195,18 @@ const updateTocData = ( const section = sectionsMap[item.href] || sectionsMap[id]; if (section) { item.cfi = section.cfi; - if (id === item.href || items.length <= sections.length || item.href === section.href) { + if ( + id === item.href || + items.length <= sections.length || + item.href === section.href || + item.href === section.id + ) { item.location = section.location; } } } if (item.subitems) { - index = updateTocData(bookDoc, item.subitems, sections, sectionsMap, index); + index = updateTocLocation(bookDoc, item.subitems, sections, sectionsMap, index); } }); return index; diff --git a/packages/foliate-js b/packages/foliate-js index 245d64e6..8a1e7e7a 160000 --- a/packages/foliate-js +++ b/packages/foliate-js @@ -1 +1 @@ -Subproject commit 245d64e653423ebd63b55ba3c7d1c1a7cf69933b +Subproject commit 8a1e7e7a9cb0bb4178b194fe9af1a806ca99459d diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5567c3f8..c27b6a01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,8 +174,8 @@ importers: specifier: ~2.4.2 version: 2.4.2 '@zip.js/zip.js': - specifier: ^2.7.53 - version: 2.8.15 + specifier: ^2.8.16 + version: 2.8.16 abortcontroller-polyfill: specifier: ^1.7.8 version: 1.7.8 @@ -625,24 +625,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.40.0': resolution: {integrity: sha512-MS9qalLRjUnF2PCzuTKTvCMVSORYHxxe3Qa0+SSaVULsXRBmuy5C/b1FeWwMFnwNnC0uie3VDet31Zujwi8q6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.40.0': resolution: {integrity: sha512-BeHZVMNXhM3WV3XE2yghO0fRxhMOt8BTN972p5piYEQUvKeSHmS8oeGcs6Ahgx5znBclqqqq37ZfioYANiTqJA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.40.0': resolution: {integrity: sha512-rG1YujF7O+lszX8fd5u6qkFTuv4FwHXjWvt1CCvCxXwQLSY96LaCW88oVKg7WoEYQh54y++Fk57F+Wh9Gv9nVQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.40.0': resolution: {integrity: sha512-9SqmnQqd4zTEUk6yx0TuW2ycZZs2+e569O/R0QnhSiQNpgwiJCYOe/yPS0BC9HkiaozQm6jjAcasWpFtz/dp+w==} @@ -1778,89 +1782,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1947,30 +1967,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-arm64-musl@0.1.88': resolution: {integrity: sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@napi-rs/canvas-linux-riscv64-gnu@0.1.88': resolution: {integrity: sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-gnu@0.1.88': resolution: {integrity: sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-musl@0.1.88': resolution: {integrity: sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@napi-rs/canvas-win32-arm64-msvc@0.1.88': resolution: {integrity: sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA==} @@ -2017,24 +2042,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.6': resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.6': resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.6': resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.6': resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} @@ -2729,66 +2758,79 @@ packages: resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.56.0': resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.56.0': resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.56.0': resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.56.0': resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.56.0': resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.56.0': resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.56.0': resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.56.0': resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.56.0': resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.56.0': resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.56.0': resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.56.0': resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.56.0': resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==} @@ -3342,30 +3384,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.9.6': resolution: {integrity: sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': resolution: {integrity: sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-gnu@2.9.6': resolution: {integrity: sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.9.6': resolution: {integrity: sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.9.6': resolution: {integrity: sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==} @@ -3786,41 +3833,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -3936,6 +3991,10 @@ packages: resolution: {integrity: sha512-HZKJLFe4eGVgCe9J87PnijY7T1Zn638bEHS+Fm/ygHZozRpefzWcOYfPaP52S8pqk9g4xN3+LzMDl3Lv9dLglA==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + '@zip.js/zip.js@2.8.16': + resolution: {integrity: sha512-kCjaXh50GCf9afcof6ekjXPKR//rBVIxNHJLSUaM3VAET2F0+hymgrK1GpInRIIFUpt+wsnUfgx2+bbrmc+7Tw==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + a-sync-waterfall@1.0.1: resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} @@ -12308,6 +12367,8 @@ snapshots: '@zip.js/zip.js@2.8.15': {} + '@zip.js/zip.js@2.8.16': {} + a-sync-waterfall@1.0.1: {} abort-controller@3.0.0: